mysql迁移数据时如何优化数据传输速度_mysql数据传输优化

来源:这里教程网 时间:2026-02-28 20:46:37 作者:

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

相关推荐