DTS是生产环境、数据量>50GB或要求零停机场景的唯一可行方案;物理冷迁移仅适用于测试库及小数据量场景。

直接说结论:对生产环境、数据量 >50GB 或要求零停机的场景,DTS 是唯一可行方案;物理冷迁移(如 mysqldump + mysql 导入)仅适用于测试库、小数据量(
为什么不能只用 mysqldump 做线上迁移
看似简单,但实际踩坑极多:
-
mysqldump默认单线程导出,50GB 库通常要 2–4 小时,期间源库锁表(--single-transaction可缓解但不保全) - 导入时目标库会持续写入 binlog,若未关掉
binlog_format=ROW,日志体积可能暴涨 3–5 倍,触发磁盘告警 - 无法自动处理字符集差异(如源库
latin1、目标库强制utf8mb4),导入后中文变乱码无提示 - 无增量同步能力,dump 开始到导入结束之间的所有变更全部丢失,必须业务停写 —— 这在电商/支付类系统中不可接受
DTS 全量 + 增量迁移的关键配置点
很多失败不是因为 DTS 不行,而是权限或参数没对齐:
- 源库必须开启
log_bin=ON且binlog_format=ROW(MIXED在部分大事务下会降级为 STATEMENT,导致增量同步断链) - 源库账号至少需具备:
REPLICATION SLAVE、REPLICATION CLIENT、SELECT、SHOW VIEW;若做一致性校验,还必须有ALL PRIVILEGES ON `__tencentdb__`.* -
lower_case_table_names必须源/目标一致,否则结构迁移阶段报错Table 'xxx' doesn't exist(Linux 源库默认 0,Windows 目标库默认 1,极易中招) - 全量迁移并发线程数建议按源库规格设:
4核8G → 4线程、8核16G → 8线程;过高反而因锁竞争拖慢整体进度
物理冷迁移仅在三种情况下可考虑
别被“快速”误导,冷迁移的“快”只体现在操作命令少,不代表总耗时短:
- 迁移对象是全新初始化的测试库,数据量
- 源库已关闭 binlog、无主从、无任何外部写入,可安全执行
FLUSH TABLES WITH READ LOCK - 目标 CDB 实例已提前调大
max_allowed_packet和innodb_log_file_size,否则导入中途会因包超限或 redo 日志满而中断
最常被忽略的一点:DTS 在全量阶段会往源库建 __tencentdb__ 系统库用于校验,这个库虽小(约源库大小的 0.01%),但必须确保迁移账号对其有 CREATE 权限;如果源库开启了 sql_mode=STRICT_TRANS_TABLES,而账号没显式授权该库,任务会在“校验准备”阶段静默卡住,日志里只显示 waiting for init,查不到具体原因。











