MySQL数据库迁移至KWDB的完整实践指南

作者:江湖有缘

原文链接:blog.csdn.net/jks212454/a...

前言

随着企业业务的不断发展和数据量的持续增长,传统单机数据库在高并发、大数据量场景下逐渐暴露出性能瓶颈。分布式数据库作为新一代数据库技术,凭借其良好的扩展性、高可用性和高性能,正逐步成为企业数字化转型的重要支撑。KaiwuDB(KWDB) 作为一款高性能、强兼容的国产分布式数据库,原生支持多模数据处理,具备对 MySQL 等主流数据库的良好兼容能力。本文基于 KaiwuDB DataX Utils 工具,详细记录了从 MySQL 向 KaiwuDB 进行异构数据迁移的完整实践过程,旨在验证 KaiwuDB 在实际迁移场景中的稳定性与高效性,并为企业未来数据库选型与平滑迁移提供参考依据。

一、相关介绍

1.1 KWDB介绍

KWDB简介

KWDB 是一款面向 AIoT 场景的分布式、多模融合数据库产品。 支持在同一个实例中建立时序库和关系库,并统一处理多种类型的数据,具备对海量时序数据的高效读写与分析能力。 产品具备高可用、安全稳定、易运维等特性,广泛应用于工业物联网、数字能源、车联网、智慧矿山等多个行业领域,为用户提供一站式数据存储、管理与分析的基础平台。

主要特点

  • 高性能处理能力:支持海量时序数据高速读写,提供插值查询、数学函数等丰富的时序特色功能,提升应用效率。

  • 低运管成本:统一存储与管理多模数据,一套系统满足跨业务、跨部门数据融合需求,降低企业IT与运维投入。

  • 低存储成本:支持 5-30 倍数据压缩比,结合数据生命周期管理策略,灵活控制数据保留时间,显著节省存储资源。

  • 高安全性:提供数据库审计与加密机制,保障数据在复杂业务场景下的安全稳定运行。

  • 易用性强:提供标准 SQL 接口、高速写入、极速查询、集群部署等能力,与第三方工具无缝集成,开发运维更便捷。

1.2 MySQL数据库介绍

MySQL 数据库简介

MySQL 是一种开源的关系型数据库管理系统(RDBMS),广泛用于 Web 应用程序的数据存储和管理。它由瑞典公司 MySQL AB 开发,目前由 Oracle 公司维护和开发。MySQL 以其高性能、可靠性和易用性著称,支持多种操作系统,包括 Linux、Windows 和 macOS。

MySQL主要特点

MySQL 支持多用户访问,允许多个用户同时连接和操作数据库。它使用 SQL(结构化查询语言)进行数据管理,支持复杂的数据查询和操作。MySQL 提供了丰富的存储引擎,如 InnoDB、MyISAM 等,用户可以根据需求选择合适的存储引擎。

1.3 KaiwuDB DataX Utils插件介绍

KaiwuDB DataX Utils简介

KaiwuDB DataX Utils 是基于广受欢迎的离线数据同步工具 DataX 开发的一款数据库迁移工具。它专为 KaiwuDB(要求版本2.0.3及以上)设计,支持与多种主流数据库之间的离线数据同步功能。通过 KaiwuDB DataX Utils,用户可以轻松实现 KaiwuDB 与其他数据库如 MySQL、TDengine、MongoDB、InfluxDB、OpenTSDB、Oracle、PostgreSQL、ClickHouse 以及不同版本的 KaiwuDB(包括1.2.x和2.x版本)之间的数据迁移。此工具极大地简化了数据迁移过程,为用户提供了一个高效、便捷的数据同步解决方案。

支持的迁移形式

二、环境介绍

2.1 KWDB部署环境要求

KWDB数据库的硬件规格要求如下:

2.2 实践环境规划

本次实践为个人测试环境,实践环境规划如下所示:

2.3 迁移环境要求

在迁移服务器上,环境要求如下:

三、迁移环境准备工作

3.1 安装openJDK

