默认 mysqldump 导出的 SQL 单行 INSERT,导入 45 万行耗时 3 小时。通过调整导出参数与导入配置,可将耗时压缩至秒级。
| 参数 | 作用 | 推荐值 |
|---|---|---|
-e / --extended-insert | 多行 VALUES 批量 INSERT | 必须开启 |
--max_allowed_packet | 客户端/服务端通信缓冲区上限 | ≤ 目标库同名变量 |
--net_buffer_length | TCP/Socket 通信缓冲区初始大小 | ≤ 目标库同名变量 |
-- 1. 确认目标库参数
mysql> SHOW VARIABLES LIKE 'max_allowed_packet';
mysql> SHOW VARIABLES LIKE 'net_buffer_length';
-- 2. 导出命令示例
mysqldump -uroot -p db_name table_name \
-e \
--max_allowed_packet=1048576 \
--net_buffer_length=16384 \
> dump.sql
实测:原 2 小时导入 → 优化后几十秒完成。
-- 会话级临时修改,重启失效
SET GLOBAL innodb_flush_log_at_trx_commit = 0;
SET GLOBAL sync_binlog = 0;
导入完成后恢复为 1 保证数据安全。可提速 100 倍以上。
[mysqld]
interactive_timeout = 120
wait_timeout = 120
max_allowed_packet = 32M
防止大 SQL 传输中途断连。
# 将大 SQL 拆分为多个小文件
split -l 10000 dump.sql part_
# 多终端并行 source
mysql -uroot -p db_name < part_aa &
mysql -uroot -p db_name < part_ab &
SET FOREIGN_KEY_CHECKS=0; SET UNIQUE_CHECKS=0;innodb_buffer_pool_size(如 70% 内存)。innodb_flush_log_at_trx_commit=0、sync_binlog=0。max_allowed_packet 与 net_buffer_length 不能超过目标库设置,否则报错“Packet too large”。CHECK TABLE 确保目标表健康。