innodb_log_file_size 曾是 InnoDB 重做日志(Redo Log)的核心参数,但在 MySQL 8.0.30+ 已被 innodb_redo_log_capacity 取代。Redo Log 是 InnoDB 崩溃恢复的基石,保证 ACID 中的持久性(Durability)。


一、核心作用:崩溃恢复的保险柜

Redo Log 的本质

  • 不是 Binlog:Binlog 用于主从复制和时点恢复

  • 是物理日志:记录 "在哪个数据页、哪个偏移、修改了什么"

  • 循环写入:当日志写满,会触发 Checkpoint 刷脏页

innodb_log_file_size 的过去(< 8.0.30)

[mysqld]
innodb_log_files_in_group = 2      # 日志文件数量
innodb_log_file_size = 2G          # 每个文件大小
# 总日志容量 = 2 * 2G = 4G

innodb_redo_log_capacity 的现在(≥ 8.0.30)

[mysqld]
innodb_redo_log_capacity = 4G      # 总容量,MySQL 自动管理文件
# 自动生成 #ib_redo_N 系列文件,大小自适应

优势

  • 动态调整SET GLOBAL innodb_redo_log_capacity = 8G; 在线扩容

  • 自动管理:无需关心文件数量,MySQL 自动创建/删除

  • 性能更好:多文件并发写入减少锁竞争


二、配置方法(8.0.30+)

1. 静态配置(推荐)

[mysqld]
# 首次配置或重启时设置
innodb_redo_log_capacity = 4G

2. 动态在线扩容(无需重启)

-- 查看当前容量
SHOW VARIABLES LIKE 'innodb_redo_log_capacity';  -- 单位:字节

-- 扩容操作
SET GLOBAL innodb_redo_log_capacity = 8 * 1024 * 1024 * 1024;  -- 8GB

-- 监控扩容进度
SHOW STATUS LIKE 'Innodb_redo_log_resize_status';
-- 输出:Innodb_redo_log_resize_status  Complete

3. 查看日志文件

# 数据目录下
ls -lh #ib_redo*

# 示例输出
-rw-r----- 1 mysql mysql 2.0G Sep 15 10:30 #ib_redo_0
-rw-r----- 1 mysql mysql 2.0G Sep 15 10:30 #ib_redo_1
-rw-r----- 1 mysql mysql 2.0G Sep 15 10:30 #ib_redo_2
-rw-r----- 1 mysql mysql 2.0G Sep 15 10:30 #ib_redo_3
# 共 4 个文件,每个 2GB,总容量 8GB

三、科学计算:黄金法则

核心原则:按小时写入量估算

redo_log_capacity = 1 ~ 2 小时的平均写入量

计算步骤

  1. 监控当前每秒写入量

-- 取过去 24 小时平均值
SELECT 
  VARIABLE_VALUE / 86400 / 1024 / 1024 AS avg_mb_per_sec
FROM performance_schema.global_status
WHERE VARIABLE_NAME = 'Innodb_redo_log_written';
  1. 计算每小时写入

avg_mb_per_sec × 3600 = MB/小时

  1. 设置容量

# 示例:平均写入 500MB/秒
# 每小时 1.8TB(极端场景)
# 建议容量 = 2 * 1.8TB = 3.6TB
innodb_redo_log_capacity = 4000G  # 向上取整

经验速查表

TPS/QPS 量级

推荐 Redo 容量

备注

< 1 万

4GB ~ 8GB

默认起步

1 万 ~ 5 万

16GB ~ 32GB

中型业务

5 万 ~ 20 万

64GB ~ 128GB

大型业务

> 20 万

256GB+

按需计算


四、关键监控指标

指标

含义

健康值

Innodb_redo_log_checkpoint_age

当前 Checkpoint 落后日志尾部的距离

< 80% 总容量

Innodb_redo_log_pending_writes

等待写入的日志页面数

< 10

Innodb_redo_log_written

累计写入字节数(持续增长)

-

Innodb_log_waits

因日志满而等待的次数

= 0

危险信号

-- Checkpoint 年龄超过 80% 总容量
SHOW STATUS LIKE 'Innodb_redo_log_checkpoint_age';
-- 如果接近 innodb_redo_log_capacity,说明容量太小

五、最佳实践:过大 vs 过小

