doc: 阅读undo log文档

This commit is contained in:
asahi
2025-07-14 12:58:47 +08:00
parent fa0a80f1f9
commit 92dc46a702

View File

@@ -290,11 +290,32 @@ innodb通过segment来管理undo log其管理方式如下
每个rollback segments支持的事务数量由`rollback segment中undo slot的数量``每个事务需要的undo log数量`来决定。
> 当innodb页大小为16KB时rollback segment中undo slot的数量为`innodb page size/ 16`即1024个。
>
> 易知每个slot占用的大小为`16bit`即长度为2字节。
>
> 故而,`slot中存放的是指向undo segment的句柄而不是存放undo segment本身`。
##### innodb_undo_tablespaces
该变量设置了undo tablespaces的数量。
##### purge
在事务i提交之后并不能立刻删除undo log以及undo log所在的页`其他事务仍有可能通过undo log来还原数据行的之前版本`。故而在事务提交时会将undo log放入到一个链表中交由purge线程来决定是否最终删除undo log以及undo log所在的页。
> purge代表`清空不再被需要的旧版本数据行及其对应的undo log记录。
如果为每一个事务分配一个单独的undo页那么会非常浪费存储空间。由于事务提交时所分配的undo页并不能立刻释放故而当数据库负载较大时可能同时存在大量的undo页会占用相当多的存储空间。
##### undo页的重用设计
在innodb对undo页的设计中考虑了对undo页的重用。当事务提交时首先会将undo log放在链表中然后判断undo页的使用空间是否小于`3/4`。如果是代表该undo页可以被重用之后新的undo log会记录在当前undo log的后面。
#### 核心概念
##### rollback segment
undo tablespace由rollback segment构成每个undo tablespace最多支持128个rollback segment`innodb_rollback_segments`定义了rollback segments的数量。
##### undo slots
undo slot是rollback segment内的slot由rollback segment进行管理。
undo slot主要用于关联undo segment`当事务启动时系统会从rollback segment中获取一个空闲的undo slot``成功获取undo slot后即代表关联了一个undo segment`