什么是 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号
浙公网安备 33010602011771号