Mysql--基础知识点--102--redo log内容

张开发
2026/4/18 17:29:21 15 分钟阅读

分享文章

Mysql--基础知识点--102--redo log内容
下面以InnoDB 存储引擎的 redo log 为例给出一个典型的UPDATE 操作产生的 redo log 内容示例。环境准备假设有一张表CREATETABLEt1(idINTPRIMARYKEY,nameVARCHAR(20))ROW_FORMATCOMPACT;执行更新BEGIN;UPDATEt1SETnameBobWHEREid1;COMMIT;redo log 内容简化示例InnoDB 的 redo log 是一组物理日志记录了对某个数据页page的修改。上述 UPDATE 大致会产生类似下面的记录十六进制表示实际结构更复杂此处做合理简化--- 事务开始 --- [MLOG_1BYTE] space_id0, page_no4, offset100, value0x01 (标记页内某标志位) [MLOG_REC_UPDATE] space_id0, page_no4, offset128, old_value: {id:1, name:Alice} new_value: {id:1, name:Bob} --- 事务提交 --- [MLOG_GROUP_COMMIT_ID] ... (提交信息)或者更贴近真实结构的记录类似ib_logfile中的原始格式# 一段 redo log block 的十六进制 dump 0x00000000 5a 2b 4c 02 00 00 00 00 00 00 00 1f 00 00 02 03 |ZL.............| 0x00000010 00 00 00 04 00 00 00 80 00 00 00 01 02 00 00 00 |................| ... # 实际含义 # type MLOG_REC_UPDATE (0x1f) # space 0 # page_no 4 # offset 128 # old len 20, new len 20 # old name Alice # new name Bob更直观的模拟示例为了便于理解可以用伪代码形式表示一条 redo 记录{type:MLOG_REC_UPDATE,space_id:0,page_no:4,page_offset:128,record_old:{id:1,name:Alice},record_new:{id:1,name:Bob},undo_ptr:0x7F3A2B4C,checksum:0xABCD1234}关键点说明物理日志redo log 记录的是对某个数据页具体字节的修改而非 SQL 语句。所以即使相同的 UPDATE 语句redo log 内容也取决于当时数据页的位置。循环写入redo log 是固定大小、循环覆盖写入的。示例中只展示了一条记录实际一组事务可能对应数十条甚至更多 redo 记录。组提交多个并发事务的 redo 日志可能一起写入提高性能。崩溃恢复MySQL 崩溃重启后会扫描 redo log根据这些记录重放所有已提交事务的修改并将未提交事务的回滚。查看真实 redo log 的工具如果你在自己的 MySQL 环境中想查看真实的 redo log 内容可以使用以下工具innodb_log_infoMySQL 8.0 自带hexdump直接查看ib_logfile0文件Percona 的innodb_log_parser第三方工具不过原始文件是二进制格式直接查看很难解读通常只有在调试 InnoDB 内部时才会分析。

更多文章