⚠️ 太小(如 1GB)

  • 频繁 Checkpoint:刷脏页压力巨大,性能抖动

  • Innodb_log_waits 非零:查询因日志满而阻塞

  • 写入吞吐量下降:TPS 被日志容量限制

⚠️ 太大(如 1TB on 16GB RAM)

  • 恢复时间极长:崩溃后恢复需数小时甚至数天

  • 浪费磁盘空间:.ibd 文件占用巨大

  • 恢复期间业务无法启动

✅ 平衡选择

[mysqld]
# 场景:16GB RAM,写入量中等
innodb_redo_log_capacity = 12G  # 物理内存的 75%,但不超过 2 小时写入量

# 场景:64GB RAM,高并发写入
innodb_redo_log_capacity = 64G  # 物理内存的 100%,但需监控 Checkpoint

六、与 innodb_flush_log_at_trx_commit 的联动

参数值

含义

Redo Log 刷盘策略

性能与持久性

1(默认)

每次事务提交刷盘

最安全,每次 commit 都 fsync

性能最差,数据零丢失

2

事务提交写 OS 缓存

每秒 fsync 一次

性能好,OS 崩溃可能丢 1 秒数据

0

每秒刷盘一次

不保证 commit 时落盘

性能最好,MySQL 崩溃可能丢 1 秒

配置建议 :

[mysqld]
innodb_flush_log_at_trx_commit = 1  # 必须!金融级场景
innodb_redo_log_capacity = 8G       # 容量影响刷盘频率

注意 :innodb_flush_log_at_trx_commit = 20 时,Redo Log 容量对性能影响较小。


七、MySQL 8.0.30+ 的完全体配置

[mysqld]
# 1. Redo Log 容量(核心)
innodb_redo_log_capacity = 32G

# 2. 刷盘策略(配置为 1,安全第一)
innodb_flush_log_at_trx_commit = 1
innodb_log_buffer_size = 64M  # 缓冲,默认 16MB,可适当增大

# 3. 并发写入优化
innodb_log_writer_threads = ON  # 8.0+ 默认 ON,并发写日志

# 4. 灾难恢复相关
innodb_fast_shutdown = 1  # 正常关闭,1 足够
innodb_log_spin_cpu_abs_lwm = 80  # CPU 等待阈值
innodb_log_spin_cpu_pct_hwm = 50  # CPU 使用率阈值

八、常见问题与解答

  1. 为什么 8.0.30+ 官方推荐使用 innodb_redo_log_capacity
    因为动态扩容无需重启,适合云原生和容器化部署。

  2. innodb_log_file_size 迁移到 innodb_redo_log_capacity 需要重启吗?
    需要一次干净重启:先设置 innodb_fast_shutdown = 0,关闭实例,修改配置,再启动。

  3. Redo Log 容量会影响 Binlog 吗?
    完全独立。Redo Log 是 InnoDB 内部机制,Binlog 是 MySQL Server 层逻辑日志。


九、完整配置示例

场景 1:16GB RAM 电商库(高写入)

[mysqld]
innodb_redo_log_capacity = 16G  # 1 小时写入约 8GB,留 2 倍余量
innodb_flush_log_at_trx_commit = 1
innodb_log_buffer_size = 32M

场景 2:64GB RAM 大数据分析(批量写入)

[mysqld]
innodb_redo_log_capacity = 64G  # 批量导入大表需要大日志
innodb_flush_log_at_trx_commit = 2  # 可接受少量数据丢失,追求性能
innodb_log_buffer_size = 128M

十、总结与决策树

MySQL 版本 ≥ 8.0.30 ? → 是 → 使用 innodb_redo_log_capacity
                     ↓
                     否 → 使用 innodb_log_file_size + innodb_log_files_in_group

总容量 = 2 小时写入量
       ↓
innodb_flush_log_at_trx_commit = 1 ? → 是 → 容量影响性能
                                   ↓
                                   否 → 容量可适当减小

版本

推荐配置

是否动态

默认值

迁移成本

≤ 8.0.29

innodb_log_file_size=2G × 2

48MB × 2

≥ 8.0.30

innodb_redo_log_capacity=8G

100MB × 2

核心记忆点
MySQL 8.0.30+ 用 innodb_redo_log_capacity 替代旧参数,容量按小时写入量估算,Checkpoint 年龄 < 80% 为健康,刷盘策略优先设为 1