“InnoDB:InnoDB 磁盘结构:Tablespaces”的版本间差异

来自Wikioe
跳到导航 跳到搜索
第2行: 第2行:


== 关于 ==
== 关于 ==
tablespace:一个'''数据文件''',可以'''保存一个或多个 InnoDB 表和关联的 索引 的数据'''。
tablespace:一个'''数据文件''',可以保存一个或多个 InnoDB 表和关联的 索引 的数据。


# 系统表空间包含 InnoDB 数据字典,在 MySQL 5.6 之前,默认情况下保存所有其他 InnoDB 表。
# 系统表空间包含 InnoDB 数据字典,在 MySQL 5.6 之前,默认情况下保存所有其他 InnoDB 表。
第9行: 第9行:


MySQL NDB Cluster 还将其表分组为表空间。【???】
MySQL NDB Cluster 还将其表分组为表空间。【???】
== 什么是表空间 ==
【转自CSDN博主「IT码客」:https://blog.csdn.net/u010647035/article/details/105009979】
=== 概述 ===
InnoDB 表空间(Tablespace)可以看做一个逻辑概念,InnoDB 把数据保存在表空间,本质上是'''一个或多个磁盘文件组成的虚拟文件系统'''。InnoDB 表空间不仅仅存储了表和索引,它还保存了回滚日志(redo log)、插入缓冲(insert buffer)、双写缓冲(doublewrite buffer)以及其他内部数据结构。
默认情况下InnoDB存储引擎有一个共享表空间“'''ibdata1'''”,即所有数据都放在这个表空间内。如果我们配置了参数“'''innodb_file_per_table'''”,则每张表内的数据可以单独放到一个表空间内。其对应的存储文件都放在“innodb_data_home_dir”指定的目录下。
* 当启用了“innodb_file_per_table”参数选项,需要注意的是,每张表的表空间内存放的只是数据、索引和插入缓冲,其它的数据,如撤销(Undo)信息、系统事务信息、二次写缓冲(double write buffer)等还是存放在原来的共享表空间内。这也就说明了另一个问题:即使在启用了参数“innodb_file_per_table”,共享表空间还是会不断地增加其大小。
=== InnoDB 逻辑存储结构 ===
[[File:InnoDB 逻辑存储结构.png|800px]]
从 InnoDB 逻辑存储结构来看,所有的数据都被逻辑的存放在一个空间中,这个空间就叫做'''表空间'''(tablespace)。表空间由:段(segment)、区(extent)、页(page)组成。
# '''段'''(segment)
#: 段分为'''索引段''','''数据段''','''回滚段'''等。其中:
# 索引段就是非叶子结点部分,
# 而数据段就是叶子结点部分,
# 回滚段用于数据的回滚和多版本控制。
#: 一个段包含'''256'''个区('''256M'''大小)。
# '''区'''(extent)
#: 区是页的集合,一个区包含'''64'''个连续的页,默认大小为 '''1MB''' (64*16K)。
# '''页'''(page)
#: 页是 InnoDB 管理的最小单位,常见的有“FSP_HDR”,“INODE”,“INDEX”等类型。所有页的结构都是一样的,分为“文件头”(前38字节),“页数据”和“文件尾”(后8字节)。页数据根据页的类型不同而不一样。
#: 每个空间都分为多个页,通常每页'''16 KiB'''。空间中的每个页面都分配有一个32位整数页码,通常称为“偏移量”(offset),它实际上只是页面与空间开头的偏移量(对于多文件空间,不一定是文件的偏移量)。因此,页面 0 位于文件偏移量 0,页面 1 位于文件偏移量 16384,依此类推。
#*(InnoDB 的数据限制为64TiB,这实际上是每个空间的限制,这主要是由于页码是32位整数与默认页大小的组合: 2^32 x 16 KiB = 64 TiB )
关于“页”:
:[[File:InnoDB 页(page)结构.png|600px]]
如图所示,每个page都有 38 个字节的 FIL header,以及 8 个字节的 FIL trailer(FIL 是 file 的简称)。FIL header 包含了一个表示 page type 的字段,这个字段用来确定这个 page 数据的结构。
FIL header 和 trailer 示意图如下所示:
:[[File:InnoDB FIL header和trailer示意图.png|600px]]
其中:
* checksum: 4个字节32位checksum保存在header中。
* Offset: 页面初始化后,页面编号就存储在header中。根据从文件中获得的偏移量检查从该字段读取的页码是否与应该匹配的页码相符,这有助于指示读取正确,并且此字段已初始化表示页面已初始化。
* Previous/Next Page: 指向此页面类型的逻辑上一页和下一页的指针,被保存在header中。这允许建立页面的双向链接列表,并且它用于INDEX页面以及同一级别的所有页面。
* page type: 页面类型存储在标题中。为了解析其余页面数据,这是必需的。页面被分配用于文件空间管理,范围管理,事务系统,数据字典,撤消日志,blob,当然还有索引(表数据)。
* space ID: 保存在header中,space的32位整型唯一编号。
* Old-style Checksum: 旧格式32位checksum被保存在header中,不过已经被废弃,这块空间被申明为一些指针。
* LSN: 页的最后修改的64位日志序列号(LSN)存储在header中,而同一LSN的低32位存储在尾部中。


