MySQL 插入一条 SQL 语句,redo log 记录的是什么?

Sherwin.Wei Lv7

回答重点

因为 redo log 是物理日志,记录“某页(Page)某位置的数据被修改为某值”。它不记录逻辑操作(如 “插入一行”),而是直接记录对页的变更。所以在插入操作中,redo log 记录的是事务在数据页上的修改

数据页的插入点、记录的偏移量和插入的实际数据并更新页目录、页头等元数据

扩展知识

插入操作 redo log 具体执行流程

  1. 修改缓冲页(Buffer Pool): 数据先写入内存中的缓冲池,而不是直接写入磁盘。
  2. 生成 redo log: 同时生成一条 redo log,记录插入对数据页的物理修改细节。
  3. 日志先行(Write-Ahead Logging, WAL): redo log 先被写入磁盘上的 redo log 文件。

例如,插入操作影响到了数据页 100(第一百页):

1
Page: 100, Offset: 50, Length: 20, Insert: "New Record Data"

redo log 的两阶段提交

redo log 的部分源码实现(以 InnoDB 为例)

1)redo log 结构:

  • redo log 通常以循环方式存储,文件组可以包括多个日志文件(如 ib_logfile0ib_logfile1)。
  • 日志记录以字节形式存储,对应插入的页和偏移量。

2)日志写入:

redo log 的写入通过 InnoDB 的 log_write_up_to() 方法完成:

1
void log_write_up_to(lsn_t lsn);

lsn(Log Sequence Number)是 redo log 的全局唯一序列号,标记日志的顺序。

3)插入场景日志内容:

  • 插入时的具体内容由 trx_write_redo() 函数生成,核心部分记录页偏移、操作类型(插入/修改)、以及修改的数据。

4)日志重做:

  • 数据恢复时,log_recover() 函数读取 redo log 的内容,逐条重放操作,完成数据恢复。