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

实际存储undo记录的Page类型为FIL_PAGE_UNDO_LOG,undo header结构如下

MacrobytesDesc
TRX_UNDO_PAGE_HDR   38   Page 头  
TRX_UNDO_PAGE_TYPE   2   记录Undo类型,是TRX_UNDO_INSERT还是TRX_UNDO_UPDATE  
TRX_UNDO_PAGE_START   2   事务所写入的最近的一个undo log在page中的偏移位置  
TRX_UNDO_PAGE_FREE   2   指向当前undo page中的可用的空闲空间起始偏移量  
TRX_UNDO_PAGE_NODE   12   链表节点,提交后的事务,其拥有的undo页会加到history list上  

undo页内结构及其与回滚段头页的关系参阅下图:

InnoDB Undo 页内结构

InnoDB Undo 页内结构

关于具体的Undo log如何存储,本文不展开描述,可阅读我之前的这篇文章:MySQL · 引擎特性 · InnoDB undo log 漫游

FSP_DICT_HDR_PAGE_NO
ibdata的第8个page,用来存储数据词典表的信息 (只有拿到数据词典表,才能根据其中存储的表信息,进一步找到其对应的表空间,以及表的聚集索引所在的page no)

Dict_Hdr Page的结构如下表所示:

MacrobytesDesc
DICT_HDR   38   Page头  
DICT_HDR_ROW_ID   8   最近被赋值的row id,递增,用于给未定义主键的表,作为其隐藏的主键键值来构建btree  
DICT_HDR_TABLE_ID   8   当前系统分配的最大事务ID,每创建一个新表,都赋予一个唯一的table id,然后递增  
DICT_HDR_INDEX_ID   8   用于分配索引ID  
DICT_HDR_MAX_SPACE_ID   4   用于分配space id  
DICT_HDR_MIX_ID_LOW   4      
DICT_HDR_TABLES   4   SYS_TABLES系统表的聚集索引root page  
DICT_HDR_TABLE_IDS   4   SYS_TABLE_IDS索引的root page  
DICT_HDR_COLUMNS   4   SYS_COLUMNS系统表的聚集索引root page  
DICT_HDR_INDEXES   4   SYS_INDEXES系统表的聚集索引root page  
DICT_HDR_FIELDS   4   SYS_FIELDS系统表的聚集索引root page  

dict_hdr页的创建参阅函数 dict_hdr_create

double write buffer
InnoDB使用double write buffer来防止数据页的部分写问题,在写一个数据页之前,总是先写double write buffer,再写数据文件。当崩溃恢复时,如果数据文件中page损坏,会尝试从dblwr中恢复。

double write buffer存储在ibdata中,你可以从事务系统页(ibdata的第6个page)获取dblwr所在的位置。总共128个page,划分为两个block。由于dblwr在安装实例时已经初始化好了,这两个block在Ibdata中具有固定的位置,Page64 ~127 划属第一个block,Page 128 ~191划属第二个block。

在这128个page中,前120个page用于batch flush时的脏页回写,另外8个page用于SINGLE PAGE FLUSH时的脏页回写。

外部存储页

对于大字段,在满足一定条件时InnoDB使用外部页进行存储。外部存储页有三种类型:

FIL_PAGE_TYPE_BLOB:表示非压缩的外部存储页,结构如下图所示:

InnoDB 非压缩外部存储页

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

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