停机窗口内完成最终同步并开启一致性校验是保障mysql迁移至云数据库rds数据一致性的核心手段;mysqldump --single-transaction仅适用于innodb且无法解决binlog位点不准、definer错误、大表导入中断及load data跳过等问题;dts须手动启用行数校验、全字段md5校验(需字符集一致)和合理校验并发度;自建校验推荐pt-table-checksum分片校验并配合pt-table-sync生成修复语句;必须同步auto_increment值、统一时区为asia/shanghai、显式转码避免隐式类型转换导致md5失败。

停机窗口内完成最终同步 + 开启一致性校验是保证 MySQL 迁移到云数据库 RDS 数据一致性的核心手段。单纯靠 mysqldump 导出再导入,不加控制和验证,大概率会漏数据、字段错位或主键冲突。
为什么 mysqldump --single-transaction 不够用
mysqldump --single-transaction 确实能在事务快照下导出一致的逻辑备份,但它只对 InnoDB 表有效,且无法解决以下现实问题:
- 导出期间源库仍在写入,
SHOW MASTER STATUS记录的 binlog 位置与 dump 结束时刻不严格对应,导致后续增量同步起点不准 - 目标 RDS 实例可能禁用
CREATE DEFINER语句,直接导入会报错ERROR 1227 (42000),而错误常被静默忽略 - 大表导入时若未加
--quick,客户端内存溢出会导致部分 INSERT 中断,但进程仍返回 0,误判成功 - RDS 默认关闭
local_infile,若 dump 文件含LOAD DATA INFILE语句,会跳过而不报错
用 DTS 迁移时必须打开的三个校验开关
阿里云 DTS、腾讯云 DTS 或 AWS DMS 等托管服务虽省事,但默认校验极弱。必须手动开启并确认以下三项:
-
行数校验:迁移后自动比对每张表的
COUNT(*),但仅此一项远远不够——它不防“漏一条+多一条”的抵消假象 -
MD5 校验(字段级):勾选“校验全字段拼接 MD5”,DTS 会对每行非 NULL 字段按字典序拼接后计算哈希;注意:需确保源/目标端字符集一致(如都为
utf8mb4_unicode_ci),否则哈希值不同 -
校验并发度 ≥ 源库最大连接数 × 0.3:太低会拖慢校验,太高则触发 RDS 的
max_connections限流,导致校验任务卡在 “waiting for table flush”
自建校验脚本绕过 DTS 局限的实操要点
当 DTS 校验失败、超时或你怀疑其结果时,必须用独立脚本二次验证。推荐用 pt-table-checksum(Percona Toolkit)而非手写 SQL,原因很实际:
- 它自动分片大表(按主键范围切分),避免单次查询锁表太久;执行
pt-table-checksum --replicate=test.checksums h=source_host,u=user,p=pass后,结果存入test.checksums - 校验前务必在 RDS 上创建同名库
test并授权:GRANT ALL ON test.* TO 'user'@'%',否则工具静默跳过 - 若源库是 MySQL 5.7 而 RDS 是 8.0,需加参数
--no-check-binlog-format,否则因 binlog_format 默认为ROW而报错Cannot use row-based replication with pt-table-checksum - 校验完立刻跑
pt-table-sync --sync-to-master --print h=target_rds_host,u=user,p=pass查看差异语句,但别直接--execute—— RDS 禁用REPLACE INTO和某些系统变量,得人工审核后改写为INSERT ... ON DUPLICATE KEY UPDATE
最容易被忽略的三个“一致性陷阱”
技术方案再完整,这三个点一旦疏忽,前面所有操作都白做:
-
AUTO_INCREMENT值没同步:迁移后新插入记录主键从 1 开始撞重,必须在目标表执行ALTER TABLE t AUTO_INCREMENT = N,N 来自源表SHOW TABLE STATUS LIKE 't'的Auto_increment字段 - 时区不一致:源库
system_time_zone是CST(中国标准时间),RDS 默认是UTC,导致DATETIME字段入库时被偏移 8 小时;应在 RDS 参数组中显式设为Asia/Shanghai - 隐式类型转换干扰校验:比如源表某列是
VARCHAR(255)存数字,目标 RDS 因字符集不同(如utf8mb4vsutf8)导致尾部空格被截断,MD5 校验必失败;应统一用CONVERT(col USING utf8mb4)显式转码后再比对











