mysql 8.0.30+ 必须使用 innodb_redo_log_capacity 配置 redo log 总容量(字节),废弃 innodb_log_file_size;在线调整立即生效,innodb 自动管理约32个日志文件,无需手动干预大小或数量。

MySQL 8.0.30+ 必须用 innodb_redo_log_capacity,别碰 innodb_log_file_size
如果你用的是 MySQL 8.0.30 或更高版本(当前最新稳定版是 8.0.34),innodb_log_file_size 已被彻底废弃。配置里还留着它,启动时会报警告 [Warning] [MY-013869] Ignored deprecated configuration parameter innodb_log_file_size,值直接被忽略;若同时设了 innodb_redo_log_capacity,再写 innodb_log_file_size 会导致启动失败:Unknown variable 'innodb_log_file_size'。
正确做法只设 innodb_redo_log_capacity,单位是字节,控制 Redo Log 总容量。InnoDB 自动维护约 32 个日志文件(如 #ib_redo31),每个大小 = 总容量 ÷ 32 —— 你不需要、也不应该手动干预文件数量或单个大小。
- 在线调整:
SET GLOBAL innodb_redo_log_capacity = 4294967296;(即 4GB),命令立即生效,底层文件切换是渐进式,几秒到几分钟内完成 - 持久化:在
my.cnf的[mysqld]段写下innodb_redo_log_capacity = 4294967296,重启后仍有效 - 千万别混用:删掉所有
innodb_log_file_size和innodb_log_files_in_group配置项,否则实例根本起不来
MySQL 8.0.29 及更早版本必须停库删文件才能改 innodb_log_file_size
旧机制下,Redo Log 总大小 = innodb_log_file_size × innodb_log_files_in_group(默认为 2)。这个参数是静态的,运行中无法 SET GLOBAL 修改,强行改配置后重启必失败,报错:InnoDB: Error: log file ./ib_logfile0 is of different size。
正确流程是:
- 先执行
SET GLOBAL innodb_fast_shutdown = 0;(确保脏页全部刷盘) -
systemctl stop mysqld,再确认ps aux | grep mysqld无残留进程 -
rm -f /var/lib/mysql/ib_logfile[0-9]*(路径以datadir为准) - 修改
my.cnf,例如设innodb_log_file_size = 1G - 启动服务,InnoDB 会自动创建新大小的日志文件
常见误操作:只改配置不删文件,或删了文件但没关干净进程,结果启动卡在 “Initializing database” 或反复报 Cannot open ./ib_logfile0。
怎么算出适合大批量写入的 innodb_redo_log_capacity 值?
目标不是“越大越好”,而是让崩溃恢复时间(RTO)可控,同时避免频繁 checkpoint 导致写入卡顿。核心依据是你业务高峰持续 30~60 秒的真实写入速率 —— 不是平均值。
查当前每秒 Redo 写入量:
mysql -e"SHOW GLOBAL STATUS LIKE 'Innodb_os_log_written';"
记下数值,等 60 秒再查一次,差值 ÷ 60 = 字节/秒。例如测得 120 MB/s,按 1.5 小时缓冲算:120 * 1024 * 1024 * 3600 * 1.5 ≈ 648 GB。
- OLTP 场景常见值是 1–8 GB,但那是小流量场景;大批量写入(如日志归集、批量导入)必须实测峰值
- 恢复时间主要取决于未 checkpoint 的日志量(
Uncheckpointed Bytes),不是总容量;如果写入压不上去,盲目调大没意义 - 调完后务必用
SELECT @@innodb_redo_log_capacity;和SELECT * FROM performance_schema.innodb_redo_log_files;验证是否生效
为什么不能只看磁盘上的 ib_logfile* 文件大小?
8.0.30+ 版本日志文件名已变(如 #ib_redo31),且旧版本重启后文件会被重建,大小由配置驱动而非文件本身。直接 ls -lh ib_logfile* 看到的只是历史残留或旧配置残留,完全不可信。
真正该查的是:
- 当前总容量(8.0.30+):
SELECT @@innodb_redo_log_capacity; - 文件分布和状态(8.0.30+):
SELECT * FROM performance_schema.innodb_redo_log_files;,字段type区分ordinary(活跃)和spare(待用) - 旧版本(≤8.0.29)可查变量:
SHOW VARIABLES LIKE 'innodb_log_file_size';和SHOW VARIABLES LIKE 'innodb_log_files_in_group';
实际容量是动态的,尤其在线调整后,底层文件切换有延迟,performance_schema.innodb_redo_log_files 才反映真实状态 —— 这点最容易被忽略。











