直接用 mysql -u root -p database_name
直接用
mysql -u root -p database_name 恢复几十 GB 的 SQL 文件,基本就是“等它自己放弃”。不是数据没进来,是默认配置让每条 <code>INSERT都在刷盘、校验、开事务——相当于让快递员每次只送 1 件货,还要求他每送完 1 件就回公司签一次到。为什么 mysqldump 导入会越来越慢
常见错误现象:前 5 分钟导入飞快,之后明显卡顿,
SHOW PROCESSLIST显示大量Writing to net或长时间Updating;磁盘 I/O 持续跑满,但 CPU 和内存并不紧张。
- 根本原因不是 SQL 文件大,而是 MySQL 默认逐行执行
INSERT,每条都触发完整事务流程(写 redo、binlog、刷脏页、校验外键和唯一索引)mysqldump输出的单条长INSERT(带--extended-insert)本可批量写入,但若没关约束、没调参数,InnoDB 仍按单行逻辑处理- 恢复中途如果断连或超时,默认
max_allowed_packet=4M会截断大语句,导致语法错误中断必须改的三个运行时参数
不重启 MySQL 也能生效,但必须在导入前执行(且目标库要提前建好):
SET FOREIGN_KEY_CHECKS = 0;:跳过外键依赖检查,否则每插一行都要查关联表SET UNIQUE_CHECKS = 0;:禁用唯一索引实时校验,避免每行都查 B+ 树SET autocommit = 0;:关闭自动提交,配合脚本在每 10000 行后手动COMMIT;否则默认每行一个事务,日志写爆注意:
UNIQUE_CHECKS关闭后,导入完成必须立刻SET UNIQUE_CHECKS = 1;并ANALYZE TABLE,否则后续查询可能返回重复结果。命令行参数不能省
光改会话变量不够,
mysql客户端本身也要调参:
--max-allowed-packet=1G:防止大INSERT被截断(默认 4MB,5GB 备份文件必设)--disable-reconnect:避免网络抖动导致连接中断后自动重连失败(重连会丢上下文)-B(批处理模式):减少客户端格式化开销,对纯导入场景提速约 8–12%完整命令示例:
mysql --max-allowed-packet=1G --disable-reconnect -B -u root -p database_name真正快的方案:换工具,别硬扛
mysqldump是单线程文本导出,对百 GB 级已过时。实测mydumper + myloader比mysqldump快 3–8 倍:
- 导出:
mydumper -u root -p password -B database_name -o /backup/ --threads=8 --compress- 导入:
myloader -u root -p password -B database_name -d /backup/ --threads=8- 关键点:目标库需提前建好;
myloader不重建索引,导入后必须手动ALTER TABLE ... ENABLE KEYS;或ANALYZE TABLE容易被忽略的是:导入完成后,所有二级索引仍是空的——MySQL 不会边导入边批量建索引,而是延迟到第一条
SELECT触发,此时查询性能会断崖下跌。必须主动补上。












