doc: 阅读undo log文档
This commit is contained in:
@@ -290,11 +290,32 @@ innodb通过segment来管理undo log,其管理方式如下:
|
|||||||
每个rollback segments支持的事务数量由`rollback segment中undo slot的数量`和`每个事务需要的undo log数量`来决定。
|
每个rollback segments支持的事务数量由`rollback segment中undo slot的数量`和`每个事务需要的undo log数量`来决定。
|
||||||
|
|
||||||
> 当innodb页大小为16KB时,rollback segment中undo slot的数量为`innodb page size/ 16`,即1024个。
|
> 当innodb页大小为16KB时,rollback segment中undo slot的数量为`innodb page size/ 16`,即1024个。
|
||||||
|
>
|
||||||
|
> 易知,每个slot占用的大小为`16bit`,即长度为2字节。
|
||||||
|
>
|
||||||
|
> 故而,`slot中存放的是指向undo segment的句柄,而不是存放undo segment本身`。
|
||||||
|
|
||||||
##### innodb_undo_tablespaces
|
##### innodb_undo_tablespaces
|
||||||
该变量设置了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`
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user