备注:迁移环境准备工作,在迁移服务器上进行操作。

执行以下命令,安装openJDK。

bash 复制代码
yum install java-1.8.0-openjdk-devel -y

检查openJDK版本,可以看到我们安装的版本为1.8.0_432。

bash 复制代码
[root@openEuler ~]# java -version
openjdk version "1.8.0_432"
OpenJDK Runtime Environment BiSheng (build 1.8.0_432-b06)
OpenJDK 64-Bit Server VM BiSheng (build 25.432-b06, mixed mode)

3.2 安装 Python

执行以下命令,安装 Python。

bash 复制代码
yum  install python3 -y

检查python安装版本,当前版本为3.11.6

bash 复制代码
[root@openEuler ~]# python3 -V
Python 3.11.6

3.3 安装maven

执行以下命令,安装maven。

bash 复制代码
yum install maven -y

检查maven版本,可以看到安装版本为3.6.3。

bash 复制代码
[root@openEuler ~]# mvn -v
Apache Maven 3.6.3 (openEuler 3.6.3-2)
Maven home: /usr/share/maven
Java version: 1.8.0_432, vendor: BiSheng, runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.432.b06-0.oe2403.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "6.6.0-85.0.0.79.oe2403.x86_64", arch: "amd64", family: "unix"

3.4 安装DataX

DataX 是一款广泛使用的离线数据同步工具。KaiwuDB 基于 DataX 开发了数据库迁移工具 KaiwuDB DataX Utils,实现 KaiwuDB(2.0.3 及以上版本)与 MySQL、TDengine、MongoDB、InfluxDB、OpenTSDB、Oracle、PostgreSQL、ClickHouse、KaiwuDB(1.2.x)、KaiwuDB(2.x)等数据库的离线数据同步。

bash 复制代码
wget https://datax-opensource.oss-cn-hangzhou.aliyuncs.com/202309/datax.tar.gz

解压软件包

bash 复制代码
tar -xzf datax.tar.gz

进入软件目录后,进入bin目录,即可运行同步作业:

bash 复制代码
[root@openEuler ~]# cd datax/
[root@openEuler datax]# ls
bin  conf  job  lib  plugin  script  tmp

3.5 安装KaiwuDB DataX 插件

下载KaiwuDB DataX 插件

bash 复制代码
wget https://gitee.com/kwdb/kwdb/releases/download/V2.2.0/KaiwuDB_datax-2.2.0.zip

解压KaiwuDB DataX 插件包

bash 复制代码
unzip  KaiwuDB_datax-2.2.0.zip

将解压后的 kaiwudbwriter 复制到 datax/plugin/writer 目录

bash 复制代码
[root@openEuler ~]# cp -r kaiwudbwriter datax/plugin/writer/
[root@openEuler ~]#

验证插件安装

bash 复制代码
[root@openEuler ~]# ls datax/plugin/writer/kaiwudbwriter
kaiwudbwriter-2.1.0.jar  libs  plugin_job_template.json  plugin.json

四、安装MySQL数据库

4.1 检查MySQL软件包

在 Rocky Linux 9 环境中,MySQL 8.0 版本可通过 AppStream 存储库获取。为了确认 MySQL 相关的软件包是否可用,我们可以通过以下命令列出所有与 MySQL 相关的软件包:

bash 复制代码
[root@rockylinux ~]# yum list  all  | grep mysql
mysql80-community-release.noarch                     el9-1                               @@commandline
apr-util-mysql.x86_64                                1.6.1-23.el9                        appstream
dovecot-mysql.x86_64                                 1:2.3.16-14.el9                     appstream
mysql.x86_64                                         8.0.41-2.el9_5                      appstream
mysql-common.x86_64                                  8.0.41-2.el9_5                      appstream
mysql-errmsg.x86_64                                  8.0.41-2.el9_5                      appstream
mysql-selinux.noarch                                 1.0.13-1.el9_5                      appstream
mysql-server.x86_64                                  8.0.41-2.el9_5                      appstream
pcp-pmda-mysql.x86_64                                6.2.2-7.el9_5                       appstream
php-mysqlnd.x86_64                                   8.0.30-1.el9_2                      appstream
postfix-mysql.x86_64                                 2:3.5.25-1.el9                      appstream
qt5-qtbase-mysql.i686                                5.15.9-10.el9_4                     appstream
qt5-qtbase-mysql.x86_64                              5.15.9-10.el9_4                     appstream
rsyslog-mysql.x86_64                                 8.2310.0-4.el9                      appstream
rubygem-mysql2.x86_64                                0.5.3-11.el9_0                      appstream

