KaiwuDB 征文

MySQL整库迁移至KaiwuDB

转载Caro图懒惰2026-04-14
0

本文转载自【KWDB 2025 创作者计划】社区征文优秀作品

原文链接:【KWDB 2025 创作者计划】_MySQL整库迁移至KaiwuDB_ITPUB博客
原作者:董小姐yyds

一、迁移需求

将MySQL中dataexchange库迁移到KaiwuDB中,源库和目标库详细信息如下:

作系统版本 数据库版本 IP 地址 端口 数据量大小
源库 Centos7.9 x86_64 MySQL8.0.35 版本 192.168.40.122 2214 5.77兆字节(MB)
目标库 麒麟V10SP32403 开物DB2.2.0 192.168.40.115 26257 -

1、迁移概述

DataXopen in new window 是一款广泛使用的 离线数据同步工具 。KaiwuDB 基于 DataX 开发了数据库迁移工具 KaiwuDB DataX Utils,实现 KaiwuDB (2.0.3 及以上版本) 与 MySQL、TDengine、MongoDB、InfluxDB、OpenTSDB、Oracle、PostgreSQL、ClickHouse、KaiwuDB(1.2.x)、KaiwuDB(2.x) 等数据库的离线数据同步。
用户通过配置文件设置源数据库和目标数据库的连接、数据迁移等信息。KaiwuDB DataX Utils 自动校验、统计迁移数据并输出迁移报告。在迁移过程中,用户可以查看整体的数据迁移进度。

2、支持的迁移形式

KaiwuDB DataX Utils 支持以下数据迁移形式:

  • 元数据迁移 : 无需在目标数据库创建待迁移的表 ,KaiwuDB DataX Utils 将自动读取源数据库的表结构信息,生成相应的 建表语句 ,并创建符合目标数据库要求的表结构。
  • 元数据和业务数据迁移 :在迁移过程中,除了自动创建目标数据库中的表结构,KaiwuDB DataX Utils 还会将源数据库中的业务数据迁移到目标数据库中。
  • 业务数据迁移 :用户在目标数据库创建好表结构后,以单表、多表、单库和多库的形式对表内的业务数据进行迁移,其中:
  • 以表的形式迁移数据时 , 支持全量数据迁移和增量数据迁移 。
    • 以库的形式迁移目前只支持将 MySQL 数据迁移到 KaiwuDB 的关系库 。迁移时, 源数据库与目标数据库必须一一对应 。

下表列出了 KaiwuDB 支持迁移的异构源数据库和数据迁移方式。

源数据库 目标数据库 元数据 元数据 + 业务数据 业务数据
MySQL KaiwuDB 关系库 表、库 表、库 表、库
KaiwuDB 时序库 表、库 表 表
PostgreSQL KaiwuDB 关系库 表、库 表 表
KaiwuDB 时序库 表、库 表 表
TDengine KaiwuDB 时序库 表、库 表 表
InfluxDB KaiwuDB 时序库 表、库 表 表
MongoDB KaiwuDB 关系库 - - 表
Oracle KaiwuDB 关系库 - - 表
OpenTSDB KaiwuDB 时序库 - - 表
ClickHouse KaiwuDB 关系库 - - 表

说明
默认情况下,KaiwuDB 1.2.x 允许重复写入数据且不进行去重。KaiwuDB 2.x 对带有相同时间戳的数据整行去重 ,后写入的数据覆盖已存在的带有相同时间戳的数据。当将数据从 KaiwuDB 1.2.x 迁移到 KaiwuDB 2.x 时,如需保留源数据库中带有相同时间戳的数据,用户可以在目标数据库上运行 命令,允许写入带有相同时间戳的数据。 取值只适用于 KaiwuDB 2.x 单机部署模式。 SET CLUSTER SETTING ts.dedup.rule = keep; keep

3、数据类型映射

KaiwuDB DataX Utils 支持 DataX 的数据类型。DataX 数据类型与 KaiwuDB 数据类型的映射关系如下表所示:

