MySQL 插入一条 SQL 语句,redo log 记录的是什么?
MySQL 插入一条 SQL 语句,redo log 记录的是什么?
回答重点
因为 redo log 是物理日志,记录“某页(Page)某位置的数据被修改为某值”。它不记录逻辑操作(如 “插入一行”),而是直接记录对页的变更。所以在插入操作中,redo log 记录的是事务在数据页上的修改
数据页的插入点、记录的偏移量和插入的实际数据并更新页目录、页头等元数据。
扩展知识
插入操作 redo log 具体执行流程
- 修改缓冲页(Buffer Pool): 数据先写入内存中的缓冲池,而不是直接写入磁盘。
- 生成 redo log: 同时生成一条 redo log,记录插入对数据页的物理修改细节。
- 日志先行(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_logfile0和ib_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