MySQL 8.0+导出需显式指定--ssl-mode=REQUIRED防明文传输;GTID场景须加--set-gtid-purged=OFF或AUTO;大库用--skip-extended-insert提升速度;字符集务必统一utf8mb4并校验SET NAMES。

mysqldump 导出时没加 --ssl-mode=REQUIRED,连接直接被拒绝
MySQL 8.0+ 默认要求 SSL 连接(尤其云厂商 RDS),但本地 mysqldump 默认走非加密通道,会报错:SSL connection error: protocol version mismatch 或直接拒绝访问。
实操建议:
- 导出命令必须显式指定 SSL 模式:
mysqldump --host=xxx.rds.aliyuncs.com --user=root --password --ssl-mode=REQUIRED --databases mydb > dump.sql - 如果目标库强制校验 CA(如 AWS RDS),还得加上
--ssl-ca=/path/to/rds-combined-ca-bundle.pem - 不加
--ssl-mode时,mysqldump可能静默降级为非 SSL,导致数据明文暴露在公网——这不是“连不上”的问题,是“连上了但不安全”的陷阱
用 mysql 命令导入时提示 ERROR 1840 (HY000):GTID 不一致
源库和目标库启用了 GTID(gtid_mode=ON),但 mysqldump 默认不重置 GTID_EXECUTED,导入时会因事务 ID 冲突失败。
实操建议:
- 导出时加
--set-gtid-purged=OFF(适用于迁移后不需主从同步的场景) - 若需保留 GTID 连续性,改用
--set-gtid-purged=AUTO并确保目标库gtid_executed为空(即全新实例或已执行RESET MASTER) - 导入前检查:
SELECT @@gtid_mode, @@enforce_gtid_consistency;,两边必须一致,否则导入必然失败
大库迁移卡在 INSERT 阶段,CPU 和网络都空转
默认 mysqldump 生成的是单条 INSERT 语句(每行一条),网络往返多、解析开销大;公网带宽有限时,实际吞吐远低于理论值。
实操建议:
- 加
--skip-extended-insert改为批量插入(一行含多值),减少语句数量,提升导入速度 3–5 倍 - 导入时加
mysql --local-infile=1 --max-allowed-packet=512M,避免大 INSERT 被截断 - 别在公网直连跑
source dump.sql:先scp到目标服务器本地,再用mysql本地执行,避开双向公网延迟放大
字符集错乱:中文变问号或
源库用 utf8mb4,但 mysqldump 默认按客户端字符集(常为 latin1)读取,导出 SQL 文件本身编码就损坏了。
实操建议:
- 导出命令必须加
--default-character-set=utf8mb4,且该参数要放在--user等认证参数之后,否则会被忽略 - 检查导出文件头是否有
SET NAMES utf8mb4;,没有说明参数位置错了 - 导入时也得指定字符集:
mysql --default-character-set=utf8mb4 -D mydb ,两边缺一不可
迁移不是“导出 + 导入”两个命令的事,真正卡点都在连接模式、GTID 状态、语句格式和字符集这四个地方。漏掉任意一个,轻则数据错乱,重则中断后无法续传。