DataX 数据类型 KaiwuDB 数据类型
INT 系列 TINYINT、SMALLINT、INT
长 TINYINT、SMALLINT、INT、BIGINT、TIMESTAMP、TIMESTAMPTZ
双 浮点数、实数、双精度、十进制
布尔 布尔、比特
日期 日期、时间、时间戳、时间戳
字节 字节、VARBYTES
字符串 char、NCHAR、VARCHAR、NVARCHAR、TIMESTAMP、TIMESTAMPTZ

二、迁移前准备工作

1、安装迁移工具

需是Linux 系统环境。

2、安装 openJDK

默认已安装,查看openJDK版本,需 1.8 及以上版本, 建议使用 1.8 版本。

[root@localhost ~]# java -version
openjdk version "1.8.0_402"
OpenJDK Runtime Environment Bisheng (build 1.8.0_402-b06)
OpenJDK 64-Bit Server VM Bisheng (build 25.402-b06, mixed mode)

参考链接:  https://openjdk.org/install/

3、安装 Python

默认已安装,查看python版本,需 2.x 或 3.x版本。

[root@localhost ~]# python -V
Python 2.7.18

Python下载链接:  https://www.python.org/downloads/

4、安装 Maven

查看Maven版本,需 3.6 及以上版本。

tar -xvf apache-maven-3.9.9-bin.tar.gz -C /usr/local/
echo "PATH=$PATH:/usr/local/apache-maven-3.9.9/bin"  >> /etc/profile
source /etc/profile
mvn -version 或 mvn -v

参考链接:  https://maven.apache.org/install.html
Maven下载链接:  https://maven.apache.org/download.cgi

5、安装 DataX 3.0

5.1 DataX3.0介绍

DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL、SQL Server、Oracle、PostgreSQL、HDFS、Hive、HBase、OTS、ODPS 等各种异构数据源之间高效的数据同步功能。
DataX本身作为数据同步框架,将不同数据源的同步抽象为从源头数据源读取数据的Reader插件,以及向目标端写入数据的Writer插件,理论上DataX框架可以支持任意数据源类型的数据同步工作。同时DataX插件体系作为一套生态系统, 每接入一套新数据源该新加入的数据源即可实现和现有的数据源互通。

5.2 下载并解压

下载地址:  https://datax-opensource.oss-cn-hangzhou.aliyuncs.com/202309/datax.tar.gz
下载后解压至本地某个目录,进入bin目录,即可运行同步作业

mkdir -p /opt/datax
tar -xvf datax.tar.gz -C /opt/datax
echo "$PATH=$PATH:/opt/datax/datax/bin" >> /etc/profile
source /etc/profile

参考链接: https://gitee.com/mirrors/DataX/blob/master/userGuid.md

6、下载KaiwuDB_datax插件

下载地址: https://gitee.com/kwdb/kwdb/releases/tag/V2.2.0

7、收集源库信息

