如何加快 MySQL 从 dump 文件恢复的速度?

加速 mysqldump 恢复:关闭 unique_checks/foreign_key_checks/autocommit、加大 innodb_buffer_pool_size 与 innodb_log_file_size、用 --tab 或 mydumper 并行、关闭 binlog。恢复完记得还原配置。

最佳实践
如何加快 MySQL 从 dump 文件恢复的速度?封面

核心思路:大 dump 恢复慢在"逐行 INSERT + 索引维护 + 事务开销"。加速三板斧:①会话级关掉校验与自动提交(SET autocommit=0; unique_checks=0; foreign_key_checks=0;);②调大 InnoDB 缓冲与日志(buffer pool、log file);③换并行工具(mydumper/myloader)或裸文件备份。几十 G 的库,这些手段能把恢复时间压到原来的几分之一。

方法一:会话级优化(改 dump 文件头部)

mysqldump 导出时加 --opt(默认开)已含部分优化;恢复前在 SQL 头部手动补:

SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;
-- ... 原有内容 ...
COMMIT;
SET autocommit=1;
SET unique_checks=1;
SET foreign_key_checks=1;
  • autocommit=0:全部插入合并成少量大事务,减少 redo 刷盘次数
  • unique_checks=0:跳过一次索引唯一性检查
  • foreign_key_checks=0:跳过外键校验

方法二:恢复期间调大配置

my.cnf 临时调整(恢复后可还原):

[mysqld]
innodb_buffer_pool_size = 物理内存的 60-70%
innodb_log_file_size = 2G          # 大日志减少 checkpoint
innodb_flush_log_at_trx_commit = 2 # 恢复期可接受(崩溃丢1秒)
sync_binlog = 0
skip-log-bin                        # 恢复期不写 binlog

innodb_flush_log_at_trx_commit=2 与关 binlog 只适合全新恢复的实例,生产在役库别这么调。

方法三:换更快的工具

工具 特点
mydumper/myloader 逻辑备份,多线程并行导出/导入,大库首选
mysqldump --tab 导成 TSV+SQL,LOAD DATA INFILE 比 INSERT 快一个量级
Percona XtraBackup 物理备份,恢复=拷文件+起库,最快但整库粒度

方法四:硬件与传输

  • dump 先 gunzip 再喂给 mysql 时用管道省落盘:zcat dump.sql.gz | mysql mydb
  • 恢复到 NVMe 盘、内存富余的机器上明显更快
  • 同机恢复用 socket 连接比 TCP 略省

观测云对照

恢复过程也要盯。 长时间恢复期间,DataKit 采集的 MySQL 指标(写入速率、redo、连接)能确认恢复是否健康推进;恢复完成后慢查询与表统计信息(analyze table)也该跟上。

常见问题(FAQ)

Q:恢复中途失败要从头再来吗?
A:autocommit=0 大事务模式下中断会整体回滚,得重来;可以按表拆 dump 分批恢复,失败只重跑当前表。

Q:恢复后查询很慢?
A:统计信息过时,跑 ANALYZE TABLE;索引在恢复期间被延迟创建的版本也要确认索引完整。

Q:为什么 myloader 比 mysql 客户端快那么多?
A:多线程并行导表+每表分批事务,充分利用多核与 I/O 并发;单线程 mysql 客户端是串行逐条。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台