1、KDTS数据库迁移工具介绍
1.1 KDTS介绍
KES DTS是一款操作简单、高效稳定的数据库迁移工具,基于智能翻译技术和并行任务调度架构实现数据库对象的智能转换和数据的高效迁移,“一键操作”将各种国内外的数据库对象和数据迁移到KingbaseES数据库,帮助用户轻松完成数据库迁移的工作。
1.2 KDTS核心优势
灵活的迁移策略: 支持多种迁移任务配置,满足不同迁移场景需求;支持全量和按条件迁移、同时迁移多个数据库、模式或者多个用户;
支持按照策略进行大表拆分,提升迁移性能,实现多读多写,并行读、并行写
- 迁移任务执行高效稳定: 以任务为驱动,基于多线程异步处理机制,保证单机多线程的迁移任务达到最佳的效率;完善的容错和重试机制,避免受外部因素的干扰,网络闪断、数据源不稳定等因素导致迁移过程的任务报错或停止;支持断点续传,迁移过程中出现异常中断可无缝接续
- 迁移结果保障: 支持数据库对象二次迁移,如果有没迁移成功的对象,可以在迁移工具中修改出错的SQL语句保存以后进行二次迁移;提供完备的迁移报告,以表格报告和图表的方式直观展示迁移结果
1.3 KDTS架构图

