什么是 Redo Log ?
一、定义
Redo Log(重做日志) 是 MySQL 数据库中的一种日志文件,用于记录对数据页的修改操作, 它的主要作用是确保事务持久性 和 崩溃恢复能力。
当数据库发生故障时,Redo Log 可以确保已提交的事务不会丢失,即使这些事务的修改尚未写入磁盘。
二、Redo Log 的作用
-
事务持久性保证:确保已提交的事务被记录在日志中,即使数据页尚未写入磁盘
-
崩溃恢复:在数据库崩溃后,通过 Redo Log 重放日志,将未持久化的数据恢复到最新状态
三、Redo Log 的工作原理
Redo Log 的工作流程可以分为以下几个步骤:
1、事务开始:
- 当一个事务开始时,MySQL 会为该事务分配一个日志空间,用于记录该事务的修改操作
2、记录修改操作:
- 当事务对数据页进行修改时,MySQL 会将修改操作 (如“将第 X 页的第 Y 行从 A 改为 B”)记录到 Redo Log 中
3、日志刷盘(Flush to Disk):
-
为了保证持久性,MySQL 会定期将 Redo Log 写入磁盘(称为 日志刷盘)。
-
刷盘的时机包括:
-
事务提交时(commit)。
-
后台线程定期刷盘。
-
系统空闲时。
-
4、事务提交:
- 当事务提交时,MySQL 会确保该事务的 Redo Log 已经写入磁盘,然后才返回提交成功
5、崩溃恢复:
- 如果数据库崩溃,MySQL 会在启动时读取 Redo Log,并重放日志中的操作,将未持久化的数据恢复到最新状态。
四、Redo Log 的存储结构
Redo Log 通常由多个固定大小的日志文件组成,形成一个循环写入的日志组。
例如,默认情况下,MySQL 会创建两个 Redo Log 文件(ib_logfile0 和 ib_logfile1),每个文件大小为 48MB(可配置)。
-
循环写入:
-
Redo Log 采用循环写入的方式,当当前日志文件写满时,会切换到下一个日志文件继续写入。
-
如果所有日志文件都写满,则覆盖最早的日志文件。
-
-
检查点(Checkpoint):
-
为了减少崩溃恢复时的工作量,MySQL 会定期将脏页(已修改但未写入磁盘的数据页)写入磁盘,并更新检查点。
-
检查点是一个标记,表示 Redo Log 中哪些部分已经被持久化到磁盘。
-
五、Redo Log 与 Bin Log 的区别
| 特性 | Redo Log | Bin Log |
|---|---|---|
| 用途 | 确保事务持久性和崩溃恢复 | 数据备份、主从复制 |
| 记录内容 | 数据页的修改操作 | SQL 语句或二进制格式的变更 |
| 写入方式 | 顺序写入,循环使用 | 顺序写入,不循环 |
| 刷盘时机 | 事务提交时、后台线程定期刷盘 | 事务提交时、每条语句(根据配置) |
| 存储位置 | InnoDB 引擎专用(ib_logfileX) | 独立文件(bin.log) |
六、Redo Log 的配置参数
1、innodb_log_file_size:
-
每个 Redo Log 文件的大小,默认值为 48MB
-
增大该值可以减少日志切换的频率,但会增加单次刷盘的时间
2、innodb_log_files_in_group:
-
Redo Log 文件的数量,默认值为 2
-
增大该值可以提高日志切换的间隔时间
3、innodb_flush_log_at_trx_commit:
-
事务提交时 Redo Log 的刷盘机制
-
可选值:
-
0:事务提交时不刷盘,依赖后台线程定期刷盘(性能高,但风险较大)
-
1:事务提交时立即刷盘(最安全,但性能较低)
-
2:事务提交时写入日志缓冲区,并强制文件系统同步(折中方案)
-
七、Redo Log 的示例
假设有一个事务执行以下操作:
1、更新表 users 中用户 ID 为 1 的姓名
2、插入一条新记录到表 orders
Redo Log 的记录可能如下:

在事务提交时,会将 Redo Log 日志刷盘到磁盘中。如果数据库崩溃,MySQL 会读取 Redo Log 并重放这些操作,确保数据一致性。

浙公网安备 33010602011771号