4.2 安装MySQL

执行以下步骤,开始安装MySQL数据库。

bash 复制代码
yum install mysql-server -y

4.3 启动MySQL服务

启动MySQL服务并设置开机自启:

bash 复制代码
 systemctl enable --now mysqld

检查MySQL服务状态

bash 复制代码
systemctl status mysqld

4.4 本地连接MySQL

安装8.0.41时候,系统会创建一个没有密码的root用户,我们直接本地登录。

bash 复制代码
mysql -uroot -p

4.5 用户管理

修改修改本地用户'root'@'localhost' 的密码,如下所示:

sql 复制代码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Root.22#33';

新增用户kwadmin用户,用于数据迁移。

sql 复制代码
create user 'kwadmin'@'%' identified WITH mysql_native_password BY 'kwadmin';
grant all on *.* to  'kwadmin'@'%'    with GRANT OPTION;
flush privileges;

4.6 测试远程登录

使用我们新建的账号kwadmin进行远程登录Mysql数据库,如下所示:

bash 复制代码
 mysql -h 192.168.3.122 -ukwadmin -pkwadmin

五、创建测试业务数据

5.1 创建数据表

我们在源数据库---MySQL中,创建数据库school。

sql 复制代码
CREATE DATABASE IF NOT EXISTS school
    CHARACTER SET utf8mb4 
    COLLATE utf8mb4_unicode_ci;

创建一张数据表student,如下所示:

sql 复制代码
use school;
sql 复制代码
DROP TABLE IF EXISTS student;
CREATE TABLE student (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(9) NOT NULL COMMENT '最长3个汉字(3*3=9字节)',
    class VARCHAR(10) NOT NULL,
    gender ENUM('男', '女') NOT NULL,
    height DECIMAL(4,1) NOT NULL COMMENT '厘米',
    age TINYINT NOT NULL COMMENT '15-18岁',
    chinese TINYINT NOT NULL COMMENT '30-100分',
    math TINYINT NOT NULL,
    english TINYINT NOT NULL,
    physics TINYINT NOT NULL,
    chemistry TINYINT NOT NULL,
    biology TINYINT NOT NULL
) ENGINE=InnoDB 
  DEFAULT CHARSET=utf8mb4 
  COLLATE=utf8mb4_unicode_ci;

查看数据表的字段,可以看到刚才创建student表的字段情况。

sql 复制代码
mysql> show columns from student;
+-----------+-------------------+------+-----+---------+----------------+
| Field     | Type              | Null | Key | Default | Extra          |
+-----------+-------------------+------+-----+---------+----------------+
| id        | int               | NO   | PRI | NULL    | auto_increment |
| name      | varchar(9)        | NO   |     | NULL    |                |
| class     | varchar(10)       | NO   |     | NULL    |                |
| gender    | enum('男','女')   | NO   |     | NULL    |                |
| height    | decimal(4,1)      | NO   |     | NULL    |                |
| age       | tinyint           | NO   |     | NULL    |                |
| chinese   | tinyint           | NO   |     | NULL    |                |
| math      | tinyint           | NO   |     | NULL    |                |
| english   | tinyint           | NO   |     | NULL    |                |
| physics   | tinyint           | NO   |     | NULL    |                |
| chemistry | tinyint           | NO   |     | NULL    |                |
| biology   | tinyint           | NO   |     | NULL    |                |
+-----------+-------------------+------+-----+---------+----------------+
12 rows in set (0.00 sec)

