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

Sherwin.Wei Lv7

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

回答重点

因为 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 的内容,逐条重放操作,完成数据恢复。
Comments