文章链接:【KWDB 创作者计划】MySQL数据库迁移至KWDB的完整实践指南
作者:江湖有缘
随着企业业务的不断发展和数据量的持续增长,传统单机数据库在高并发、大数据量场景下逐渐暴露出性能瓶颈。分布式数据库作为新一代数据库技术,凭借其良好的扩展性、高可用性和高性能,正逐步成为企业数字化转型的重要支撑。KaiwuDB(KWDB) 作为一款高性能、强兼容的国产分布式数据库,原生支持多模数据处理,具备对 MySQL 等主流数据库的良好兼容能力。本文基于 KaiwuDB DataX Utils 工具,详细记录了从 MySQL 向 KaiwuDB 进行异构数据迁移的完整实践过程,旨在验证 KaiwuDB 在实际迁移场景中的稳定性与高效性,并为企业未来数据库选型与平滑迁移提供参考依据。
KWDB简介
KWDB 是一款面向 AIoT 场景的分布式、多模融合数据库产品。 支持在同一个实例中建立时序库和关系库,并统一处理多种类型的数据,具备对海量时序数据的高效读写与分析能力。 产品具备高可用、安全稳定、易运维等特性,广泛应用于工业物联网、数字能源、车联网、智慧矿山等多个行业领域,为用户提供一站式数据存储、管理与分析的基础平台。
主要特点
高性能处理能力:支持海量时序数据高速读写,提供插值查询、数学函数等丰富的时序特色功能,提升应用效率。
低运管成本:统一存储与管理多模数据,一套系统满足跨业务、跨部门数据融合需求,降低企业IT与运维投入。
低存储成本:支持 5-30 倍数据压缩比,结合数据生命周期管理策略,灵活控制数据保留时间,显著节省存储资源。
高安全性:提供数据库审计与加密机制,保障数据在复杂业务场景下的安全稳定运行。
易用性强:提供标准 SQL 接口、高速写入、极速查询、集群部署等能力,与第三方工具无缝集成,开发运维更便捷。
MySQL 数据库简介
MySQL 是一种开源的关系型数据库管理系统(RDBMS),广泛用于 Web 应用程序的数据存储和管理。它由瑞典公司 MySQL AB 开发,目前由 Oracle 公司维护和开发。MySQL 以其高性能、可靠性和易用性著称,支持多种操作系统,包括 Linux、Windows 和 macOS。
MySQL主要特点
MySQL 支持多用户访问,允许多个用户同时连接和操作数据库。它使用 SQL(结构化查询语言)进行数据管理,支持复杂的数据查询和操作。MySQL 提供了丰富的存储引擎,如 InnoDB、MyISAM 等,用户可以根据需求选择合适的存储引擎。
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版本)之间的数据迁移。此工具极大地简化了数据迁移过程,为用户提供了一个高效、便捷的数据同步解决方案。
支持的迁移形式
本次实践为个人测试环境,实践环境规划如下所示:
在迁移服务器上,环境要求如下:
yum install java-1.8.0-openjdk-devel -y
检查openJDK版本,可以看到我们安装的版本为1.8.0_432
。
[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)
yum install python3 -y
检查python安装版本,当前版本为3.11.6
[root@openEuler ~]# python3 -V Python 3.11.6
yum install maven -y
检查maven版本,可以看到安装版本为3.6.3
。
[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"
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)等数据库的离线数据同步。
wget https://datax-opensource.oss-cn-hangzhou.aliyuncs.com/202309/datax.tar.gz
解压软件包
tar -xzf datax.tar.gz
进入软件目录后,进入bin目录,即可运行同步作业:
[root@openEuler ~]# cd datax/ [root@openEuler datax]# ls bin conf job lib plugin script tmp
下载KaiwuDB DataX 插件
wget https://gitee.com/kwdb/kwdb/releases/download/V2.2.0/KaiwuDB_datax-2.2.0.zip
解压KaiwuDB DataX 插件包
unzip KaiwuDB_datax-2.2.0.zip
将解压后的 kaiwudbwriter 复制到 datax/plugin/writer 目录
[root@openEuler ~]# cp -r kaiwudbwriter datax/plugin/writer/ [root@openEuler ~]#
验证插件安装
[root@openEuler ~]# ls datax/plugin/writer/kaiwudbwriter kaiwudbwriter-2.1.0.jar libs plugin_job_template.json plugin.json
[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
yum install mysql-server -y
启动MySQL服务并设置开机自启:
systemctl enable --now mysqld
检查MySQL服务状态
systemctl status mysqld
mysql -uroot -p
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Root.22#33';
create user 'kwadmin'@'%' identified WITH mysql_native_password BY 'kwadmin'; grant all on *.* to 'kwadmin'@'%' with grant OPTION; flush privileges;
mysql -h 192.168.3.122 -ukwadmin -pkwadmin
CREATE DATABASE IF NOT EXISTS school CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
use school;
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;
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)
创建随机姓氏函数 rand_last_name
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
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
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 ;
创建批量插入存储过程
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 ;
CALL batch_insert_students(2000);
验证数据条数
mysql> select COUNT(*) FROM student; +----------+ | COUNT(*) | +----------+ | 2000 | +----------+ 1 row in set (0.00 sec) mysql>
查看前5条样例数据
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>
mysql> CALL batch_insert_students(100000); Query OK, 1 row affected (4 min 41.65 sec) mysql>
mysql> select COUNT(*) FROM student; +----------+ | COUNT(*) | +----------+ | 102000 | +----------+ 1 row in set (0.01 sec) mysql>
select ROUND(SUM(DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS '总大小(MB)' FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'school';
mkdir -p /data/kwdb && cd /data/kwdb
wget https://gitee.com/kwdb/kwdb/releases/download/V2.2.0/KWDB-2.2.0-ubuntu22.04-x86_64-debs.tar.gz
执行以下命令,解压KWDB软件包。
tar -xzf KWDB-2.2.0-ubuntu22.04-x86_64-debs.tar.gz
查看软件包解压后,内容如下所示:
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#
vim kwdb_install/deploy.cfg
[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
全局配置([global])
节点配置([local])
root@jeven01:/data/kwdb# cd kwdb_install/ root@jeven01:/data/kwdb/kwdb_install# ls add_user.sh deploy.cfg deploy.sh packages utils
chmod +x ./deploy.sh
apt install libprotobuf23 -y
./deploy.sh install --single
在安装过程中,系统会提示您输入新增用户 jeven 的密码,请按指示自行输入。请注意,本次实践基于配置为4核CPU和8GB内存的虚拟机环境。由于该配置可能触发“CPU规格不满足要求”的警告,建议根据实际需求调整虚拟机规格以避免此类警告。提升机器的硬件配置(如增加CPU核心数)可以有效解决这一问题。
systemctl daemon-reload
systemctl enable kaiwudb
systemctl status kaiwudb
如果在安装过程中由于等待时间过长而未设置用户密码,或者遇到密码遗忘、登录失败等情况,可以通过执行 add_user.sh 脚本来创建新的数据库用户。此脚本提供了一种简便的方法来重新设定访问凭据,确保我们能够顺利恢复对数据库的管理与操作。我们创建与在源数据库MySQL中的账号密码保持一致,都为kwadmin。
./add_user.sh
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>
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>
CREATE DATABASE IF NOT EXISTS school;
vim mysql2kaiwudb.yml
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 # 目标数据库名
[root@openEuler ~]# cd ~/datax/plugin/writer/kaiwudbwriter [root@openEuler kaiwudbwriter]# ls kaiwudbwriter-2.1.0.jar libs plugin_job_template.json plugin.json
执行以下命令,开始迁移表元数据和业务数据。
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 &
具体参数解释:
tail -f migration.log
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>
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 在国产化替代及多场景融合中的强大适配能力,也体现了其迁移到位后的高性能读写与易用性,是一款值得信赖的企业级分布式数据库产品。