5.2 创建中文姓名生成函数

创建随机姓氏函数 rand_last_name

sql 复制代码
DELIMITER $$

DROP FUNCTION IF EXISTS rand_last_name;
CREATE FUNCTION rand_last_name() RETURNS VARCHAR(1) CHARSET utf8mb4
NO SQL
BEGIN
    DECLARE last_names VARCHAR(100) DEFAULT
        '李王张刘陈杨黄赵周吴徐孙朱马胡郭林何高梁郑罗宋谢唐韩曹许邓萧冯曾程蔡潘袁于董余苏叶吕魏蒋田杜丁沈姜范江傅钟卢汪戴崔任陆廖姚方金邱夏谭韦贾邹石熊孟秦阎薛侯雷白龙段郝孔邵史毛常万顾赖武康贺严尹钱施牛洪龚';

    RETURN SUBSTR(last_names, FLOOR(1 + RAND() * 100), 1);
END$$

DELIMITER ;

创建随机名字函数 rand_first_name

sql 复制代码
DELIMITER $$

DROP FUNCTION IF EXISTS rand_first_name;
CREATE FUNCTION rand_first_name() RETURNS VARCHAR(4) CHARSET utf8mb4
NO SQL
BEGIN
    DECLARE first_names VARCHAR(500) DEFAULT 
        '安柏冰波彩婵超晨诚春丹德东芳菲芬风峰刚歌格国海浩荷弘华辉慧佳嘉健杰洁静娟君俊凯康可兰乐磊丽莉良琳玲龙露璐曼梅美萌明娜楠妮宁萍强倩琴清晴蓉瑞莎珊舒帅涛婷伟文雯霞夏贤翔欣秀雪燕阳洋瑶宜怡义艺英莹颖勇雨玉云哲珍真志智忠洲珠竹庄卓子梓';

    -- 随机决定名字长度:1或2个汉字
    SET @name_length = FLOOR(1 + RAND() * 2); -- 1 or 2

    IF @name_length = 1 THEN
        RETURN SUBSTRING(first_names, FLOOR(1 + RAND() * CHAR_LENGTH(first_names)), 1);
    ELSE
        RETURN CONCAT(
            SUBSTRING(first_names, FLOOR(1 + RAND() * CHAR_LENGTH(first_names)), 1),
            SUBSTRING(first_names, FLOOR(1 + RAND() * CHAR_LENGTH(first_names)), 1)
        );
    END IF;
END$$

DELIMITER ;

创建完整姓名函数 rand_full_name

sql 复制代码
DELIMITER $$

DROP FUNCTION IF EXISTS rand_full_name;
CREATE FUNCTION rand_full_name() RETURNS VARCHAR(10) CHARSET utf8mb4
NO SQL
BEGIN
    RETURN CONCAT(rand_last_name(), rand_first_name());
END$$

DELIMITER ;

5.3 创建批量插入存储过程

创建批量插入存储过程

sql 复制代码
DELIMITER $$

DROP PROCEDURE IF EXISTS batch_insert_students;
CREATE PROCEDURE batch_insert_students(IN total INT)
BEGIN
    DECLARE i INT DEFAULT 0;
    DECLARE CONTINUE HANDLER FOR 1366 
        BEGIN
            -- 记录错误但不中断(仅限测试环境)
            GET DIAGNOSTICS CONDITION 1 @p1 = MESSAGE_TEXT;
            INSERT INTO error_log (message) VALUES (@p1);
        END;

    WHILE i < total DO
        INSERT INTO student (name, class, gender, height, age, 
            chinese, math, english, physics, chemistry, biology)
        VALUES (
            rand_full_name(),
            CONCAT(FLOOR(1+RAND()*3), '年级', FLOOR(1+RAND()*10), '班'),
            IF(RAND() > 0.5, '男', '女'),
            ROUND(140 + RAND()*50, 1),
            15 + FLOOR(RAND()*4),
            FLOOR(30 + RAND()*71),
            FLOOR(30 + RAND()*71),
            FLOOR(30 + RAND()*71),
            FLOOR(30 + RAND()*71),
            FLOOR(30 + RAND()*71),
            FLOOR(30 + RAND()*71)
        );
        SET i = i + 1;
    END WHILE;
