必须先执行set global innodb_fast_shutdown = 0;再shutdown;确保日志刷盘,否则修改innodb_log_file_size或innodb_redo_log_capacity后重启会因日志不一致而失败。

直接删 ib_logfile0 和 ib_logfile1 会启动失败
MySQL 启动时校验 innodb_log_file_size 和实际日志文件大小是否一致。手动删除或重命名日志文件后,InnoDB 发现文件不存在或尺寸不匹配,直接报错退出,常见错误是:InnoDB: The log sequence number in ibdata files does not match the log sequence number in the ib_logfiles 或更直白的 Cannot initialize InnoDB due to invalid log file size。
实操建议:
- 必须先停掉 MySQL 服务(
systemctl stop mysqld或service mysql stop) - 确认当前配置值:
SELECT @@innodb_log_file_size;或查配置文件里的innodb_log_file_size - 删之前备份原日志文件(哪怕只是挪走):
mv ib_logfile0 ib_logfile0.bak,mv ib_logfile1 ib_logfile1.bak - 修改配置文件(如
/etc/my.cnf),调整innodb_log_file_size值,比如从 48M 改成 256M - 重启 MySQL —— 此时 InnoDB 会自动重建日志文件,大小按新配置来
改 innodb_log_file_size 前必须清空事务日志缓冲区
这个参数不是热生效的,也不能在线改。InnoDB 要求在干净关机状态下变更,否则残留的未刷盘日志会导致恢复失败。如果上次是 kill -9 或崩溃退出,ib_logfile* 里可能还有活动事务的 redo 记录,强行重建会丢数据或卡在 crash recovery 阶段。
实操建议:
- 执行
SET GLOBAL innodb_fast_shutdown = 0;(等价于完全关闭,刷干净所有脏页和日志) - 再执行
SHUTDOWN;(用 SQL 关机,比systemctl stop更可靠) - 检查错误日志末尾是否有
InnoDB: Shutdown completed,确认落盘完成 - 不要跳过这步直接停服务——尤其在生产库上,
fast_shutdown=1(默认)会跳过部分清理,后续重建日志大概率失败
innodb_log_file_size 不是越大越好,得看写入压力和恢复时间
调大能减少 checkpoint 频率、提升高并发写性能,但代价是崩溃后 recovery 时间变长(InnoDB 要重放更多 redo 日志)。比如从 48M 改到 1G,单次 recovery 可能从几秒拖到几分钟。
实操建议:
- 一般建议总日志容量(
innodb_log_files_in_group × innodb_log_file_size)控制在 1–2GB 以内,MySQL 5.6+ 默认是 2 个文件,所以单个设 512M 比较平衡 - 观察
SHOW ENGINE INNODB STATUS\G里的Log sequence number和Last checkpoint at差值,如果差值长期接近 75% 的总日志容量,说明当前 size 偏小、频繁 checkpoint - SSD 机器可适当调大;机械盘或对启停时间敏感的环境,保守点设 128–256M 更稳妥
- 注意:MySQL 8.0.30+ 开始支持动态调整
innodb_redo_log_capacity(替代旧参数),但仅限新初始化实例,老实例仍要走重建流程
MySQL 8.0+ 用 innodb_redo_log_capacity 替代旧方式,但迁移逻辑没变
8.0.30 引入了新机制,innodb_log_file_size 被标记为 deprecated,改用 innodb_redo_log_capacity 控制总 redo 空间。但它底层仍是预分配一组文件(不再是固定两个),且依然不支持在线扩容——删文件 + 改配置 + 重启的三步法没变,只是文件名变成 #ib_16384_0.dblib 这类。
实操建议:
- 查看当前容量:
SELECT * FROM performance_schema.innodb_redo_log_files; - 设置新值前,同样要
SET GLOBAL innodb_fast_shutdown = 0;+SHUTDOWN; - 配置文件中改
innodb_redo_log_capacity = 1073741824(即 1G),重启后会自动创建新 redo 文件组,旧文件被忽略(但不会自动删,得手动清理) - 别混用:如果已启用了
innodb_redo_log_capacity,再配innodb_log_file_size会被忽略,且错误日志里会有 warning 提示
最常被忽略的一点:无论哪个版本,只要改了日志相关参数,就必须确保 innodb_fast_shutdown = 0 再关机。跳过这步,等于把未刷盘的日志状态“冻”在磁盘上,重启时 InnoDB 既读不到完整上下文,又不敢乱猜,只能报错退出——这时候翻日志看到的往往是一串看似无关的 recovery 错误,根源却在 shutdown 方式不对。