2、部署KDTS
2.1 环境要求
在开始部署前,请先检查以下内容是否满足工具部署要求,满足才能进行部署。
| 分类 | 前置项 | 要求说明 |
|---|---|---|
| 硬件条件 | CPU | 根据计算机CPU的核心数/线程数、可用内存并兼顾源库和目标库服务器的性能及负载情况给迁移程序规划和设置合理并行度以最大化提升迁移效率。 |
| 内存 | 启动脚本(bin/startup.sh或startup.bat)会自动根据根据计算机的可用内存自动计算分配给迁移程序Java虚拟机内存(可用内存的三分之二),如果条件允许,可适当手动增大分配给迁移程序的JVM内存(修改启动脚本中的JAVA_MEMORY)。 | |
| 磁盘 | 迁移程序从源数据库读取数据后写入目标数据库,因此需要一定量的内存作为中转缓存(并行度越高、表中单行数据越大,需要的内存越多)。此外,还需要一定量的磁盘空间用于存储日志、脚本、报告等。检查计算机磁盘的剩余空间,应预留足够的磁盘空间(500MB以上,取决于迁移的对象和数据的多少)给迁移程序,多次迁移时应注意清理过时的内容(logs和results目录)。 | |
| 软件版本 | JDK版本 | 根据CPU架构类型(x64、AArch64等)和操作系统选择相匹配的JDK。需要注意的是,迁移程序需要JDK11及以上的版本。 |
备注: KDTS在KingbaseES安装时已经内置了,迁移工具随数据库一起打包发布(部署的时候勾选的是“完全安装),安装完数据库后,在对应目录下即可操作访问。
2.2 部署启停
2.2.1 Web方式
- 用kingbase用户登录服务器,切换到Kingbase安装目录下:
- 迁移工具所在位置:
$\{KES_HOME\}/ClientTools/guitools/KDts/KDTS-WEB
cd /home/application/KingbaseES/V9/ClientTools/guitools/KDts/KDTS-WEB/
[kingbase@localhost KDTS-WEB]$ ls -l
总用量 16
drwxrwxr-x 2 kingbase kingbase 119 6月 25 16:21 bin #启动脚本
drwxrwxr-x 12 kingbase kingbase 4096 7月 6 14:23 conf #配置文件
drwxrwxr-x 32 kingbase kingbase 4096 6月 25 16:21 drivers #数据库连接驱动
drwxrwxr-x 8 kingbase kingbase 96 6月 25 16:21 jdk #jdk 目录
drwxrwxr-x 2 kingbase kingbase 43 6月 25 16:21 lib #lib程序包
drwxr-xr-x 14 kingbase kingbase 4096 7月 6 14:56 logs #运行日志
drwxrwxr-x 4 kingbase kingbase 50 6月 25 16:21 web #页面文件- 运行KDTS 工具
cd /home/application/KingbaseES/V9/ClientTools/guitools/KDts/KDTS-WEB/bin
bash startup.sh
#输出日志
------------------------------------------------------------------------
openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)
------------------------------------------------------------------------
================================================ 2026-07-06_18-09-04 ================================================
kdts-app-console v2.0.2.72
jar name: kdts-app-console-2.0.2.72.jar
base path: /home/application/KingbaseES/V9/ClientTools/guitools/KDts/KDTS-WEB
bin path: /home/application/KingbaseES/V9/ClientTools/guitools/KDts/KDTS-WEB/bin
config path: /home/application/KingbaseES/V9/ClientTools/guitools/KDts/KDTS-WEB/conf
log path: /home/application/KingbaseES/V9/ClientTools/guitools/KDts/KDTS-WEB/logs/kdts-app-console_2026-07-06_18-09-04.log
java path: /home/application/KingbaseES/V9/ClientTools/guitools/KDts/KDTS-WEB/jdk
JAVA_OPT: -server -Dfile.encoding=UTF-8 -Djava.awt.headless=true -Dcache_enable=true -Dconfig.path=/home/application/KingbaseES/V9/ClientTools/guitools/KDts/KDTS-WEB/conf -Djavax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl -Djavax.xml.transform.TransformerFactory=com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl -Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl -Djava.security.properties=./conf/enableLegacyTLS.security -Duser.country=CN -Duser.language=zh -Djsse.enableCBCProtection=false --add-opens java.base/jdk.internal.loader=ALL-UNNAMED --add-opens jdk.zipfs/jdk.nio.zipfs=ALL-UNNAMED --add-opens java.base/java.net=ALL-UNNAMED --add-opens java.base/java.lang.invoke=ALL-UNNAMED -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./logs/ -Xms16G -Xmx16G -XX:+UseG1GC -XX:G1ReservePercent=20 -XX:+UseCompressedOops -XX:+UseCompressedClassPointers -XX:G1HeapRegionSize=8M -XX:+SegmentedCodeCache -XX:+PrintCommandLineFlags -XX:+ExplicitGCInvokesConcurrent
FreeMemory=27765M JavaMemory=16G
cpu_arch=x86_64
startup command: /home/application/oKingbaseES/V9/ClientTools/guitools/KDts/KDTS-WEB/jdk/bin/java -server -Dfile.encoding=UTF-8 -Djava.awt.headless=true -Dcache_enable=true -Dconfig.path=/home/application/KingbaseES/V9/ClientTools/guitools/KDts/KDTS-WEB/conf -Djavax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl -Djavax.xml.transform.TransformerFactory=com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl -Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl -Djava.security.properties=./conf/enableLegacyTLS.security -Duser.country=CN -Duser.language=zh -Djsse.enableCBCProtection=false --add-opens java.base/jdk.internal.loader=ALL-UNNAMED --add-opens jdk.zipfs/jdk.nio.zipfs=ALL-UNNAMED --add-opens java.base/java.net=ALL-UNNAMED --add-opens java.base/java.lang.invoke=ALL-UNNAMED -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./logs/ -Xms16G -Xmx16G -XX:+UseG1GC -XX:G1ReservePercent=20 -XX:+UseCompressedOops -XX:+UseCompressedClassPointers -XX:G1HeapRegionSize=8M -XX:+SegmentedCodeCache -XX:+PrintCommandLineFlags -XX:+ExplicitGCInvokesConcurrent -jar /home/application/KingbaseES/V9/ClientTools/guitools/KDts/KDTS-WEB/lib/kdts-app-console-2.0.2.72.jar > /home/application/KingbaseES/V9/ClientTools/guitools/KDts/KDTS-WEB/logs/kdts-app-console_2026-07-06_18-09-04.log 2>&1 &
application pid: 10102
See "../logs/kdts-app-console_2026-07-06_18-09-04.log" or use the command-line "tail -f ../logs/kdts-app-console_2026-07-06_18-09-04.log" for more detail.- 停止KDTS 工具
cd /home/application/KingbaseES/V9/ClientTools/guitools/KDts/KDTS-WEB/bin
[kingbase@localhost bin]$ bash shutdown.sh
/home/application/KingbaseES/V9/ClientTools/guitools/KDts/KDTS-WEB/pid 101022.3 访问 KDTS 平台
- 启动工具后,用户通过浏览器访问URL即可使用迁移工具,
http://<服务器IP>:54523就能进入KDTS登录页面 - KDTS的默认账号密码因版本而异,V9R1C10 版本,默认用户名及密码为
kingbase / Kb_DI@2019


