什么是 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 并重放这些操作,确保数据一致性。

posted @ 2025-06-05 01:07  jock_javaEE  阅读(69)  评论(0)    收藏  举报