mysqldump适用于数据量≤10gb且允许数小时停机的场景,导出纯sql文本便于人工检查;大库或不可停服必须用dts实现全量+增量同步,仅最后切流停机几十秒。

mysqldump 适合小数据量、可接受停机的场景;大库或不能停服,必须用 DTS。
什么时候该用 mysqldump?
当你的本地 MySQL 数据量在 10GB 以内,且业务允许数小时停机窗口时,mysqldump 是最直接可控的选择。
它导出的是纯 SQL 文本,结构 + 数据一体,导入 RDS 前还能人工检查、删减、替换(比如去掉 CREATE DATABASE 或调整字符集)。
- 导出命令里必须加
--single-transaction(确保一致性),但前提是所有表用 InnoDB 引擎 - 别漏掉
--routines --triggers --events,否则存储过程、触发器不会被导出 -
--skip-lock-tables在 RDS 上不是必须的——RDS 不支持FLUSH TABLES WITH READ LOCK,加了反而可能报错 - 导出文件默认不含
USE语句,导入前得手动指定数据库名,或在命令里加-D db_name
为什么大库或不能停服一定要选 DTS?
DTS 不是“导出再导入”,而是建立源库和 RDS 之间的实时通道:先全量拷贝,再持续拉取 binlog 做增量同步。整个过程业务可读写,停机只发生在最后切流那几十秒。
但要注意几个硬性前提:
- 本地 MySQL 必须开启 binlog,且格式为
ROW(binlog_format=ROW) - 源库账号需有
REPLICATION SLAVE和REPLICATION CLIENT权限 - 如果通过公网连本地库,DTS 的 IP 段必须加进本地防火墙白名单;更推荐走专线/VPC 对等连接
- RDS 实例的
lower_case_table_names参数值要和源库一致,否则大小写敏感的表名会找不到
导入后最容易忽略的三个问题
迁移完成不等于可用。以下三点常被跳过,却直接导致应用报错:
-
max_allowed_packet:RDS 默认是 4MB,如果源库有超大 BLOB 字段或长文本,导入时会截断。需提前在 RDS 控制台调高该参数 - 字符集不一致:本地库用
utf8mb4,但导出时没加--default-character-set=utf8mb4,会导致 emoji 乱码。建议导出和导入都显式指定 - 权限重置:RDS 不允许用
root登录,导入后得用 RDS 创建的高权限账号(如admin)重新授权,且不能授GRANT OPTION给普通应用账号
mysqldump 导入 RDS 时卡住或报错怎么办?
常见现象是执行 mysql -h xxx.rds.aliyuncs.com -u user -p db_name 后长时间无响应,或报 <code>ERROR 1153 (08S01) at line XXX: Got a packet bigger than 'max_allowed_packet' bytes。
这不是网络问题,而是 RDS 侧限制了单次接收包大小。解决方式只有两个:
- 改用
mysql客户端的--max-allowed-packet=512M参数重试(注意:这个值不能超过 RDS 实例设置的上限) - 把大 SQL 文件拆成多个小文件,例如用
split -l 5000 backup.sql part_,再逐个导入 - 或者换用
source命令在 MySQL 会话内执行:source /tmp/part_aa;(避免 shell 层面的管道缓冲问题)
表名大小写、binlog 格式、字符集、max_allowed_packet——这四个点不提前核对,迁移十次九次会卡在最后一步。