show create database `dataexchange`;
+--------------+----------------------------------------------------------------------------------------------------------------------------------------+
| Database     | Create Database |
+--------------+----------------------------------------------------------------------------------------------------------------------------------------+
| dataexchange | CREATE DATABASE `dataexchange` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+--------------+----------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
root@localhost :mysql 10:52:33>select * FROM INFORMATION_SCHEMA.SCHEMATA;
+--------------+--------------------+----------------------------+------------------------+----------+--------------------+
| CATALOG_NAME | SCHEMA_NAME        | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH | DEFAULT_ENCRYPTION |
+--------------+--------------------+----------------------------+------------------------+----------+--------------------+
| def          | mysql              | utf8mb4                    | utf8mb4_general_ci     |     NULL | NO                 |
| def          | information_schema | utf8mb3                    | utf8mb3_general_ci     |     NULL | NO                 |
| def          | performance_schema | utf8mb4                    | utf8mb4_0900_ai_ci     |     NULL | NO                 |
| def          | sys                | utf8mb4                    | utf8mb4_0900_ai_ci     |     NULL | NO                 |
| def          | dataexchange       | utf8mb4                    | utf8mb4_general_ci     |     NULL | NO                 |
+--------------+--------------------+----------------------------+------------------------+----------+--------------------+
5 rows in set (0.00 sec)
select * FROM db;
Host	Db	User	Select_priv	Insert_priv	Update_priv	Delete_priv	Create_priv	Drop_priv	Grant_priv	References_priv	Index_priv	Alter_priv	Create_tmp_table_priv	Lock_tables_priv	Create_view_priv	Show_view_priv	Create_routine_priv	Alter_routine_priv	Execute_priv	Event_priv	Trigger_priv
%	dataexchange	root	Y	Y	Y	Y	Y	Y	Y	Y	Y	Y	Y	Y	Y	Y	Y	Y	Y	Y	Y
--查看dataexchange库容量大小
select 
table_schema as '数据库',
sum(table_rows) as '记录数',
sum(truncate(data_length/1024/1024, 2)) as '数据容量(MB)',
sum(truncate(index_length/1024/1024, 2)) as '索引容量(MB)'
from information_schema.tables
where table_schema='dataexchange';
+--------------+-----------+------------------+------------------+
| 数据库       | 记录数    | 数据容量(MB)     | 索引容量(MB)     |
+--------------+-----------+------------------+------------------+
| dataexchange |     55578 |             5.09 |             0.67 |
+--------------+-----------+------------------+------------------+
1 row in set (0.00 sec)

8、目标库创建数据库

--root用户连接 KaiwuDB
kwbase sql --insecure --host=192.168.40.115
--创建数据库
create database dataexchange;

9、部署环境

  • 安装 openJDKopen in new window (1.8 及以上版本, 建议使用 1.8 版本)。
    • 安装 Pythonopen in new window (2.x 或 3.x)。
    • 安装 Mavenopen in new window (3.6 及以上版本)。
    • 安装 DataX 3.0open in new window 。

9.1 工具

  • 获取 KaiwuDB 数据库迁移工具 KaiwuDB DataX Utils 的安装包。
    • 获取 KaiwuDB DataX 插件压缩包。
    • 获取待迁移数据库的 DataX 插件压缩包。

说明

  • DataX 安装包中已包含几乎所有已适配数据库的数据读写插件。如果在 DataX 安装包中未找到所需的插件,或版本不兼容,建议从源数据库的官方网站获取适配插件。
    • 将 InfluxDB 的元数据迁移到 KaiwuDB 时,需要使用 KaiwuDB 适配后的 InfluxDB reader 插件。

9.2 数据库及权限设置

  • 安装并启动源数据库和目标数据库。
    • 创建需要读取和写入数据的数据库和数据表。

说明

  • 如果目标数据库是 KaiwuDB 或 TDengine,用户可以在配置文件中通过 参数创建待写入的数据表。 preSql[]
    • 如果源数据库是 MySQL、PostgreSQL、TDengine 或 InfluxDB 且目标数据库是 KaiwuDB,用户可以使用迁移工具迁移表结构数据,无需提前创建目标表。
    • 用户拥有源数据库和目标数据库的操作权限,包括数据库的创建权限、表数据的读取和写入权限。

三、MySQL 迁移到 KaiwuDB过程

1、上传并解压 KaiwuDB DataX 插件包

解压缩 KaiwuDB DataX 插件包,将解压后的 复制到 目录。 kaiwudbwriter datax/plugin/writer

unzip KaiwuDB_datax-2.2.0.zip 
cp -r kaiwudbwriter /opt/datax/datax/plugin/writer/

2、创建 格式的迁移配置文件 .yml

创建 格式的迁移配置文件,配置元数据、源数据库和目标数据库。有关配置参数的详细信息,参见 配置参数 。 .yml

cat 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.40.122:2214/dataexchange?useSSL=false&useUnicode=true&characterEncoding=utf8  # MySQL 连接 URL
  username: root       # MySQL 数据库用户名
  password: mysql       # MySQL 数据库密码
  databases:
    - name: dataexchange    # 源数据库名
