MySQL 引擎特性 InnoDB 文件系统之文件物理结构(10)

FSP_IBUF_TREE_ROOT_PAGE_NO
用于存储change buffer的根page,change buffer目前存储于Ibdata中,其本质上也是一颗btree,root页为固定page,也就是Ibdata的第5个page。

IBUF HEADER Page 和Root Page联合起来对ibuf的数据页进行管理。

首先Ibuf btree自己维护了一个空闲Page链表,链表头记录在根节点中,偏移量在PAGE_BTR_IBUF_FREE_LIST处,实际上利用的是普通索引根节点的PAGE_BTR_SEG_LEAF字段。Free List上的Page类型标示为FIL_PAGE_IBUF_FREE_LIST

每个Ibuf page重用了PAGE_BTR_SEG_LEAF字段,以维护IBUF FREE LIST的前后文件页节点(PAGE_BTR_IBUF_FREE_LIST_NODE)。

由于root page中的segment字段已经被重用,因此额外的开辟了一个Page,也就是Ibdata的第4个page来进行段管理。在其中记录了ibuf btree的segment header,指向属于ibuf btree的inode entry。

关于ibuf btree的构建参阅函数 btr_create

FSP_TRX_SYS_PAGE_NO/FSP_FIRST_RSEG_PAGE_NO
ibdata的第6个page,记录了InnoDB重要的事务系统信息,主要包括:

MacrobytesDesc
TRX_SYS   38   每个数据页都会保留的文件头字段  
TRX_SYS_TRX_ID_STORE   8   持久化的最大事务ID,这个值不是实时写入的,而是256次递增写一次  
TRX_SYS_FSEG_HEADER   10   指向用来管理事务系统的segment所在的位置  
TRX_SYS_RSEGS   128 * 8   用于存储128个回滚段位置,包括space id及page no。每个回滚段包含一个文件segment(trx_rseg_header_create)  
……   以下是Page内UNIV_PAGE_SIZE - 1000的偏移位置      
TRX_SYS_MYSQL_LOG_MAGIC_N_FLD   4   Magic Num ,值为873422344  
TRX_SYS_MYSQL_LOG_OFFSET_HIGH   4   事务提交时会将其binlog位点更新到该page中,这里记录了在binlog文件中偏移量的高位的4字节  
TRX_SYS_MYSQL_LOG_OFFSET_LOW   4   同上,记录偏移量的低4位字节  
TRX_SYS_MYSQL_LOG_NAME   4   记录所在的binlog文件名  
……   以下是Page内UNIV_PAGE_SIZE - 200 的偏移位置      
TRX_SYS_DOUBLEWRITE_FSEG   10   包含double write buffer的fseg header  
TRX_SYS_DOUBLEWRITE_MAGIC   4   Magic Num  
TRX_SYS_DOUBLEWRITE_BLOCK1   4   double write buffer的第一个block(占用一个Extent)在ibdata中的开始位置,连续64个page  
TRX_SYS_DOUBLEWRITE_BLOCK2   4   第二个dblwr block的起始位置  
TRX_SYS_DOUBLEWRITE_REPEAT   12   重复记录上述三个字段,即MAGIC NUM, block1, block2,防止发生部分写时可以恢复  
TRX_SYS_DOUBLEWRITE_SPACE_ID_STORED   4   用于兼容老版本,当该字段的值不为TRX_SYS_DOUBLEWRITE_SPACE_ID_STORED_N时,需要重置dblwr中的数据  

在5.7版本中,回滚段既可以在ibdata中,也可以在独立undo表空间,或者ibtmp临时表空间中,一个可能的分布如下图所示(摘自我之前的这篇文章)。

InnoDB Undo 回滚段结构

InnoDB Undo 回滚段结构

由于是在系统刚启动时初始化事务系统,因此第0号回滚段头页总是在ibdata的第7个page中。

事务系统创建参阅函数 trx_sysf_create

InnoDB最多可以创建128个回滚段,每个回滚段需要单独的Page来维护其拥有的undo slot,Page类型为FIL_PAGE_TYPE_SYS。描述如下:

MacrobytesDesc
TRX_RSEG   38   保留的Page头  
TRX_RSEG_MAX_SIZE   4   回滚段允许使用的最大Page数,当前值为ULINT_MAX  
TRX_RSEG_HISTORY_SIZE   4   在history list上的undo page数,这些page需要由purge线程来进行清理和回收  
TRX_RSEG_HISTORY   FLST_BASE_NODE_SIZE(16)   history list的base node  
TRX_RSEG_FSEG_HEADER   (FSEG_HEADER_SIZE)10   指向当前管理当前回滚段的inode entry  
TRX_RSEG_UNDO_SLOTS   1024 * 4   undo slot数组,共1024个slot,值为FIL_NULL表示未被占用,否则记录占用该slot的第一个undo page  

回滚段头页的创建参阅函数 trx_rseg_header_create

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/92d804ea01a22ee9e899ff74b884f3f1.html