用 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,而在磁盘或丢包