target:
  type: KAIWUDB              # 目标数据库是 KaiwuDB
  url: jdbc:kaiwudb://192.168.40.115:26257/dataexchange  # KaiwuDB 连接 URL
  username: root       # KaiwuDB 数据库用户名
  password: 61608Hhd820.       # KaiwuDB 数据库密码
  databases:
    - name: dataexchange    # 目标数据库名

3、开始迁移表元数据和业务数据

在 所在目录,执行以下命令,开始迁移表元数据和业务数据。有关迁移命令支持的所有参数,参见 迁移命令参数 。 kaiwudb-datax-utils-2.2.0.jar
注意:默认会迁移到public模式下。

nohup java -jar -DyamlPath=/opt/datax/mysql2kaiwudb.yml -DdataxPath=/opt/datax/datax -Dpython=python kaiwudb-datax-utils-2.2.0.jar &

查看迁移过程日志:

[root@localhost datax]# tail -300f nohup.out
2025-04-09 14:34:59 INFO  c.k.migration.KaiwuDBApplication - Initialize heterogeneous database migration tool.
2025-04-09 14:35:00 INFO  c.k.migration.utils.YamlParseHelper - config file: /opt/datax/mysql2kaiwudb.yml
2025-04-09 14:35:01 INFO  c.k.m.s.impl.MigrationServiceImpl - The source database dataexchange structure definition is complete.
2025-04-09 14:35:01 INFO  c.k.m.s.impl.MigrationServiceImpl - Target database table column type conversion is complete.
2025-04-09 14:35:12 INFO  c.k.migration.utils.SqlFileHelper - The SQL for data structure migration is successfully generated. File path: [/opt/datax/sql/MYSQL2KAIWUDB_20250409143512330.sql]
2025-04-09 14:35:12 INFO  c.k.m.s.impl.MigrationServiceImpl - Target database structure construct is complete.
2025-04-09 14:35:25 INFO  c.kaiwudb.migration.utils.CmdHelper - 执行命令成功: [python, /opt/datax/datax/bin/datax.py, /opt/datax/datax/job/MYSQL2KAIWUDB_19620197983539.json]
......
2025-04-09 14:49:17 INFO  c.kaiwudb.migration.utils.CmdHelper - 执行命令成功: [python, /opt/datax/datax/bin/datax.py, /opt/datax/datax/job/MYSQL2KAIWUDB_19620292281809.json]
2025-04-09 14:49:19 INFO  c.k.m.s.impl.MigrationServiceImpl - 生成DataX迁移脚本,并执行脚本完成数据迁移同步,迁移报告路径为:/opt/datax/datax/log/迁移报告_20250409144917000877.pdf.

最次迁移结束。

4、注意事项

源数据库是 MySQL、PostgreSQL、TDengine 或 InfluxDB 且目标数据库是 KaiwuDB,用户可以使用迁移工具迁移表结构数据,无需提前创建目标表 。
目标数据库的库名必须与源数据库的库名相同。
如果登录 KaiwuDB 数据库的用户为 用户或 角色的成员,则无需提前建库,KaiwuDB 将自动创建与源数据库同名的数据库。 admin admin
迁移任务目录:-dataxPath启动参数指定目录下的job目录,以.json为后缀
迁移日志路径:-dataxPath启动参数指定目录下的log目录,以日期生成独立目录
迁移报告路径:-dataxPath启动参数指定,该迁移案例中迁移报告文件路径/opt/datax/datax/log/迁移报告_20250409144917000877.pdf
如果要避免内存溢出或增加datax内存提高迁移速度,可更改conf中的core.json中的jvm参数