== 系统表空间 ==
== 系统表空间 ==

2021年4月18日 (日) 14:18的版本


关于

tablespace:一个数据文件,可以保存一个或多个 InnoDB 表和关联的 索引 的数据。

  1. 系统表空间包含 InnoDB 数据字典,在 MySQL 5.6 之前,默认情况下保存所有其他 InnoDB 表。
  2. 在 MySQL 5.6 和更高版本中默认启用的“innodb_file_per_table”选项允许在自己的表空间中创建表。每表一文件(File-Per-Table)表空间支持以下功能,例如有效存储页外列,表压缩和可移动表空间。
  3. InnoDB 引入了 MySQL 5.7.6 中的常规表空间。常规表空间是使用“CREATE TABLESPACE”语法创建的共享表空间。它们可以在 MySQL 数据目录之外创建,能够容纳多个表,并支持所有行格式的表。

MySQL NDB Cluster 还将其表分组为表空间。【???】

什么是表空间

【转自CSDN博主「IT码客」:https://blog.csdn.net/u010647035/article/details/105009979】

概述

InnoDB 表空间(Tablespace)可以看做一个逻辑概念,InnoDB 把数据保存在表空间,本质上是一个或多个磁盘文件组成的虚拟文件系统。InnoDB 表空间不仅仅存储了表和索引,它还保存了回滚日志(redo log)、插入缓冲(insert buffer)、双写缓冲(doublewrite buffer)以及其他内部数据结构。


默认情况下InnoDB存储引擎有一个共享表空间“ibdata1”,即所有数据都放在这个表空间内。如果我们配置了参数“innodb_file_per_table”,则每张表内的数据可以单独放到一个表空间内。其对应的存储文件都放在“innodb_data_home_dir”指定的目录下。

  • 当启用了“innodb_file_per_table”参数选项,需要注意的是,每张表的表空间内存放的只是数据、索引和插入缓冲,其它的数据,如撤销(Undo)信息、系统事务信息、二次写缓冲(double write buffer)等还是存放在原来的共享表空间内。这也就说明了另一个问题:即使在启用了参数“innodb_file_per_table”,共享表空间还是会不断地增加其大小。

InnoDB 逻辑存储结构

InnoDB 逻辑存储结构.png

从 InnoDB 逻辑存储结构来看,所有的数据都被逻辑的存放在一个空间中,这个空间就叫做表空间(tablespace)。表空间由:段(segment)、区(extent)、页(page)组成。

  1. (segment)
    段分为索引段数据段回滚段等。其中:
  2. 索引段就是非叶子结点部分,
  3. 而数据段就是叶子结点部分,
  4. 回滚段用于数据的回滚和多版本控制。
    一个段包含256个区(256M大小)。
  5. (extent)
    区是页的集合,一个区包含64个连续的页,默认大小为 1MB (64*16K)。
  6. (page)
    页是 InnoDB 管理的最小单位,常见的有“FSP_HDR”,“INODE”,“INDEX”等类型。所有页的结构都是一样的,分为“文件头”(前38字节),“页数据”和“文件尾”(后8字节)。页数据根据页的类型不同而不一样。
    每个空间都分为多个页,通常每页16 KiB。空间中的每个页面都分配有一个32位整数页码,通常称为“偏移量”(offset),它实际上只是页面与空间开头的偏移量(对于多文件空间,不一定是文件的偏移量)。因此,页面 0 位于文件偏移量 0,页面 1 位于文件偏移量 16384,依此类推。
    • (InnoDB 的数据限制为64TiB,这实际上是每个空间的限制,这主要是由于页码是32位整数与默认页大小的组合: 2^32 x 16 KiB = 64 TiB )


关于“页”:

InnoDB 页(page)结构.png

如图所示,每个page都有 38 个字节的 FIL header,以及 8 个字节的 FIL trailer(FIL 是 file 的简称)。FIL header 包含了一个表示 page type 的字段,这个字段用来确定这个 page 数据的结构。

FIL header 和 trailer 示意图如下所示:

InnoDB FIL header和trailer示意图.png

其中:

  • checksum: 4个字节32位checksum保存在header中。
  • Offset: 页面初始化后,页面编号就存储在header中。根据从文件中获得的偏移量检查从该字段读取的页码是否与应该匹配的页码相符,这有助于指示读取正确,并且此字段已初始化表示页面已初始化。
  • Previous/Next Page: 指向此页面类型的逻辑上一页和下一页的指针,被保存在header中。这允许建立页面的双向链接列表,并且它用于INDEX页面以及同一级别的所有页面。
  • page type: 页面类型存储在标题中。为了解析其余页面数据,这是必需的。页面被分配用于文件空间管理,范围管理,事务系统,数据字典,撤消日志,blob,当然还有索引(表数据)。
  • space ID: 保存在header中,space的32位整型唯一编号。
  • Old-style Checksum: 旧格式32位checksum被保存在header中,不过已经被废弃,这块空间被申明为一些指针。
  • LSN: 页的最后修改的64位日志序列号(LSN)存储在header中,而同一LSN的低32位存储在尾部中。

系统表空间

每表一文件(File-Per-Table)表空间

常规表空间

撤消(Undo)表空间

临时表空间