END$$

DELIMITER ;

5.4 执行数据生成

调用存储过程插入 2000 条学生数据

sql 复制代码
CALL batch_insert_students(2000);

5.5 验证数据条数

验证数据条数

sql 复制代码
mysql> SELECT COUNT(*) FROM student;
+----------+
| COUNT(*) |
+----------+
|     2000 |
+----------+
1 row in set (0.00 sec)

mysql>

查看前5条样例数据

sql 复制代码
mysql> SELECT * FROM student LIMIT 5;
+----+-----------+-------------+--------+--------+-----+---------+------+---------+---------+-----------+---------+
| id | name      | class       | gender | height | age | chinese | math | english | physics | chemistry | biology |
+----+-----------+-------------+--------+--------+-----+---------+------+---------+---------+-----------+---------+
|  1 | 董梓芳    | 2年级7班    | 女     |  181.0 |  15 |      98 |   71 |      30 |      52 |        66 |      77 |
|  2 | 白竹华    | 1年级8班    | 女     |  185.4 |  16 |      40 |   73 |      72 |      43 |        38 |      32 |
|  3 | 毛梓      | 2年级3班    | 女     |  164.8 |  18 |      54 |   60 |      36 |      44 |        82 |      33 |
|  4 | 赵燕      | 1年级9班    | 女     |  159.9 |  18 |      54 |  100 |      96 |      82 |        89 |      98 |
|  5 | 袁佳霞    | 3年级5班    | 男     |  161.2 |  16 |      60 |   38 |      51 |      40 |        87 |      75 |
+----+-----------+-------------+--------+--------+-----+---------+------+---------+---------+-----------+---------+
5 rows in set (0.00 sec)

mysql>

5.6 增加数据

经过以上测试生成数据成功,我们增加数据10万条左右。等待一段时间,可以看到已经成功生成10万条左右数据。

sql 复制代码
mysql> CALL batch_insert_students(100000);
Query OK, 1 row affected (4 min 41.65 sec)

mysql>
sql 复制代码
mysql>  SELECT COUNT(*) FROM student;
+----------+
| COUNT(*) |
+----------+
|   102000 |
+----------+
1 row in set (0.01 sec)

mysql>

通过执行以下命令,我们可以检查需要迁移的测试数据大小。根据查询结果,当前数据库中存储的数据总量为 6.52 MB。

