Redo Log 容量是什么
Redo Log 是 InnoDB 的循环写入日志,事务提交先写它再异步刷脏页,因此容量直接决定崩溃恢复时间与写入吞吐。MySQL 8.0.30 起由 innodb_redo_log_capacity 一个参数统一管理,默认 100M;旧版本用 innodb_log_file_size 乘 innodb_log_files_in_group 组合。容量偏小会频繁触发 checkpoint,刷脏页压力上升,写入被拖慢。
基本信息
| 适用版本 | innodb_redo_log_capacity 需 8.0.30 及以上 |
|---|---|
| 旧参数 | innodb_log_file_size / innodb_log_files_in_group,8.0.30 起废弃 |
| 默认值 | 100M,对写密集实例偏小 |
| 文件位置 | 8.0.30+ 位于 datadir 下的 #innodb_redo 目录 |
| 建议取值 | 写密集库 1G 到 4G 起步,再按 checkpoint 压力调整 |
典型使用场景
- 写密集实例调优:把 redo 容量调大,减少 checkpoint 频率提升吞吐
- 大事务或批量导入前评估:单个大事务可能撑满 redo,导致日志覆盖等待
- 监控 checkpoint 压力:看 Log sequence number 与 Last checkpoint 的差距
- 容量规划:redo 文件常驻磁盘,扩容前确认磁盘余量
- 版本升级核对:升到 8.0.30 后旧参数被取代,配置要跟着改
- 崩溃恢复评估:redo 越大重启恢复时间越长,需要与业务容忍度权衡
查看与调整
查看与调整
SHOW VARIABLES LIKE 'innodb_redo_log_capacity'; # 8.0.30+ 的唯一入口
SET GLOBAL innodb_redo_log_capacity = 4294967296; # 调到 4G
SHOW VARIABLES LIKE 'innodb_log_file%'; # 旧参数,8.0.30 起已废弃
SHOW ENGINE INNODB STATUS\G # 看 LOG 段的 LSN 与 checkpoint 差值
SELECT @@innodb_redo_log_capacity/1024/1024 AS mb; # 换算成 MB 便于记录
-- 落地到配置文件(重启后仍生效)
-- [mysqld]\n-- innodb_redo_log_capacity = 4G相关参数读法
| 参数 | 含义 | 调整影响 |
|---|---|---|
| innodb_redo_log_capacity | redo 总容量,8.0.30+ 生效 | 调大减少 checkpoint 频率,恢复时间变长 |
| innodb_log_file_size | 旧版单文件大小,已废弃 | 8.0.30+ 配置它不再产生预期效果 |
| innodb_log_files_in_group | 旧版文件个数,已废弃 | 与上一条成对出现,需同步核对 |
| innodb_flush_log_at_trx_commit | redo 刷盘时机,1 为每次提交 | 与容量无关,但共同决定持久化级别 |
8.0.30 之前修改 innodb_log_file_size 必须干净关闭实例并删除旧 ib_logfile 文件,操作不当会导致实例起不来;升级到 8.0.30 以后不要再动旧参数。
8.0.30+ 的 redo 由 32 个文件组成并动态调整,不需要人工删除文件即可在线扩容;旧文档里的删文件步骤在新版本反而会带来风险。
redo 容量与 innodb_flush_log_at_trx_commit 是两件事:前者决定能攒多少日志、checkpoint 频率与崩溃恢复时间,后者决定每次提交是否刷盘;调优前先分清瓶颈在提交延迟还是 checkpoint 压力。