doc: 阅读mysql undo log物理存储文档

This commit is contained in:
asahi
2025-08-06 12:25:28 +08:00
parent 3383d032a7
commit 965f75a3ee

View File

@@ -424,7 +424,31 @@ undo log的结构如上述所示我们无法控制事务生成undo log的大
> undo log和undo page的对应关系是灵活的既可能一个undo log占用多个undo pages也可能多个undo log共用相同的undo page > undo log和undo page的对应关系是灵活的既可能一个undo log占用多个undo pages也可能多个undo log共用相同的undo page
关于undo log的物理组织方式如下图所示
<img src="https://yqintl.alicdn.com/4680cd1e8572e5f39310973603c43445a49ee236.png" alt="5" title="5">
##### undo segment
每当一个事务开启时都需要持有一个undo segment对于undo segment中磁盘空间的释放和占用对16KB页的释放和占用都由FSP segment进行管理。
undo segment中会至少持有一个undo page并且`每个undo page都会记录undo page header`
##### undo page header
undo page header中包含如下内容
- undo page typeundo page的类型
- last log record offset最后一条记录的offset
- free space offsetpage中空闲空间的offset
- undo page list node指向List中的下一个undo page
undo segment中的第一个undo page除了undo page header外`还会记录undo segment header`
##### undo segment header
undo segment header中包含如下内容
- state该field记录了udno segment的状态TRX_UNDO_CACHED/TRX_UNDO_PURGE
- undo segment中最后一条undo record的位置
- 当前segment被分配的undo page组成的链表
##### undo log storing
undo page中的空间用于存储undo log对于`大小较小的undo log`innodb会对undo page进行reuse在undo page中存储多个undo logs避免浪费空间。而对于大小较大的undo log会使用多个undo page来对该undo log进行存储。undo page reuse只会发生在segment的第一个page
### purge ### purge
`t`中,`a`为聚簇索引,`b`为辅助索引若执行如下sql `t`中,`a`为聚簇索引,`b`为辅助索引若执行如下sql