From 965f75a3ee8f3a1cfa687c9ccedb16d9d7d64570 Mon Sep 17 00:00:00 2001 From: asahi Date: Wed, 6 Aug 2025 12:25:28 +0800 Subject: [PATCH] =?UTF-8?q?doc:=20=E9=98=85=E8=AF=BBmysql=20undo=20log?= =?UTF-8?q?=E7=89=A9=E7=90=86=E5=AD=98=E5=82=A8=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mysql/mysql文档/mysql_事务.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/mysql/mysql文档/mysql_事务.md b/mysql/mysql文档/mysql_事务.md index 5dacb5b..5410afd 100644 --- a/mysql/mysql文档/mysql_事务.md +++ b/mysql/mysql文档/mysql_事务.md @@ -424,7 +424,31 @@ undo log的结构如上述所示,我们无法控制事务生成undo log的大 > undo log和undo page的对应关系是灵活的,既可能一个undo log占用多个undo pages,也可能多个undo log共用相同的undo page +关于undo log的物理组织方式,如下图所示: +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 type:undo page的类型 +- last log record offset:最后一条记录的offset +- free space offset:page中空闲空间的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 表`t`中,`a`为聚簇索引,`b`为辅助索引,若执行如下sql