{
    "entry": {
        "jvm": "-Xms1G -Xmx1G",
        "environment": {}
    },

5、扩展

5.1 配置文件参数

  • 元数据 (metadata)
参数 说明
enable 可选字段,控制是否迁移元数据,设置为 时迁移元数据; true设置为 时不迁移元数据。默认值为 。 false false
engine-type 指定目的端引擎类型。支持 (关系引擎)或 RELATIONAL TIMESERIES(时序引擎)。元数据迁移时为必选字段。
auto-ddl 控制是否自动执行 DDL 建表语句,设置为 时,KaiwuDB 根据元数据自动在目标数据库中创建表,并将转换后的建表语句打印到指定 SQL 文件中。文件存储路径通过 启动参数指定。设置为 时,KaiwuDB 将输出转换后的建表语句,不执行建表作。元数据迁移时为必选字段。 true -dataxPath false
primary-key 控制生成的 DDL 语句中是否包含主键创建语句。设置为 时包含。设置为 时不包含。该参数 只适用于关系数据的迁移。 true false
constraint 控制生成的 DDL 语句中是否包含约束创建语句。设置为 时包含。设置为 时不包含。 该参数只适用于关系数据的迁移。 true false
comment 控制生成的 DDL 语句中是否包含注释创建语句。设置为 时包含。设置为 时不包含。 true false
index 控制生成的 DDL 语句中是否包含索引创建语句。设置为 时包含。设置为 时不包含。 true false
view 控制生成的 DDL 语句中是否包含视图创建语句。设置为 时包含。设置为 时不包含。 该参数只适用于关系数据的迁移。 true false
  • 业务数据 (data)
参数 说明
enable 可选字段,控制是否迁移业务数据,设置为 true时迁移业务数据。设置为 时不迁移业务数据。默认值为 。 false false
readTimeout 可选字段。源端数据库为 InfluxDB 时,指定读取数据的超时时间。默认值为 ,表示 10 秒。支持配置大于 10 的数值。 10
fetchSize 可选字段。单次读取数据的条数,默认值为 1000。
batchSize 可选字段。批量写入的数据条数。默认值为 1000。
ignoreTagsUnmatched 可选字段,源端数据库为 TDengine 时,控制是否忽略不匹配的标签,支持设置为 (忽略)或 (不忽略)。 true false
setting.speed.channel 可选字段。迁移通道的数量。
setting.speed.byte 可选字段。迁移通道速度。如果单通道速度为 1 MB,设置为 时, 表示一个通道。 1048576
setting.speed.record 可选字段。传输的记录数量。
setting.errorLimit.percentage 可选字段。出错限制百分比。设置为 时,表示 100%。 1
setting.errorLimit.record 可选字段。发生错误的记录数量,定义错误发生时抛出异常的时机。设置为 时,表示报错后立即抛出异常,任务失败。 0
setting.errorLimit.byte 可选字段。读写数据时允许出现的错误所占的字节数的上限。
core.transport.channel.speed.byte 可选字段。通道速度。
core.transport.channel.speed.record 可选字段。读取的记录数量。
  • 源数据库(source)
参数 说明
type 必选字段。指定源端数据库类型,支持 KAIWUDB、 MYSQL、 ORACLE、 POSTGRESQL、 CLICKHOUSE、 TDENGINE3X、 TDENGINE2X、 INFLUXDB2X、 INFLUXDB1X、 MONGODB和 )。 OPENTSDB
url 指定连接到源数据库的 URL。部分源数据库中,该参数用作 的值。使用 时,无需再指定 和 。 endpoint url host port
host 指定源端数据库的 IP 地址。仅在未使用 url参数时需要配置。
port 指定源端数据库的端口号。仅在未使用 url参数时需要配置。
username 必选字段。源数据库的用户名,InfluxDB 2.X 中,该参数用作 的值。 org
password 必选字段。源数据库的用户密码,密码不得为空,InfluxDB 2.X 中,该参数用作 的值。 token
databases.name 源端数据库名称,大小写敏感,InfluxDB2.X 中会用作 的值。 bucket
databases.tables.name 待读取数据的表名,例如 sensor_data。指定后系统将只读取该表,未指定时,系统将读取数据库下的全部表数据。InfluxDB 中,该参数用作 的值。MongoDB 中,该参数用作 的值。以库的形式迁移数据时,无需填写该参数。以表的形式迁移数据时,该参数为必选字段。 measurement collectionName
databases.tables.column 待读取数据的表的列。可配置为使用逗号( ,)隔开的字符串或 Json 字符串。
databases.tables.querySql[] 自定义 SQL 查询语句集合。可使用 column或 参数限定数据读取范围。如果同时设置 和 ,系统将优先使用 参数限定数据范围。同步时序表时,数据列第一列必须为时间戳列。 query_sql column query_sql query_sql
databases.tables.splitPk 可选字段。自定义的切分主键。
databases.tables.where 可选字段。自定义的 过滤条件,适用于增量数据迁移。 where
databases.tables.beginDateTime 指定数据读取起始时间,需与 、 等参数同用。源数据库为 KaiwuDB 或 InfluxDB 时为必选字段。如果已配置 参数,则无需设置此参数。 table column querySql
databases.tables.endDateTime 指定数据读取终止时间,需与 、 等参数同用。源数据库为 KaiwuDB 或 InfluxDB 时为必选字段。如果已配置 参数,则无需设置此参数。 table column querySql
databases.tables.splitIntervalS 可选字段。切分时间间隔。该参数只适用于 KaiwuDB 和 InfluxDB。
databases.tables.tsColumn 可选字段。指定时序表第一列(时间戳列),与 databases.tables.column参数同效。源数据库为 KaiwuDB 时为必选字段。
databases.tables.mandatoryEncoding 可选字段。指定源端字符集类型,该参数只适用于 TDengine 。
databases.tables.query 可选字段。指定源端查询条件,该参数只适用于 MongoDB。
  • 目标数据库(target)

