一、Redo Log 的作用
-
保证事务持久性(Durability)
当事务提交时,InnoDB 会先将修改内容写入 Redo Log,然后再写入磁盘数据页。即使数据库突然宕机,也可以通过 Redo Log 恢复已提交事务的数据。 -
崩溃恢复(Crash Recovery)
数据库重启时,InnoDB 会根据 Redo Log,将未持久化到数据页的已提交事务操作“重做”,保证数据一致性。 -
提升性能
利用 Redo Log,可以先将日志顺序写入磁盘,后续再批量刷新数据页,减少随机写,提高性能。
二、Redo Log 的结构
1. 文件结构
- Redo Log 由一组固定大小的日志文件组成,默认名为
ib_logfile0,ib_logfile1等。 - 可以通过参数
innodb_log_file_size和innodb_log_files_in_group配置大小和数量。
2. 日志内容
- Redo Log 记录的是数据页的物理修改(页号、偏移量、修改内容等),属于物理日志。
- 不记录 SQL 语句,只记录数据页的变化。
3. 日志环形写入
- Redo Log 文件组成一个环形空间,写满后会循环覆盖旧日志(前提是旧日志已经“刷盘”并不再需要)。
三、Redo Log 的工作流程
1. 写入流程
- 事务修改数据页时,先将修改内容写入 Redo Log Buffer(内存)。
- 根据事务提交策略(如
innodb_flush_log_at_trx_commit),将 Redo Log Buffer 刷新到磁盘文件(ib_logfile)。 - 后续由后台线程(如 InnoDB 的 checkpoint 机制)将数据页同步到磁盘。
2. 刷盘策略
innodb_flush_log_at_trx_commit参数控制 Redo Log 的刷盘时机:- 1:每次事务提交都立即刷盘(最安全,最慢)。
- 2:每秒刷盘一次,事务提交只写入内存(性能高但有丢失风险)。
- 0:后台线程周期性刷盘,事务提交只写入内存(风险最大)。
3. Checkpoint 机制
- Checkpoint 是指将数据页的修改同步到磁盘,并标记哪些 Redo Log 已经“安全”。
- Checkpoint 后,旧的 Redo Log 可被覆盖,保证日志空间不会无限增长。
四、Redo Log 的恢复过程
- 数据库异常宕机后重启,InnoDB 会扫描 Redo Log,从最近的 Checkpoint 开始,将未落盘的数据页修改“重做”到数据文件,保证数据一致性。
五、Redo Log 与 Undo Log 的区别
| 方面 | Redo Log | Undo Log |
|---|---|---|
| 作用 | 崩溃恢复、持久化 | 回滚、MVCC、快照读 |
| 内容 | 记录数据页的物理修改 | 记录数据修改前的旧值 |
| 写入时机 | 数据修改后 | 数据修改前 |
| 事务提交时处理 | 需要持久化写盘 | 部分立即清理,部分延迟清理 |
| 存储位置 | ib_logfile* 文件 | Undo 表空间 |
六、Redo Log 相关参数
innodb_log_file_size:单个 Redo Log 文件大小,建议根据写入压力适当增大。innodb_log_files_in_group:Redo Log 文件数量,通常为2。innodb_flush_log_at_trx_commit:控制刷盘时机,影响性能与安全性。innodb_log_buffer_size:Redo Log Buffer 大小。
七、性能优化建议
-
合理设置 Redo Log 文件大小
大文件可以减少 checkpoint 频率,提高性能,但恢复时间也会变长。 -
根据业务安全需求设置刷盘策略
对数据安全性高要求建议设置为1,对性能要求高可考虑2或0(但有丢失风险)。 -
监控 Redo Log 使用情况
可通过SHOW ENGINE INNODB STATUS;查看 Redo Log 写入和 checkpoint 进度。
八、典型问题分析
-
Redo Log 文件过小
- 容易频繁 checkpoint,影响性能。
- 建议根据业务写入压力适当增大。
-
刷盘策略不合理
- 设置为0或2可能导致数据丢失,需权衡性能和安全。
-
恢复时间长
- Redo Log 文件越大,崩溃恢复时间越长。
九、Redo Log 与 Binlog 的区别
| 方面 | Redo Log | Binlog |
|---|---|---|
| 归属 | InnoDB引擎 | MySQL Server层 |
| 类型 | 物理日志 | 逻辑日志(SQL/Row) |
| 作用 | 崩溃恢复 | 主从复制、点时间恢复 |
| 写入时机 | 数据页修改后 | 事务提交后 |
| 可见性 | 只有InnoDB用 | 用户可读、可解析 |
十、源码简析
- Redo Log 相关源码主要在
log0log.cc、log0recv.cc、log0write.cc等文件中。 - 实现了日志缓冲、刷盘、恢复、checkpoint 等机制。
十一、实践建议
- 业务高并发写入时,适当增大 Redo Log 文件大小。
- 定期监控 Redo Log 空间和 checkpoint 进度,避免日志写满导致阻塞。
- 根据业务安全要求调整刷盘策略,避免数据丢失。
- 升级 Redo Log 文件配置时,需先关闭数据库,删除旧日志文件。
十二、Redo Log 的内部结构
1. 日志条目(Log Record)
Redo Log 记录的是数据页的物理修改。每个日志条目包含:
- 页号(Page Number)
- 修改偏移量(Offset)
- 修改前后的数据
- 操作类型(插入、更新、删除)
- 事务ID
- 日志序列号(LSN,Log Sequence Number)
2. LSN(日志序列号)
- 每次写入 Redo Log 时都会生成递增的 LSN。
- 数据页也会标记自己的 LSN,表示其最新一次被修改的日志序列号。
- Checkpoint 也会记录一个 LSN,表示数据文件已经持久化到哪个位置。
3. 环形日志文件
- Redo Log 文件以环形方式写入。
- 当前写入点称为 write pos,checkpoint点称为 checkpoint pos。
- 只有 checkpoint 之前的日志可以被覆盖,之后的日志必须保留。
十三、Redo Log 的写入流程
- 数据页修改时
- 首先将修改记录写入 Redo Log Buffer(内存)。
- 事务提交时
- 根据
innodb_flush_log_at_trx_commit参数,将 Redo Log Buffer 刷新到磁盘日志文件。
- 根据
- 后台定期刷盘
- 即使事务未提交,后台线程也会周期性将 Redo Log Buffer 刷新到磁盘,防止数据丢失。
十四、Checkpoint机制详解
Checkpoint 的作用
- 将数据页的修改同步到磁盘。
- 标记哪些 Redo Log 已经不再需要,可以被覆盖。
- 降低崩溃恢复时需要重做的日志量。
Checkpoint 触发时机
- Redo Log 文件空间不足时,强制触发 checkpoint。
- 后台线程定期触发 checkpoint。
- 事务提交频繁时,可能更快触发。
Checkpoint 的实现步骤
- 找出需要持久化的数据页(脏页)。
- 将这些页写入磁盘。
- 更新 checkpoint LSN,释放旧的日志空间。
十五、崩溃恢复原理
-
数据库重启时
- InnoDB 读取 checkpoint LSN。
- 从 checkpoint 之后的 Redo Log 开始,依次“重做”所有未落盘的数据页修改。
- 保证所有已提交事务的数据都能恢复。
-
未提交事务的数据不会被重做
- Redo Log 只保证已提交事务的持久性,未提交事务会通过 Undo Log 回滚。
十六、Redo Log 与 Binlog 的两阶段提交
为什么需要两阶段提交?
- Redo Log 属于 InnoDB 层,Binlog 属于 MySQL Server 层。
- 事务提交时需要保证两者一致,否则主从复制、点时间恢复会出问题。
两阶段提交流程
- 写入 Redo Log(prepare)
- 事务先写入 Redo Log,标记为“准备提交”。
- 写入 Binlog
- 再写入 Binlog。
- 提交 Redo Log(commit)
- 最后将 Redo Log 标记为“已提交”。
这样即使宕机,只要 Binlog 和 Redo Log都完整,就能保证数据一致性。
十七、常见问题分析
-
Redo Log 写满导致阻塞
- 日志空间不够,无法继续写入,业务可能阻塞。
- 解决方法:增大日志文件大小,优化 checkpoint 频率。
-
崩溃恢复慢
- 日志文件太大,恢复时需要重做的操作太多。
- 解决方法:平衡日志文件大小与恢复速度。
-
刷盘策略不合理导致数据丢失
- 设置为0或2时,可能丢失部分已提交事务。
- 解决方法:线上建议设置为1,保证安全。
十八、实际运维建议
-
合理规划 Redo Log 文件大小
- 写入压力大时建议设置为1GB及以上。
- 需提前规划,修改需停库并删除旧日志文件。
-
监控 Checkpoint 和日志空间占用
- 通过
SHOW ENGINE INNODB STATUS监控Log sequence number和Checkpoint。 - 发现写入点接近 checkpoint 时,需关注是否有空间不足风险。
- 通过
-
定期测试恢复流程
- 定期做崩溃恢复演练,确保 Redo Log 能正确恢复数据。
-
刷盘策略选择
- 生产环境建议
innodb_flush_log_at_trx_commit=1,保证事务安全。 - 测试环境可以用2或0提升性能。
- 生产环境建议
十九、源码简析(补充)
- Redo Log Buffer 管理:
log0buf.cc - 日志写入与刷盘:
log0write.cc - 恢复流程:
log0recv.cc - Checkpoint 实现:
log0chkpt.cc
源码中大量使用 LSN 进行日志条目和数据页的关联,保证一致性。
二十、总结
Redo Log 是 InnoDB 实现事务持久性和崩溃恢复的核心机制。合理规划和监控 Redo Log,有助于提升数据库的安全性和性能。
1367

被折叠的 条评论
为什么被折叠?



