从 MySQL 迁到 KingbaseES,KDTS 这些参数不调会吃亏

从 MySQL 迁到 KingbaseES,KDTS 这些参数不调会吃亏

MySQL 迁 KingbaseES 是信创项目里的高频场景,KDTS 也专门支持 MySQL 源(5.X、8.X,MariaDB 按对应版本映射)。

但很多人第一次用 KDTS 迁 MySQL 库,图省事一路默认参数点到底,结果要么迁得奇慢,要么中途失败,要么迁完数据对不上。这篇把 MySQL 迁移的几个关键配置讲清楚,都是实际项目里踩过的。

先看版本匹配

源端 MySQL 支持 5.X 和 8.X(5.1、5.5、5.6、5.7、8.0 等)。MariaDB 的话按版本映射:

MariaDB 按 MySQL 版本处理
10.1 5.6(配置用 5.7)
10.2 ~ 10.4 5.7
10.5 ~ 10.7 8.0

目标库 KingbaseES 支持 V7、V9R3、V9、V9C7 等,默认 V9。

迁移对象:表、视图、函数、存储过程、触发器、用户自定义类型、注释。可以指定包含或排除某些表。

连接串:字符集这个坑必须提前处理

MySQL 的连接串,字符集设置不对,迁出来的中文就是乱码。常见两种:

源库是 GBK:

bash 复制代码
jdbc:mysql://ip:3306/dbname?useUnicode=true&characterEncoding=utf-8

源库是 Latin1:

需要在配置文件里打开 character-need-decoding: true,让 KDTS 按字节解码处理,不然数据是错的但你不一定看得出来。

别小看这步,乱码问题在迁移后测试阶段才暴露,那时候排查成本高得多。

大表拆分:不拆会慢到怀疑人生

MySQL 里一张表几千万行很常见。KDTS 默认单线程顺序读,大表不拆分,迁移时间以天计。

KDTS 提供大表拆分:按行数 + 大对象大小排序,对超过阈值的大表分块并行读取。只在读侧拆分,不影响数据本身。

默认阈值:

  • 拆分阈值行数:5000000(500 万行)
  • 拆分阈值大小:50000 MB
  • 拆分最大块数:默认配置

实际建议:

  1. 迁移前先对源库做统计分析(ANALYZE),让拆分判断更准;
  2. 大表拆分了,目标端要设 truncate-table: false------因为拆成多块并行写,如果每块先 TRUNCATE 再写,会互相把数据清掉;
  3. 含大对象(LOB)的表,游标读取记录数单独设置。

线程池:IO 密集型任务,线程数别照抄

SHELL 版的线程池在 thread-config.json 里配,分读、写、元数据等线程数。

文档给的经验公式:

scss 复制代码
线程数 = 核数 / (1 - 0.9)

比如 16 核,读线程 = 16 / 0.1 = 160。这是 IO 密集型的估算方式,先按这个起,实际看源库和目标库负载再调。

别一上来就把线程拉满,源库是生产库的话,迁移线程太猛会拖垮源库业务。

网络超时:抖动环境下的大坑

跨机房、跨网络迁移时,网络抖动会导致连接假死,任务卡在"Running"状态,日志里看到超时。

解决办法是设置网络读取超时,主动中断假死连接:

  • KingbaseES 目标端:socketTimeout=900(单位秒)
  • MySQL 源端:socketTimeout=900000(单位毫秒)

还有个技巧:表结构和数据分开迁。迁数据设较短超时,迁结构、约束这些可以设长一点或者 0(不超时)。

注意:超时值必须大于最耗时的操作,比如建大索引。不然索引建到一半被超时杀掉,更麻烦。

大对象防 OOM

单行数据超过 100MB(比如大 BLOB)时,JVM 内存不够会直接 OOM。

对策:

  1. 调大 JVM:改启动脚本里的 -Xms / -Xmx,或者 JAVA_MEMORY;
  2. 控制并发度:少开几个迁移线程,让大对象单线程慢慢搬。

迁移顺序(SHELL 版)

MySQL 源的建议顺序:

  1. 表结构、表数据、主键约束、索引、唯一性约束
  2. 外键约束
  3. 检查约束、视图、函数、存储过程
  4. 触发器
  5. 注释

BS 版内部会处理顺序,但手工用 SHELL 版一定要按这个来。

迁移完别急着验收

KDTS 有数据对比功能,迁移完跑一遍对比,看源目标和行数、数据是否一致。不一致的定位到对象重迁(二次迁移)。

还要看 results/ 下的 HTML 报告,里面 Failed 目录有失败对象的明细脚本,能直接看到哪条 DDL 失败了、为什么。

结尾

MySQL 迁 KingbaseES,KDTS 本身很成熟,坑都在配置上:

  • 字符集连接串(乱码源头)
  • 大表拆分 + truncate-table=false
  • 线程数按公式算
  • 网络超时按环境调
  • 大对象控内存

把这五件事做对,迁移过程基本平稳。剩下的就是等进度条走完,跑数据对比验收。

下一篇讲 Oracle 迁 KingbaseES 的全流程和割接方案。

相关推荐
库库的数据库笔记1 小时前
金融核心交易系统的数据库国产信创改造该如何做?
大数据·数据库·分布式·mysql·oracle·金融·数据库架构
这个DBA有点耶1 小时前
连接数没满,应用却连不上数据库——TCP backlog溢出与somaxconn的隐藏限制
数据库·mysql·代码规范
yunlaodacom1 小时前
华为云国际站服务代理商:BMS数据库延迟突然升高?磁盘I/O、网络与CPU排查方法
网络·数据库·华为云
SelectDB技术团队1 小时前
Apache Doris 的时间旅行与快照能力:边界、替代路径与可落地操作
数据库·apache·数据湖·apache doris·数据库选型·多模湖仓
2601_961963381 小时前
电子合同检索与全文搜索怎么测、怎么选:六个指标 + 五家平台对比 + 八个自测问题
数据库·后端·python·django·智能合约
zhangjw342 小时前
1-3 PostgreSQL 架构模型:实例、数据库、Schema 模式、表空间完整概念
数据库·postgresql·架构
小羊没烦恼!2 小时前
C#综合揭秘——Entity Framework 并发处理详解
java·开发语言·前端·javascript·数据库·mysql·c#
Databend2 小时前
周年庆结束了,湖仓为什么还在高消费?
大数据·数据库·agent
笃行3502 小时前
数据集成软件里最贵的一行字,叫“用同步工具做增量同步“
数据库