从 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 的全流程和割接方案。

相关推荐
敲上瘾11 分钟前
Qt Widgets入门:项目模板解析与Hello World
开发语言·数据库·c++·qt·ui·qt6.3
bksczm1 小时前
Redis 持久化:RDB 快照与 AOF 日志
数据库·redis·mybatis
.痞老板.1 小时前
mysql初阶--数据库设计
数据库·mysql·oracle
Decay__3 小时前
SQL Server 数据库全栈运维实战系列 — 合集索引(24 篇)
运维·数据库·sql·mysql·架构
Thanks_ks3 小时前
SQL 的 GROUP BY 与聚合函数:从会写 SELECT 到会做统计
数据库·sql·mysql·group by·数据统计·聚合函数·having
Decay__11 小时前
12_MySQL InnoDB 内存与锁调优 —— Buffer Pool、redo log、隔离级别与锁等待
运维·数据库·sql·mysql·架构
笃行35012 小时前
AI数据库的库内四层结构,KingbaseES 产品拆解
数据库
我是大猴子13 小时前
redis
数据库·redis·缓存
苏宸啊16 小时前
MySQL(一)
数据库·mysql
2603_9696948516 小时前
JDBC 基础学习笔记:API 核心原理解析与 CRUD 代码实操
数据库·笔记·mysql·学习方法·database·sql注入