下表列出目标数据库的相关配置参数。

参数 说明
type 必选字段。指定目标数据库类型,支持 KAIWUDB、 KAIWUDB1X、 MYSQL、 ORACLE、 POSTGRESQL、 CLICKHOUSE、 TDENGINE3X、 TDENGINE2X和 )。 MONGODB
url 指定目标数据库的URL。使用 时,无需再指定 url host和 。 port
host 指定目标数据库的 IP 地址。仅在未使用 参数时需要配置。 url
port 指定目标数据库的端口号。仅在未使用 参数时需要配置。 url
username 必选字段。目标数据库的用户名。
password 必选字段。目标数据库的用户密码。
databases.name 必选字段。目标数据库的名称,区分大小写。
databases.tables.name 待写入数据的表名。MongoDB 中,该参数用作 的值。以库的形式迁移数据时,无需填写该参数。以表的形式迁移数据时,该参数为必选字段。 collectionName
databases.tables.column 待写入数据的表的列,可以配置为使用逗号( )隔开的字符串或 Json 字符串。写入的列名数量和顺序必须与读取的列名数量和顺序保持一致。以库的形式迁移数据时,无需填写该参数。以表的形式迁移数据时,该参数为必选字段。 ,
databases.tables.writeMode 可选字段。数据写入模式,支持 、 insert UPSERT,默认为 。 insert
databases.tables.preSql[] 可选字段。写入数据前要执行的 SQL 语句。该参数只适用于 KaiwuDB 和 TDengine。
databases.tables.postSql[] 可选字段。写入数据后要执行的 SQL 语句。该参数只适用于 KaiwuDB 和 TDengine。

5.2 迁移命令参数

从 KaiwuDB 2.2.0 版本开始,迁移命令不再支持 参数设置。如果需要设置 JVM 参数以增加内存,可以通过修改 DataX 配置文件来实现。 arguments

参数 说明
yamlPath 必选字段,配置文件的路径。
dataxPath DataX 文件夹的路径,迁移业务数据时为必选字段。
python 已安装的 Python 版本,迁移业务数据时为必选字段。支持以下设置:- Python 2.x:- Python 3.x: python python3

示例

java -jar -DyamlPath=../datax/test/config.yml -DdataxPath=../datax -Dpython=python kaiwudb-datax-utils-2.2.0.jar

参考链接(KaiwuDB文档):https://www.kaiwudb.com/kaiwudb_docs/#/db-migration/migration-senarios/migrate-mysql-to-kaiwudb.html%23%E5%8D%95%E5%BA%93%E8%BF%81%E7%A7%BB%E5%85%83%E6%95%B0%E6%8D%AE

-- 坚持原创,转载请注明出处 --

评论(0)

Me