「MySQL」- 表空间(Tablespace)

  CREATED BY JENKINSBOT

内容简介

在MySQL中,有多种表空间,不同的表空间也有不同的用途。下面简要介绍和说明一下这些表空间的概念。

# 通用表空间(General tablespace)

使用CREATE TABLESPACE语法创建的共享InnoDB表空间。「通用表空间」可以在MySQL数据目录之外创建,能够保存多个表,并支持所有行格式的表。 在MySQL 5.7.6中引入了「通用表空间」。

使用CREATE TABLE tbl_name ... TABLESPACE [=] tablespace_nameALTER TABLE tbl_name TABLESPACE [=] tablespace_name语法将表添加到「通用表空间」。

注意与「系统表空间」和「表文件表空间」对比。

# 系统表空间(System tablespace)

它是一个或多个数据文件(ibdata文件),他们包含:

	* 与InnoDB相关的对象(InnoDB数据字典)的元数据,
	* 「更改缓冲」,「双写缓冲」和可能的「撤消日志」的「存储区域」。

根据innodb_file_per_table设置(OFF),它还可能包含InnoDB表的表和索引数据。「系统表空间」中的数据和元数据适用于MySQL实例中的所有数据库。

在MySQL 5.6.7之前,默认设置是将所有InnoDB表和索引保留在「系统表空间内」,这通常会导致此文件变得非常大。由于系统表空间永远不会缩小,因此如果加载并删除大量临时数据,则可能会出现存储问题。

在MySQL 5.6.7及更高版本中,默认值为「表文件」模式,其中每个表及其关联的索引存储在单独的.ibd文件中。此默认设置使得使用依赖于Barracuda文件格式的InnoDB功能变得更加容易,例如表压缩,「页外列的高效存储」以及「大索引键前缀」(innodb_large_prefix)。

将所有表数据保存在「系统表空间」或「单独的.ibd文件」(在「通用表空间」中的.ibd文件)中通常会影响存储管理。MySQL Enterprise Backup产品可能会备份一小组大文件或许多较小的文件。在具有数千个表的系统上,处理数千个.ibd文件的文件系统操作可能会导致瓶颈。

在MySQL 5.6及更高版本中,innodb_undo_tablespaces定义了撤消日志的撤消表空间数。

# 表文件表空间(File-Per-Table Tablespaces)

innodb_file_per_table选项控制的设置的通用名称,这是影响InnoDB文件存储、功能可用性、I/O特性方面的重要配置选项。

从MySQL 5.6.7开始,默认情况下启用innodb_file_per_table选项。

启用innodb_file_per_table选项后,可以在其自己的.ibd文件中创建表,而不是在「系统表空间」的共享ibdata文件中创建表。当表数据存储在单个.ibd文件中时,可以更灵活地选择数据压缩等功能所需的行格式。并且TRUNCATE TABLE操作也更快,操作系统可以使用回收空间,而不是为InnoDB保留。

对于在自己文件中的表,MySQL Enterprise Backup产品更灵活。例如,可以从备份中排除表,但仅限于它们位于单独的文件中。因此,此设置适用于较少备份或不同计划的表。

# 临时表空间(temporary tablespace)

在MySQL 5.7中,为非压缩InnoDB临时表和相关对象而引入的表空间。

配置文件的innodb_temp_data_file_path选项定义「临时表空间数据」文件的相对路径,名称,大小和属性。如果未指定innodb_temp_data_file_path选项,则默认行为是在数据目录中创建名为ibtmp1的单个自动扩展12MB数据文件。在每个服务器启动时重新创建「临时表空间」,并接收动态生成的「space ID」。「临时表空间」不能驻留在原始设备上。 如果无法创建「临时表空间」,则拒绝启动。

「临时表空间」在“正常关闭”或“中止初始化”时被删除。 发生崩溃时,不会删除临时表空间。 在这种情况下,数据库管理员可以手动删除「临时表空间」,或使用相同的配置重新启动服务器,从而删除并重新创建临时表空间。

# 撤消表空间(undo tablespace)

「撤销表空间」包含「撤销日志」。 「撤消日志」存在于「撤消日志段」中,这些「撤消日志段」包含在「回滚段」中,「回滚段」传统上驻留在「系统表空间中」。
从MySQL 5.6开始,「回滚段」可以驻留在「撤消表空间」中。

在MySQL 5.6和MySQL 5.7中,「撤消表空间」的数量由innodb_undo_tablespaces配置选项控制。

在MySQL 8.0中,初始化MySQL实例时会创建两个默认的「撤消表空间」,并且可以使用CREATE UNDO TABLESPACE语法创建其他撤消表空间。

参考文献

MySQL Glossary/system tablespace
MySQL Glossary/general tablespace
MySQL Glossary/file-per-table
MySQL Glossary/temporary tablespace
MySQL Glossary/undo tablespace
浅谈mysql中各种表空间(tablespaces)的概念