mysql的ibd结尾的是什么文件_MySQL InnoDB ibd 文件格式解析(fsp header & xdes entry)

上一篇文章《MySQL InnoDB ibd 文件格式解析》,介绍了ibd文件的基本结构,ibd文件通常由大小为16k的页组成,页分为页头、页身和页尾。在页头有2个字节存储页类型(page type),页类型有很多种类,不同的种类有不同的作用,本文将介绍类型为FIL_PAGE_TYPE_FSP_HDR的页结构,它通常是ibd文件的第一个页,也是非常重要的一种页类型。

FIL_PAGE_TYPE_FSP_HDR页整体结构:

FIL_PAGE_TYPE_FSP_HDR页主要包含2种数据结构,分别为fsp header和xdes entry。fsp header固定为112字节,fsp header之后为xdes entry数组,一共256个元素,元素大小固定为40字节,256个总大小为256*40=10240。整体结构见下图:

701a42e13b7b5b5ef036daf89f13b452.png

fsp header结构:

fsp header主要包含表空间id,已使用的页数量,flags以及多个链表头结构等等,具体见下图:

b85ef54f6309b999b06ea0bd7065dd6e.png

fsp header占用112字节,其中的字段含义如下:

space id:表空间id,4字节unused:未使用,4字节highest page number in file:文件中使用的最大页号,4字节highest page number initialized:已经初始化的最大页号,4字节flags:fsp header标记,4字节number of pages used in "FREE_FRAG" list:FREE_FRAG链表中已经使用的页数量,4字节"FREE" list:FREE链表头,16字节FREE_FRAG:FREE_FRAG链表头,16字节FULL_FRAG:FREE_FRAG链表头,16字节next unused segment id:下一个未使用的段id,8字节FULL_INODES:FULL_INODES链表头,16字节FREE_INODES:FREE_INODES链表头,16字节fsp flags结构:

fsp flags 4字节大小,按大端字节序转换成4字节整数,这个整数不同的bit有不同的含义,具体如下:

第1位,表示POST_ANTELOPE field第2~5位,表示ZIP_SSIZE field第6位,表示ATOMIC_BLOBS field第7到10位,表示PAGE_SSIZE field第11位,表示DATA_DIR field第12位,表示SHARED field第13位,表示TEMPORARY field第14位,表示ENCRYPTION field第15到32位,未使用innodb通过fsp flags来判断表空间的各种属性,比如是否压缩,是否加密,是否为共享表空间、临时表空间等等。

文件链表:

fsp header结构中大量使用了文件链表头结构(FLST_BASE_NODE),16个字节,前4字节存储链表长度,中间6字节指向链表头节点,最后6字节指向链表尾节点。

FLST_BASE_NODE结构如下:

5b99d8c6fde398a9dabadc9f7cda55a3.png

FLST_FIRST和FLST_LAST分别指向链表的第一个节点和最后一个节点。6字节的结构分为两部分,4字节为页号,2字节为页内偏移。通过页号和页内偏移来定位链表节点的位置。具体结构如下:

3e75c8bf78bde6678c9e469dddf0dea6.png

xdes entry:

在介绍xdes entry之前,先来了解一下ibd文件的物理结构。一个ibd文件称之为一个表空间,有唯一的表空间id,表空间内部由一个一个连续的页组成,从页号为0的页开始,连续的64个页称之为一个簇( extent),为了组织管理这些extent,每个extent都有一个40字节的xdes entry,来标记extent内哪些页已被使用,哪些页空闲。先来看下xdes entry结构,如下:

bf20655ebc65c061723821051ae14fcd.png

file segment id:段id,如果extent属于某个段的话,记录其段id,占用8个字节xdes list node:extent链表的双向指针节点,占用12个字节,fsp header中的链表头指向的目标就是这里state:该extent的状态,比如空闲或者已完全被使用等等,该状态是枚举类型,值为XDES_FREE,XDES_FREE_FRAG,XDES_FULL_FRAG,XDES_FSEG,占用4字节page state bitmap: 用2个bit表示extent中的一个page,其中一个bit表示该page是否是空闲(XDES_FREE_BIT),另一个bit保留,尚未使用(XDES_CLEAN_BIT),占用16字节,16*8/2=64,正好可以标记一个extent 64个页的使用情况最后:

本文简单介绍了ibd文件fsp header和xdes entry的结构及其每个字段的含义,我们可以使用hexdump工具实际观察一下ibd文件的二进制结构,加深对ibd文件结构的理解。本文涉及的MySQL源码版本为5.7.19,欢迎关注,交流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值