北京哪家医院白癜风较好 https://jbk.39.net/yiyuanzaixian/bjzkbdfyy/mbbdf_zx/emwsafw/文章《MySQLInnoDBibd文件格式解析》,介绍了ibd文件的基本结构,ibd文件通常由大小为16k的页组成,页分为页头、页身和页尾。在页头有2个字节存储页类型(pagetype),页类型有很多种类,不同的种类有不同的作用,本文将介绍类型为FIL_PAGE_TYPE_FSP_HDR的页结构,它通常是ibd文件的第一个页,也是非常重要的一种页类型。
FIL_PAGE_TYPE_FSP_HDR页整体结构:
FIL_PAGE_TYPE_FSP_HDR页主要包含2种数据结构,分别为fspheader和xdesentry。fspheader固定为字节,fspheader之后为xdesentry数组,一共个元素,元素大小固定为40字节,个总大小为*40=。整体结构见下图:
fspheader结构:
fspheader主要包含表空间id,已使用的页数量,flags以及多个链表头结构等等,具体见下图:
fspheader占用字节,其中的字段含义如下:
spaceid:表空间id,4字节unused:未使用,4字节highestpagenumberinfile:文件中使用的最大页号,4字节highestpagenumberinitialized:已经初始化的最大页号,4字节flags:fspheader标记,4字节numberofpagesusedinFREE_FRAGlist:FREE_FRAG链表中已经使用的页数量,4字节FREElist:FREE链表头,16字节FREE_FRAG:FREE_FRAG链表头,16字节FULL_FRAG:FREE_FRAG链表头,16字节nextunusedsegmentid:下一个未使用的段id,8字节FULL_INODES:FULL_INODES链表头,16字节FREE_INODES:FREE_INODES链表头,16字节fspflags结构:
fspflags4字节大小,按大端字节序转换成4字节整数,这个整数不同的bit有不同的含义,具体如下:
第1位,表示POST_ANTELOPEfield第2~5位,表示ZIP_SSIZEfield第6位,表示ATOMIC_BLOBSfield第7到10位,表示PAGE_SSIZEfield第11位,表示DATA_DIRfield第12位,表示SHAREDfield第13位,表示TEMPORARYfield第14位,表示ENCRYPTIONfield第15到32位,未使用innodb通过fspflags来判断表空间的各种属性,比如是否压缩,是否加密,是否为共享表空间、临时表空间等等。
文件链表:
fspheader结构中大量使用了文件链表头结构(FLST_BASE_NODE),16个字节,前4字节存储链表长度,中间6字节指向链表头节点,最后6字节指向链表尾节点。
FLST_BASE_NODE结构如下
/p>
FLST_FIRST和FLST_LAST分别指向链表的第一个节点和最后一个节点。6字节的结构分为两部分,4字节为页号,2字节为页内偏移。通过页号和页内偏移来定位链表节点的位置。具体结构如下:
xdesentry:
在介绍xdesentry之前,先来了解一下ibd文件的物理结构。一个ibd文件称之为一个表空间,有唯一的表空间id,表空间内部由一个一个连续的页组成,从页号为0的页开始,连续的64个页称之为一个簇(extent),为了组织管理这些extent,每个extent都有一个40字节的xdesentry,来标记extent内哪些页已被使用,哪些页空闲。先来看下xdesentry结构,如下:
filesegmentid:段id,如果extent属于某个段的话,记录其段id,占用8个字节xdeslistnode:extent链表的双向指针节点,占用12个字节,fspheader中的链表头指向的目标就是这里state:该extent的状态,比如空闲或者已完全被使用等等,该状态是枚举类型,值为XDES_FREE,XDES_FREE_FRAG,XDES_FULL_FRAG,XDES_FSEG,占用4字节pagestatebitmap:用2个bit表示extent中的一个page,其中一个bit表示该page是否是空闲(XDES_FREE_BIT),另一个bit保留,尚未使用(XDES_CLEAN_BIT),占用16字节,16*8/2=64,正好可以标记一个extent64个页的使用情况最后:
本文简单介绍了ibd文件fspheader和xdesentry的结构及其每个字段的含义,我们可以使用hexdump工具实际观察一下ibd文件的二进制结构,加深对ibd文件结构的理解。本文涉及的MySQL源码版本为5.7.19,欢迎