最常用但易卡住的是 mysqldump + mysql 命令;直接执行 mysql -u root -p database_name 可跳过导入环节,适用于已有 SQL 文件需手动导入场景。

恢复大数据量 MySQL 数据库时,mysqldump + mysql 命令最常用但容易卡住
直接用 mysql -u root -p database_name 恢复几十 GB 的 SQL 文件,往往在前几分钟就明显变慢,甚至卡死。这不是磁盘或内存不足,而是默认设置下 MySQL 逐条执行 INSERT、每条都刷日志、还带事务开销。
关键优化点有三个:
- 恢复前执行
SET FOREIGN_KEY_CHECKS=0;和SET UNIQUE_CHECKS=0;,避免约束校验拖慢导入 - 临时关闭自动提交:
SET autocommit=0;,并在每 10000 行左右手动COMMIT;(如果 SQL 文件里没写,需提前用 sed 或脚本拆分) - 用
mysql --disable-reconnect --max-allowed-packet=1G -u root -p database_name ,防止大 INSERT 被截断或连接中断
真正快的方案:用 mysqlpump 或 mydumper + myloader 替代 mysqldump
mysqldump 是单线程、文本导出,对百 GB 级数据已明显过时。mysqlpump(MySQL 5.7+ 自带)支持多线程导出,且能按表并行;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不会自动创建 schema
恢复期间必须调低 innodb_log_file_size 和禁用双写缓冲
默认 innodb_log_file_size(如 48MB)太小,大量 INSERT 会频繁触发 checkpoint,导致 I/O 瓶颈;而 innodb_doublewrite=ON 虽保障崩溃安全,但在恢复这种一次性场景中纯属冗余开销。
采用 php+mysql 数据库方式运行的强大网上商店系统,执行效率高速度快,支持多语言,模板和代码分离,轻松创建属于自己的个性化用户界面 v3.5更新: 1).进一步静态化了活动商品. 2).提供了一些重要UFT-8转换文件 3).修复了除了网银在线支付其它支付显示错误的问题. 4).修改了LOGO广告管理,增加LOGO链接后主页LOGO路径错误的问题 5).修改了公告无法发布的问题,可能是打压
建议在恢复前修改配置(重启 mysqld 或动态设置):
- 临时增大日志文件:
SET GLOBAL innodb_log_file_size = 512*1024*1024;(需先停服务改文件再重启,或使用innodb_log_file_size可动态调整版本) - 关闭双写:
SET GLOBAL innodb_doublewrite = OFF;(仅限恢复阶段,完事后务必设回 ON) - 同时确认
innodb_flush_log_at_trx_commit=2,避免每条 COMMIT 都刷盘
别忽略恢复后的索引重建和统计信息更新
用 mydumper/myloader 或禁用约束导入后,所有二级索引都是空的,后续查询性能极差——不是因为数据没进来,而是索引还没构建完。MySQL 不会在导入时自动批量建索引,而是等第一条 INSERT 触发延迟创建,效率极低。
正确做法是:
- 导入完成后,立刻对大表执行
ALTER TABLE table_name ENGINE=InnoDB;(触发在线索引重建) - 或更精准地用
OPTIMIZE TABLE table_name;(适用于未启用innodb_file_per_table的老实例) - 最后运行
ANALYZE TABLE table_name;更新统计信息,避免优化器选错执行计划
这些步骤不能省,否则你以为恢复完了,实际查询响应时间可能比恢复前还高一倍。