sql 复制代码
SELECT 
    ROUND(SUM(DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS '总大小(MB)'
FROM 
    information_schema.TABLES
WHERE 
    TABLE_SCHEMA = 'school';

六、安装KWDB数据库

6.1 下载KWDB软件包

创建下载目录/data/kwdb

bash 复制代码
mkdir -p /data/kwdb && cd /data/kwdb

执行以下命令,下载KWDB安装包。

bash 复制代码
wget https://gitee.com/kwdb/kwdb/releases/download/V2.2.0/KWDB-2.2.0-ubuntu22.04-x86_64-debs.tar.gz

执行以下命令,解压KWDB软件包。

bash 复制代码
 tar -xzf KWDB-2.2.0-ubuntu22.04-x86_64-debs.tar.gz

查看软件包解压后,内容如下所示:

bash 复制代码
root@jeven01:/data/kwdb# ll kwdb_install/
total 52
drwxr-xr-x 4 root root  4096 Mar 31 07:22 ./
drwxr-xr-x 3 root root  4096 May  5 15:58 ../
-rwxr-xr-x 1 root root  2024 Mar 31 07:11 add_user.sh*
-rw-r--r-- 1 root root  3605 Mar 31 07:12 .construction_var
-rw-r--r-- 1 root root   465 Mar 31 07:11 deploy.cfg
-rwxr-xr-x 1 root root 24410 Mar 31 07:11 deploy.sh*
drwxr-xr-x 2 root root  4096 Mar 31 07:22 packages/
drwxr-xr-x 2 root root  4096 Mar 31 07:11 utils/
root@jeven01:/data/kwdb#

6.2 编辑配置文件

在解压目录 kwdb_install/ 中,编辑 deploy.cfg 配置文件以设置安全模式、管理用户和服务端口等信息。

bash 复制代码
vim kwdb_install/deploy.cfg
bash 复制代码
[global]
# Whether to turn on secure mode
secure_mode=tls
# Management KaiwuDB user
management_user=kaiwudb
# KaiwuDB cluster http port
rest_port=8080
# KaiwuDB service port
kaiwudb_port=26257
# KaiwuDB data directory
data_root=/var/lib/kaiwudb
# CPU usage[0-1]
# cpu=1
[local]
# local node configuration
node_addr=192.168.3.88
# section cluster is optional
#[cluster]
# remote node addr,split by ','
#node_addr=127.0.0.2,127.0.0.3
# ssh info
#ssh_port=22
#ssh_user=admin

deploy.cfg 配置文件说明

  • 全局配置([global])
  • 节点配置([local])

6.3 安装前准备工作

进入KWDB软件目录,如下所示:

bash 复制代码
root@jeven01:/data/kwdb# cd kwdb_install/
root@jeven01:/data/kwdb/kwdb_install# ls
add_user.sh  deploy.cfg  deploy.sh  packages  utils

执行以下命令,为 deploy.sh 脚本添加运行权限。

bash 复制代码
chmod +x ./deploy.sh

执行以下命令,我们手动安装 libprotobuf23 库。

bash 复制代码
apt install libprotobuf23 -y 

6.4 安装KWDB数据库

我们使用部署脚本 deploy.sh 一键完成KWDB的安装与配置,如下所示:

bash 复制代码
./deploy.sh install --single

在安装过程中,系统会提示您输入新增用户 jeven 的密码,请按指示自行输入。请注意,本次实践基于配置为4核CPU和8GB内存的虚拟机环境。由于该配置可能触发"CPU规格不满足要求"的警告,建议根据实际需求调整虚拟机规格以避免此类警告。提升机器的硬件配置(如增加CPU核心数)可以有效解决这一问题。

安装成功后,会出现以下提示信息。

6.5 启动KWDB节点

执行以下命令,重新加载 systemd 守护进程的配置文件。

bash 复制代码
systemctl daemon-reload

启动KWDB数据库,如下所示:

bash 复制代码
./deploy.sh start

执行以下命令,设置KWDB服务开自启。

bash 复制代码
systemctl enable kaiwudb

6.6 查看KWDB数据库状态

我们可以使用systemctl status kaiwudb命令,查看KWDB服务状态。

bash 复制代码
systemctl status kaiwudb

6.7 设置KWDB登录用户

如果在安装过程中由于等待时间过长而未设置用户密码,或者遇到密码遗忘、登录失败等情况,可以通过执行 add_user.sh 脚本来创建新的数据库用户。此脚本提供了一种简便的方法来重新设定访问凭据,确保我们能够顺利恢复对数据库的管理与操作。我们创建与在源数据库MySQL中的账号密码保持一致,都为kwadmin。

bash 复制代码
./add_user.sh

我们执行以下命令,使用kwadmin用户连接KWDB 数据库。

bash 复制代码
root@jeven01:/data/kwdb/kwdb_install# kwbase sql --certs-dir=/etc/kaiwudb/certs  --host=192.168.3.88    --host=192.168.3.88 -u kwadmin
#
# Welcome to the KWDB SQL shell.
# All statements must be terminated by a semicolon.
# To exit, type: \q.
#
Enter password:
# Server version: KaiwuDB 2.2.0 (x86_64-linux-gnu, built 2025/03/31 07:20:02, go1.16.15, gcc 11.4.0) (same version as client)
# Cluster ID: 4335d3f6-5648-4bd3-b181-ed48b29cd7a4
#
# Enter \? for a brief introduction.
#
kwadmin@192.168.3.88:26257/defaultdb>

检查用户权限,为了保证迁移成功,确保新创建的角色拥有admin角色权限。

sql 复制代码
kwadmin@192.168.3.88:26257/defaultdb> show roles;
  username |  options   | member_of
-----------+------------+------------
  admin    | CREATEROLE | {}
  kwadmin  |            | {admin}
  kwdbuser |            | {admin}
  root     | CREATEROLE | {admin}
  wangming |            | {admin}
(5 rows)

Time: 4.826265ms

kwadmin@192.168.3.88:26257/defaultdb>

6.8 创建目标数据库

在KWDB上创建一个名为school的目标数据库。确保新创建的数据库名称与源数据库(MySQL)中的数据库名称保持一致。这一步骤对于保证数据迁移过程的准确性和顺利进行至关重要。

sql 复制代码
CREATE DATABASE IF NOT EXISTS school;

七、数据迁移工作

7.1 配置文件准备

在迁移服务器上,我们新建配置文件mysql2kaiwudb.yml。

bash 复制代码
vim mysql2kaiwudb.yml
bash 复制代码
metadata:
  enable: true               # 启用元数据迁移
  engine-type: RELATIONAL    # 引擎类型为关系引擎
  auto-ddl: true             # 自动创建表
  primary-key: true          # 启用主键迁移
  constraint: true           # 启用约束迁移
  comment: true              # 启用注释迁移
  index: true                # 启用索引迁移
  view: true                 # 启用视图迁移
data:
  enable: true               # 启用业务数据迁移
  batchSize: 1000            # 每批次迁移 1000 条数据
  setting:
    speed:
      channel: 1             # 设置通道数为 1
    errorLimit:
      percentage: 0.02       # 允许错误数据的比例为 2%
  core:
    transport:
      channel:
        speed:
          byte: 1048576      # 每个通道的传输速率为 1 MB
          record: 1000       # 每个通道每批次传输 1000 条记录
source:
  type: MYSQL                # 源数据库类型是 MySQL
  url: jdbc:mysql://192.168.3.122:3306/mysql_kaiwudb?useSSL=false&useUnicode=true&characterEncoding=utf8  # MySQL 连接 URL
  username: kwadmin       # MySQL 数据库用户名
  password: kwadmin       # MySQL 数据库密码
  databases:
    - name: school    # 源数据库名
target:
  type: KAIWUDB              # 目标数据库是 KaiwuDB
  url: jdbc:kaiwudb://192.168.3.88:26257/mysql_kaiwudb  # KaiwuDB 连接 URL
  username: kwadmin       # KaiwuDB 数据库用户名
  password: kwadmin       # KaiwuDB 数据库密码
  databases:
    - name: school    # 目标数据库名

7.2 执行迁移操作

  • 进入到 kaiwudb-datax-utils-2.2.0.jar 所在目录,
bash 复制代码
[root@openEuler ~]# cd ~/datax/plugin/writer/kaiwudbwriter
[root@openEuler kaiwudbwriter]# ls
kaiwudbwriter-2.1.0.jar  libs  plugin_job_template.json  plugin.json
  • 执行以下命令,开始迁移表元数据和业务数据。
bash 复制代码
nohup java -jar \
  -DyamlPath=/data/migration/mysql2kaiwudb.yml \
  -DdataxPath=/root/datax \
  -Dpython=/usr/bin/python3 \
   kaiwudb-datax-utils-2.2.0.jar > migration.log 2>&1 &
  • 具体参数解释:

7.3 查看迁移报告

执行以下命令,查看迁移结速后的输出信息,可以看到迁移报告路径为:/root/datax/log/迁移报告_20250514153231000316.pdf。

bash 复制代码
tail -f migration.log

在本地电脑打开迁移报告_20250514153231000316.pdf文件,结果如下所示:

7.4 查看KWDB数据库迁移内容

进入到迁移目的数据库KWDB,如下所示:

bash 复制代码
root@jeven01:~# kwbase sql --certs-dir=/etc/kaiwudb/certs  --host=192.168.3.88    --host=192.168.3.88 -u kwadmin
#
# Welcome to the KWDB SQL shell.
# All statements must be terminated by a semicolon.
# To exit, type: \q.
#
Enter password:
# Server version: KaiwuDB 2.2.0 (x86_64-linux-gnu, built 2025/03/31 07:20:02, go1.16.15, gcc 11.4.0) (same version as client)
# Cluster ID: 4335d3f6-5648-4bd3-b181-ed48b29cd7a4
#
# Enter \? for a brief introduction.
#
kwadmin@192.168.3.88:26257/defaultdb> show databases;
        database_name        | engine_type
-----------------------------+--------------
  defaultdb                  | RELATIONAL
  postgres                   | RELATIONAL
  school                     | RELATIONAL
  system                     | RELATIONAL
  your_default_database_name | RELATIONAL
(5 rows)

Time: 1.204711ms

kwadmin@192.168.3.88:26257/defaultdb>

我们在KWDB数据库中,查询到student数据表中为102000条数据,迁移后的数据与原数据表保持一致。

sql 复制代码
kwadmin@192.168.3.88:26257/defaultdb>
kwadmin@192.168.3.88:26257/defaultdb> use school;
SET

Time: 426.224µs

kwadmin@192.168.3.88:26257/school> SELECT COUNT(*) FROM student;
  count
----------
  102000
(1 row)

Time: 35.623686ms

kwadmin@192.168.3.88:26257/school> SELECT * FROM student LIMIT 5;
  id |  name  |  class   | gender | height | age | chinese | math | english | physics | chemistry | biology
-----+--------+----------+--------+--------+-----+---------+------+---------+---------+-----------+----------
   1 | 董梓芳 | 2年级7班 | 女     |  181.0 |  15 |      98 |   71 |      30 |      52 |        66 |      77
   2 | 白竹华 | 1年级8班 | 女     |  185.4 |  16 |      40 |   73 |      72 |      43 |        38 |      32
   3 | 毛梓   | 2年级3班 | 女     |  164.8 |  18 |      54 |   60 |      36 |      44 |        82 |      33
   4 | 赵燕   | 1年级9班 | 女     |  159.9 |  18 |      54 |  100 |      96 |      82 |        89 |      98
   5 | 袁佳霞 | 3年级5班 | 男     |  161.2 |  16 |      60 |   38 |      51 |      40 |        87 |      75
(5 rows)

Time: 1.202576ms

kwadmin@192.168.3.88:26257/school>

我们对迁移前的源数据库和迁移后的目标数据库进行了简单的对比,结果显示数据保持了一致性。

八、分析与总结

本次从 MySQL 到 KaiwuDB(KWDB)的数据迁移实践,整体过程平稳高效,充分体现了 KaiwuDB 在异构数据库兼容和性能方面的优势。通过使用 KaiwuDB DataX Utils 插件,结合 DataX 强大的数据同步能力,整个迁移任务在短短 100 秒内完成了 102,000 条记录的迁移,平均写入速度达到 1020 记录/秒,流量稳定在 32.45KB/s,全程无错误发生,数据一致性得到了有效保障。KWDB不仅成功自动识别并创建了与源数据库同名的目标数据库,还展现了良好的系统稳定性与高并发处理能力,GC 和 CPU 资源占用均控制在合理范围内。此次实践验证了KWDB 在国产化替代及多场景融合中的强大适配能力,也体现了其迁移到位后的高性能读写与易用性,是一款值得信赖的企业级分布式数据库产品。

相关推荐
野犬寒鸦13 分钟前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
IvorySQL1 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·1 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德1 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫2 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i2 小时前
完全卸载MariaDB
数据库·mariadb
纤纡.2 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql
jiunian_cn2 小时前
【Redis】渐进式遍历
数据库·redis·缓存
橙露2 小时前
Spring Boot 核心原理:自动配置机制与自定义 Starter 开发
java·数据库·spring boot
冰暮流星2 小时前
sql语言之分组语句group by
java·数据库·sql