恢复时磁盘写满或mysqld卡死,首要措施是停库后在my.cnf中关闭innodb_doublewrite=OFF(仅限临时恢复),完成后必须重启并设回ON;同时将innodb_buffer_pool_size临时调至物理内存50%–60%,恢复后动态调回。

恢复时磁盘写满或mysqld卡死,先关掉innodb_doublewrite
MySQL 8.0.20+ 默认开启双写缓冲(innodb_doublewrite),恢复期间会额外写一份页副本到系统表空间,IO翻倍。尤其在SSD容量紧张或RAID卡缓存关闭时,极易触发写阻塞。
实操建议:
- 停库后,在
my.cnf的[mysqld]段加innodb_doublewrite=OFF,再启动恢复 - 仅限**临时恢复场景**——恢复完成必须重启并设回
ON,否则崩溃可能丢数据 - 5.7及更早版本无此配置项,但可通过
innodb_doublewrite_file指向低IO路径缓解
mysqlbinlog --read-from-remote-server拉取日志太慢
从主库实时拉取binlog做PITR时,网络延迟+单线程解析会让mysqlbinlog成为瓶颈,表现为CPU低、IO低、恢复进度条长期不动。
实操建议:
- 改用
--base64-output=DECODE-ROWS --verbose跳过文本解码开销 - 加
--stop-datetime或--stop-position精准截断,避免拉完整日志再过滤 - 若主库支持,优先用
xtrabackup --incremental替代binlog恢复,减少IO放大
innodb_buffer_pool_size设太高反而拖慢恢复
恢复期间大量页载入+刷脏,如果innodb_buffer_pool_size占物理内存90%以上,OS缺页中断飙升,mysqld频繁被swap,恢复时间可能延长3–5倍。
实操建议:
- 恢复前临时调低至物理内存的50%–60%,例如64G机器设为
32G - 确认
vm.swappiness=1(非0),防止内核主动swap进程内存 - 恢复完成后立即调回原值,无需重启,执行
SET GLOBAL innodb_buffer_pool_size = 53687091200;即可
用LOAD DATA INFILE恢复大表时IO打满
直接导入CSV/TSV时,默认每行一个事务+逐行校验,小文件尚可,GB级文件会导致磁盘持续100%写入,且innodb_log_file_size易爆满报错ERROR 1114 (HY000): The table is full。
实操建议:
- 先导出时用
--fields-terminated-by='\t' --lines-terminated-by='\n',导入时匹配格式,避免解析开销 - 导入前执行
SET unique_checks=0; SET foreign_key_checks=0;,关掉约束校验 - 关键:把
innodb_log_file_size临时加大到至少2G(需停库修改配置并重建日志文件)
恢复IO压力本质是「写放大」和「资源争抢」的叠加,最常被忽略的是innodb_doublewrite开关时机和buffer_pool的动态调整窗口——这两个点不手动干预,其他优化效果有限。











