mysqldump 快速导出需禁用默认低效行为:用--single-transaction保障一致性、--skip-extended-insert启用多行INSERT、--skip-autocommit与--net_buffer_length=1048576提升批量发送效率、--hex-blob优化二进制字段导出。

用 mysqldump 加上关键参数跳过开销
默认的 mysqldump 会为每条 INSERT 加事务、带表锁、生成冗余语句,严重拖慢导入速度。真正快的方式是关掉这些“安全但慢”的默认行为:
-
--single-transaction保留一致性,但避免全局锁(仅对 InnoDB 有效) -
--skip-extended-insert反而要禁用——它把多行合并在一条INSERT里,大幅减少 SQL 解析开销 -
--skip-autocommit+--net_buffer_length=1048576让客户端批量发包,减少网络往返 -
--hex-blob避免二进制字段被转义成低效字符串
导出命令示例:mysqldump --single-transaction --skip-extended-insert --skip-autocommit --net_buffer_length=1048576 --hex-blob -u root db_name > dump.sql
导入时关闭非必要日志和约束
目标库在接收大量数据时,binlog、unique_checks、foreign_key_checks 都会逐行校验或写盘,是性能瓶颈。
- 导入前执行:
SET FOREIGN_KEY_CHECKS=0; SET UNIQUE_CHECKS=0; SET sql_log_bin=0; - 确保目标表引擎是
InnoDB,且innodb_flush_log_at_trx_commit=2(临时调低持久性换速度) - 如果用
source导入,记得在mysql客户端里加--force防止单条失败中断
注意:sql_log_bin=0 意味着主从同步不会复制这批数据,需手动补位或确认从库也同步执行
大表迁移别硬扛,改用 pt-online-schema-change 或分块导出
单表超 5GB 时,mysqldump 容易 OOM 或超时,且锁表时间不可控。
- 用
pt-online-schema-change(Percona Toolkit)做无锁迁移:它自动建影子表、同步增量、原子切换,适合线上不停服场景 - 手动分块可配合
WHERE id BETWEEN x AND y+--where参数,但要注意自增主键空洞、并发写入冲突 - 更稳的选择是
mydumper(多线程导出)+myloader(多线程导入),比mysqldump快 3–10 倍,原生支持压缩和事务分片
网络和硬件层不能只靠 SQL 调优
即使 SQL 层全优化了,千兆网卡传 100GB 数据也要近 15 分钟;SSD 随机写慢、MySQL 的 sort_buffer_size 太小,都会卡在中间环节。
- 确认源和目标 MySQL 的
max_allowed_packet≥ 256M,否则大INSERT直接报错Packets larger than max_allowed_packet are not allowed - 用
scp -C或rsync --compress传 dump 文件比走 MySQL 协议更快(尤其跨公网) - 目标机器的
innodb_buffer_pool_size至少设为物理内存的 70%,否则频繁刷脏页
真正卡顿的时候,先看 iostat -x 1 和 netstat -s | grep -i "retransmit"——90% 的“慢”其实不在 SQL,而在磁盘或丢包










