推荐用 mysqldump | gzip | ssh 管道直传,加 --single-transaction 和 --skip-extended-insert,默认多值 INSERT;大库应分表导出+rsync 断点续传;优先选 mydumper 并发迁移;gzip 用 -3 级别兼顾速度与压缩率。

用 mysqldump + gzip 管道压缩,别先写磁盘再传
直接本地 dump 并压缩后通过管道传到远端,能省掉中间临时文件、减少磁盘 IO 和带宽峰值。不这么做的话,你可能先写出几十 GB 的 dump.sql,再 scp 一遍,两轮全量带宽占用。
- 正确姿势:
mysqldump -u root -p db_name | gzip | ssh user@host "gunzip | mysql -u root -p db_name" - 加
--single-transaction(InnoDB)或--lock-tables=false(避免锁表阻塞业务) - 加
--skip-extended-insert会显著增大传输体积,别开;默认的多值 INSERT 更省带宽 - 如果网络不稳定,管道中断就全功尽弃,得加
pv或用rsync分段传(见下一条)
大库迁移时用 mysqldump 分库分表导出 + rsync 断点续传
单次管道扛不住百 GB 级迁移:ssh 超时、网络抖动、目标端 MySQL 挂了都会导致重来。把 dump 拆成小单位,配合 rsync 才靠谱。
- 按表导出:
mysqldump -u root -p --databases db_name --tables table1 table2 | gzip > part1.sql.gz - 导出后立刻
rsync -avz --partial --progress part1.sql.gz user@host:/backup/ -
--partial是关键:断了也不删已传部分,下次继续传剩余字节 - 目标端解压导入前校验
md5sum,避免传坏
mydumper 比 mysqldump 更适合并发迁移
原生 mysqldump 是单线程,导 100 张表要串行扫;mydumper 可指定线程数,同时 dump 多张表、甚至多库,CPU 和网络更均衡,总耗时明显下降。
- 安装后用:
mydumper -u root -p pass -B db_name -o /dump/ -t 4 --compress -
-t 4表示开 4 个线程,别盲目设太高,MySQL 连接数和磁盘 IO 会吃紧 - 生成的是
schema.sql+ 每张表一个table1.sql.gz,天然支持并行 rsync - 注意
myloader导入时默认不关唯一键检查,大数据量建议加--disable-binlog和--queries-per-transaction 50000
压缩级别别死磕 gzip -9,-3 到 -6 是性价比拐点
CPU 压缩时间翻倍,带宽只省不到 10%,尤其在千兆内网或 SSD 机器上,纯属浪费。
- 实测:10 GB 的 dump,
gzip -1耗时 12s,体积 2.1 GB;gzip -9耗时 84s,体积 1.9 GB - 推荐统一用
gzip -3:耗时约 20s,体积约 1.95 GB,兼顾速度与压缩率 - 如果目标机器 CPU 弱(比如老云主机),宁可传大一点,也别让
gunzip卡住导入流程 -
zstd更快更省(zstd -T0 -3),但需两端都装,兼容性不如gzip










