The basics of InnoDB space file layout(3.InnoDB空间文件布局基础知识)

在前面《学习InnoDB核心之旅》中,我介绍了innodb_diagrams项目来记录InnoDB的内部。它提供了这篇文章中用到的所有图表。
InnoDB的数据存储模型使用空间“Space”,在Mysql中通常被称为表空间,在InnoDB中有时也被称为文件空间。一个空间能够由操作系统级别的多个实际文件如ibData1、ibdata2组成。但是它只是一个逻辑文件。由多个物理文件被当作物理连接在一起的一个逻辑文件处理。
InnoDB的每个空间都分配一个32位的整数空间ID,它在许多不同的地方被用来引用这个空间。InnoDB总是有一个系统空间。它总是被分配空间ID为0.系统空间用于InnoDB需要的各种特殊日志记录。通过Mysql,InnoDB目前支持每个表文件空间的形式的额外空间。这将为每个Mysql表创建一个.ibd文件。在内部,这个.ibd文件实际上是一个功能完整的空间。它可以包含多个表,但是在Mysql的实现中,它门只包含一个表。也就是说通常是一张表至少有一个独立的ibd文件。

每个空间又被分隔成大小为16KB的多个页文件。有两个原因可能导致页文件的大小被改变,编译时指定了UNIV_PAGE_SIZE的大小,或者使用了innoDB压缩。空间中的每个页被分配一个32位的整数页号,通常称为offset。它实际上是页文件从空间开始的偏移量,对于多文件的空间,不一定是从文件开始。而是从第一个最初始的文件开始。
因此,第0页位于此文件的offset为0的位置,第1页位于文件offset的16384处。以此类推。很多人知道,InnoDB的数据限制是64TB。这实际上是对每个表空间的限制。只要是因为页号是一个32位的整数。加上默认的页大小2^32*16k=64TB。
一个页文件的布局如下:
The basics of InnoDB space file layout(3.InnoDB空间文件布局基础知识)_第1张图片

每一页都有一个38字节的FIL页首和8字节的FIL页脚,FIL是file的缩写。页首包含一个用于只是页面类型的字段,该字段决定了页面其余部分的结构,FIL的页首header和页尾trailer的结构为:
The basics of InnoDB space file layout(3.InnoDB空间文件布局基础知识)_第2张图片

FIL的页首和页脚由如下部分组成:

  • page type 页类型存储在页首中,这对于解析其余的页数据都是非常必要的。页面被分配给文件空间管理,范围管理、实务习题、数据字典、undo日志、blobs,当然还有索引。
  • space ID 存储该页所在的空间ID。
  • offset(page number) 页面初始化之后,offset存储在页眉中,检查从该字段读取的页码是否与文件中基于offset的页码匹配有助于确认读取是否正确。页码被分配标识这个页被初始化。
  • checksum 一个32位的校验码被存储在页眉中。一个旧格式的校验码则存储在页脚中。这个旧格式的校验码可能在未来某个时刻被弃用。这个空间可能会在某个时刻被回收。
  • previous page/next page 指向此页面的逻辑上的上一页/下一页的指针存储在页眉中。这允许建立页面的双向链表。这用在同一级别链接所有页面的索引页。使得通过全索引扫描变得高效。许多页面类型不使用这些字段。
  • LSN 页面最后一次修改的64位的日志序列号LSN,存储在页眉中。相同LSN的低位32位存储在页脚中。
  • Flush LSN 一个64位的flush LSN的字段存储在页眉中,它实际上仅为整个系统中的一个页面的填充,即空间0中的0页面。这将存储整个系统中刷新到任何页面的的最高的LSN,这个区域是个很好的候选,可以在其他区域重复使用。

空间文件

空间文件是由最多为2^32的页文件串联的文件。为了更有效的管理,将页面分组为1MB的块,即64个连续页面。(默认的页面大小为16k),称为区(extent)。许多结构通常只引用区来在一个空间中分配页面。
innoDB需要一些bookkeeping 来记录所有的页面,区和空间本身。所以一个空间文件有一些强制性的结构:
The basics of InnoDB space file layout(3.InnoDB空间文件布局基础知识)_第3张图片

空间中的第一个页面(0页)总是一个FSP_HDR或者文件头页面。FSP_HDR页面包括FSP头结构,它跟踪诸如空间大小以及空闲、分段和完整的区段列表等内容。(关于空闲空间管理的更详细讨论将在后续章节中探讨)。
一个FSP_HDR页面在内部只有足够的空间来存储256个区段。(16384页,共246M)的记账簿信息。因此必须每隔16384页为xDES页的形式来保留额外的空间。XDES和FSP_HDR的结构是相同的。出了在XDES页中的FSP头结构是0。这些额外的页面会虽则空间文件的增长而自动分配。
除了每个FSP_HDR或XDES页之外,还有一个IBUF_BITMAP页面。它用于记录与插入缓冲相关的信息,这超出了本文的范围。

系统空间

系统空间在innoBD中是特殊的,它包含许多按固定页码分配的页面,用于存储对innoDB操作至关重要的大量信息。由于系统空间与其他空间类似,所以它有所需的FSP_HDR、IBUF_BITMAP和INODE页作为它的前三个页分配,之后,就有点特别了:
The basics of InnoDB space file layout(3.InnoDB空间文件布局基础知识)_第4张图片

分配的页面如下:

  • 第三页,输入SYS与插入缓冲相关的标题和记账簿信息。
  • 第四页,类型INDEX用于插入缓冲的索引结构的根页。
  • 第五页,类型TRX_SYS,innoDB事务系统操作的相关信息,如最近的事务ID,mysql的二进制日志信息,双写缓冲区区段的位置。
  • 第六页,SYS类型,第一个回滚段页。根据需要分配额外的页或者整个区段来存储回滚段数据。
  • 第七页,SYS类型,与数据字典相关的头信息,包含组成数据字典的索引根页码,为了能够找到任何其他索引的表,需要这些信息,因为他们的根本页码存储在数据字典本身中。
  • 64-127页,双写缓冲区包含64个页面,一个区段的第一个块,双写缓冲区被用作innoDB恢复机制的一部分。
  • 128-191页,双写缓冲区的第二个块。

所有其他的页面都按需要分配给索引回滚段,撤销日志等。

表空间文件

InnoDB提供了每个表要给文件的模式,它将为每个MYSQL表创建一个文件,上面解释的实际上是一个空间。更好的名称就是每个表空间,而不是每个表文件。为每个表创建的ibd文件具有典型的空间文件结构。
The basics of InnoDB space file layout(3.InnoDB空间文件布局基础知识)_第5张图片

忽略在运行时添加索引的快速索引创建,在必须的3个初始化页之后,在空间中分配的下一个页将是表中每个索引的根页。其顺序与比哦创建时定义的顺序相同,page3将是聚集索引的根,page4将是第一个辅助索引的根,等等。
因为innoDB的大多数记账机构都存储在系统空间中,所以每个表空间中分配的大多数页面都是索引类型,并存储表数据。

下一章讨论的主题

接下来,我们将研究InnoDB中空闲空间的管理,范围描述符,文件段inode和列表。

你可能感兴趣的:(mysql,数据库,mysql,linux,面试)