前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >The basics of InnoDB space file layout(3.InnoDB空间文件布局基础知识)

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

作者头像
冬天里的懒猫
发布2020-08-20 09:44:54
7630
发布2020-08-20 09:44:54
举报
文章被收录于专栏:做不甩锅的后端

在前面《学习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。

一个页文件的布局如下:

每一页都有一个38字节的FIL页首和8字节的FIL页脚,FIL是file的缩写。页首包含一个用于只是页面类型的字段,该字段决定了页面其余部分的结构,FIL的页首header和页尾trailer的结构为:

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 来记录所有的页面,区和空间本身。所以一个空间文件有一些强制性的结构:

空间中的第一个页面(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页作为它的前三个页分配,之后,就有点特别了:

分配的页面如下:

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

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

表空间文件

InnoDB提供了每个表要给文件的模式,它将为每个MYSQL表创建一个文件,上面解释的实际上是一个空间。更好的名称就是每个表空间,而不是每个表文件。为每个表创建的ibd文件具有典型的空间文件结构。

忽略在运行时添加索引的快速索引创建,在必须的3个初始化页之后,在空间中分配的下一个页将是表中每个索引的根页。其顺序与比哦创建时定义的顺序相同,page3将是聚集索引的根,page4将是第一个辅助索引的根,等等。

因为innoDB的大多数记账机构都存储在系统空间中,所以每个表空间中分配的大多数页面都是索引类型,并存储表数据。

下一章讨论的主题

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/08/17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 空间文件
  • 系统空间
  • 表空间文件
  • 下一章讨论的主题
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档