3、KDTS实战案例:Mysql 迁移至 Kingbase
3.1 必要条件
- 创建 mysql 迁移账户
-- 创建新用户
create user 'srebro'@'%' identified by 'srebro@2026';
-- 授予权限
grant all on *.* to 'srebro'@'%';- 创建 kingbase 迁移账户
-- 创建新用户
CREATE USER mysql_user WITH PASSWORD 'Password123!';
-- 创建数据库
CREATE DATABASE test;
-- 授予权限(金仓数据库使用ALL PRIVILEGES语法)
GRANT ALL PRIVILEGES ON DATABASE test TO srebro;3.2 查看迁移的数据量
- 登陆原数据库
-- 看看MySQL版本
SELECT VERSION();
--查看数据库有多大
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
group by table_schema
order by sum(data_length) desc, sum(index_length) desc;
--查看指定数据库大小
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='test';
--查看数据库先有多少张表【排除视图】
SELECT COUNT(*) as table_count
FROM information_schema.tables
WHERE table_schema = 'test'
AND table_type = 'BASE TABLE'; 3.1 新建源数据库连接(MySQL)
| 配置项 | 示例值 | 说明 |
|---|---|---|
| 数据源名称 | MySQL_业务库 | 自定义标识名称 |
| 数据库类型 | MySQL | 选择源端类型 |
| 数据库版本 | 5.7.44 | 根据实际MySQL版本选择 |
| 主机地址 | 172.22.33.16 | MySQL服务器IP |
| 端口 | 3306 | MySQL默认端口 |
| 数据库名 | test | 待迁移的数据库名称 |
| 用户名 | srebro | 需具备读取权限 |
| 密码 | 对应的密码 |
进入KDTS主界面,依次点击「数据源管理」→「源数据库」→「新建」:
填完后点击「测试连接」,确认连接成功再保存。


3.2 新建目标数据库连接(kingbase)
| 配置项 | 示例值 | 说明 |
|---|---|---|
| 数据源名称 | KES_目标库 | 自定义标识名称 |
| 数据库类型 | KingbaseES | 选择目标端类型 |
| 数据库版本 | V9R1C10 | |
| 主机地址 | 172.24.0.158 | 本地服务器 |
| 端口 | 54321 | |
| 数据库名 | test | 目标数据库名称(建议与源端同名) |
| 用户名 | srebro | 需要新建用户 |
| 密码 |
点击「目标数据库」→「新建」:
填完后点击「测试连接」,确认连接成功再保存。

3.3 创建并执行迁移任务
3.3.1 新建MySQL到金仓迁移任务
进入「迁移任务管理」→「新建任务」:
- 创建任务名称
- 指定源数据库连接名
- 指定目标数据库连接名

指定需要同步的数据库,在 kingbase 中数据库都叫模式,建议目标模式填写同名。目标属主 填写我们在上面 kingbase 创建的指定用户srebro
⚠️: 不要勾选系统模式,其他的迁移对象根据自己的实际环境勾选

- 迁移全部对象

- 目标数据库配置,建议勾选 : 清空表数据,删除已存在的对象(表、视图 等) 方便二次迁移。

数据库映射
需要注意: mysql源数据类型为:
tinyint unsigned,需要修改目标数据类型为SMALLINT


- 线程设置
ps: 如果数据量很大,建议开启多线程迁移。内存分配的大小参考自己的配置。

- 保存并迁移

- 迁移中:显示已迁移的数据量、剩余时间预估
- 迁移完成:任务成功完成
- 迁移失败:需进入迁移日志查看具体错误信息
3.3.2 观察迁移结果

- 视图错误

处理方式也和简单,有问题的 sql 发给 ai 分析下,生成 kingbase 的 sql 给你。
执行修改后的 sql,执行成功

3.3.3 对比迁移前后的数据
- kingbase test 数据库下,test 模式里的的表的数量
ksql test srebro
用户 srebro 的口令:
授权类型: 企业版.
输入 "help" 来获取帮助信息.
SELECT COUNT(*) AS table_count
FROM pg_tables
WHERE schemaname = 'test';- kingbase test 数据库下,test 模式里的的视图的数量
SELECT COUNT(*)
FROM information_schema.views
WHERE table_schema = 'test';
COUNT
-------
24
(1 行记录)4、常见问题与解决方案
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 迁移时报数据类型兼容错误 | MySQL与KingbaseES数据类型差异 | 检查数据类型映射关系,必要时手动调整目标表结构 |
| 存储过程/函数迁移失败 | SQL语法差异 | 查看KDTS日志定位不兼容语法,手动改写后重新迁移 |
| 连接测试失败 | 网络不通或端口未开放 | 检查防火墙设置,确保源端和目标端端口双向开放 |
| 工具启动报错 | 缺少JDK或JAVA_HOME未配置 | 确认已安装JDK 8及以上版本,并正确配置JAVA_HOME |
| 目标模式不存在 | 未提前创建目标数据库 | 在KingbaseES中预先创建目标数据库并授权 |
| 迁移日志定位问题 | 迁移失败需排查具体错误 | 进入KDTS的「迁移日志」→「Error日志」查看详细报错信息 |
5、参考
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 运维小弟