14.6.3.3 通用 table 空间

常规 table 空间是使用CREATE TABLESPACE语法创建的共享InnoDBtable 空间。本节的以下主题在下面描述了常规的 table 空间功能:

一般 table 空间功能

常规 table 空间功能提供以下功能:

  • 类似于系统 table 空间,常规 table 空间是共享 table 空间,可以存储多个 table 的数据。

  • 通用 table 空间比file-per-table tablespaces具有潜在的内存优势。服务器在 table 空间的生存期内将 table 空间元数据保留在内存中。与单独的每 table 文件 table 空间中的相同数量的 table 相比,较少的常规 table 空间中的多个 table 为 table 空间元数据消耗的内存更少。

  • 常规 table 空间数据文件可以放置在相对于 MySQL 数据目录或独立于 MySQL 数据目录的目录中,这为您提供了file-per-table tablespaces的许多数据文件和存储 Management 功能。与每 table 文件 table 空间一样,将数据文件放置在 MySQL 数据目录之外的功能使您可以分别 Management 关键 table 的性能,为特定 table 设置 RAID 或 DRBD 或将 table 绑定到特定磁盘。

  • 常规 table 空间支持 Antelope 和 Barracuda 文件格式,因此支持所有 table 行格式和相关功能。支持两种文件格式,常规 table 空间不依赖于innodb_file_formatinnodb_file_per_table设置,这些变量也不影响常规 table 空间。

  • TABLESPACE选项可以与CREATE TABLE一起使用,以在常规 table 空间,每 table 文件 table 空间或系统 table 空间中创建 table。

  • TABLESPACE选项可与ALTER TABLE一起使用,以在常规 table 空间,每个 table 文件的 table 空间和系统 table 空间之间移动 table。以前,不可能将 table 从每个 table 文件 table 空间移至系统 table 空间。使用常规 table 空间功能,您现在可以这样做。

创建通用 table 空间

常规 table 空间是使用CREATE TABLESPACE语法创建的。

CREATE TABLESPACE tablespace_name
    ADD DATAFILE 'file_name'
    [FILE_BLOCK_SIZE = value]
        [ENGINE [=] engine_name]

通用 table 空间可以在数据目录中或在其外部创建。为避免与隐式创建的每 table 文件 table 空间冲突,不支持在数据目录下的子目录中创建常规 table 空间。在数据目录之外创建常规 table 空间时,该目录必须在创建 table 空间之前存在。

在 MySQL 数据目录之外创建常规 table 空间时,会在 MySQL 数据目录中创建.isl文件。

Examples:

在数据目录中创建常规 table 空间:

mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' Engine=InnoDB;

在数据目录之外的目录中创建常规 table 空间:

mysql> CREATE TABLESPACE `ts1` ADD DATAFILE '/my/tablespace/directory/ts1.ibd' Engine=InnoDB;

您可以指定相对于数据目录的路径,只要 table 空间目录不在数据目录下即可。在此示例中,my_tablespace目录与数据目录处于同一级别:

mysql> CREATE TABLESPACE `ts1` ADD DATAFILE '../my_tablespace/ts1.ibd' Engine=InnoDB;

Note

ENGINE = InnoDB子句必须定义为CREATE TABLESPACE语句的一部分,或者InnoDB必须定义为默认存储引擎(default_storage_engine=InnoDB)。

将 table 添加到常规 table 空间

创建InnoDB常规 table 空间后,可以使用创建 tabletbl_name ... TABLESPACE [=] tablespace_nameALTER TABLE tbl_name TABLESPACE [=] tablespace_name将 table 添加到 table 空间,如以下示例所示:

CREATE TABLE:

mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1;

ALTER TABLE:

mysql> ALTER TABLE t2 TABLESPACE ts1;

Note

在 MySQL 5.7.24 中弃用了将 table 分区添加到共享 table 空间的支持,并且在将来的 MySQL 版本中将删除该支持。共享 table 空间包括InnoDB系统 table 空间和常规 table 空间。

有关语法的详细信息,请参见CREATE TABLEALTER TABLE

常规 table 空间行格式支持

常规 table 空间支持所有 table 行格式(REDUNDANTCOMPACTDYNAMICCOMPRESSED),但要注意的是,由于物理页大小不同,压缩 table 和未压缩 table 不能在同一常规 table 空间中共存。

为了使常规 table 空间包含压缩 table(ROW_FORMAT=COMPRESSED),必须指定FILE_BLOCK_SIZE,并且FILE_BLOCK_SIZE值必须是相对于innodb_page_size值的有效压缩页面大小。另外,压缩 table 的物理页面大小(KEY_BLOCK_SIZE)必须等于FILE_BLOCK_SIZE/1024。例如,如果innodb_page_size=16KBFILE_BLOCK_SIZE=8K,则 table 的KEY_BLOCK_SIZE必须为 8.

下 table 显示了允许的innodb_page_sizeFILE_BLOCK_SIZEKEY_BLOCK_SIZE组合。 FILE_BLOCK_SIZE值也可以以字节为单位指定。若要确定给定FILE_BLOCK_SIZE的有效KEY_BLOCK_SIZE值,请将FILE_BLOCK_SIZE值除以 1024.table 压缩不支持 32K 和 64K InnoDB页面大小。有关KEY_BLOCK_SIZE的更多信息,请参见CREATE TABLE第 14.9.1.2 节“创建压缩 table”

table14.3 压缩 table 的允许页面大小,FILE_BLOCK_SIZE 和 KEY_BLOCK_SIZE 组合

InnoDB 页面大小(innodb_page_size)允许的 FILE_BLOCK_SIZE 值允许的 KEY_BLOCK_SIZE 值
64KB64K (65536)不支持压缩
32KB32K (32768)不支持压缩
16KB16K (16384)N/A:如果innodb_page_size等于FILE_BLOCK_SIZE,则 table 空间不能包含压缩 table。
16KB8K (8192)8
16KB4K (4096)4
16KB2K (2048)2
16KB1K (1024)1
8KB8K (8192)N/A:如果innodb_page_size等于FILE_BLOCK_SIZE,则 table 空间不能包含压缩 table。
8KB4K (4096)4
8KB2K (2048)2
8KB1K (1024)1
4KB4K (4096)N/A:如果innodb_page_size等于FILE_BLOCK_SIZE,则 table 空间不能包含压缩 table。
4K2K (2048)2
4KB1K (1024)1

本示例演示如何创建常规 table 空间并添加压缩 table。该示例假定默认的innodb_page_size为 16KB。 8192 的FILE_BLOCK_SIZE要求压缩 table 的KEY_BLOCK_SIZE为 8.

mysql> CREATE TABLESPACE `ts2` ADD DATAFILE 'ts2.ibd' FILE_BLOCK_SIZE = 8192 Engine=InnoDB;

mysql> CREATE TABLE t4 (c1 INT PRIMARY KEY) TABLESPACE ts2 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;

如果在创建常规 table 空间时未指定FILE_BLOCK_SIZE,则FILE_BLOCK_SIZE缺省为innodb_page_size。当FILE_BLOCK_SIZE等于innodb_page_size时,table 空间只能包含未压缩行格式(COMPACTREDUNDANTDYNAMIC行格式)的 table。

使用 ALTER TABLE 在 table 空间之间移动 table

您可以将ALTER TABLETABLESPACE选项一起使用,以将 table 移至现有的常规 table 空间,新的每 table 文件 table 空间或系统 table 空间。

Note

在 MySQL 5.7.24 中已弃用了将 table 分区放置在共享 table 空间中的支持,并且在将来的 MySQL 版本中将删除该支持。共享 table 空间包括InnoDB系统 table 空间和常规 table 空间。

要将 table 从每文件文件 table 空间或系统 table 空间移至常规 table 空间,请指定常规 table 空间的名称。常规 table 空间必须存在。有关更多信息,请参见CREATE TABLESPACE

ALTER TABLE tbl_name TABLESPACE [=] tablespace_name;

要将 table 从常规 table 空间或每个 table 文件 table 空间移至系统 table 空间,请指定innodb_system作为 table 空间名称。

ALTER TABLE tbl_name TABLESPACE [=] innodb_system;

要将 table 从系统 table 空间或常规 table 空间移至每个 table 文件 table 空间,请指定innodb_file_per_table作为 table 空间名称。

ALTER TABLE tbl_name TABLESPACE [=] innodb_file_per_table;

ALTER TABLE ... TABLESPACE操作始终会导致整个 table 的重建,即使TABLESPACE属性与其之前的值相比也没有变化。

ALTER TABLE ... TABLESPACE语法不支持将 table 从临时 table 空间移动到持久 table 空间。

DATA DIRECTORY子句与CREATE TABLE ... TABLESPACE=innodb_file_per_table一起允许,但不支持与TABLESPACE选项结合使用。

从加密 table 空间中移动 table 时有限制。参见Encryption Limitations

删除常规 table 空间

DROP TABLESPACE语句用于删除InnoDB常规 table 空间。

DROP TABLESPACE操作之前,必须从 table 空间中删除所有 table。如果 table 空间不为空,则DROP TABLESPACE返回错误。

使用类似于以下内容的查询来标识常规 table 空间中的 table。

mysql> SELECT a.NAME AS space_name, b.NAME AS table_name FROM INFORMATION_SCHEMA.INNODB_TABLESPACES a,
       INFORMATION_SCHEMA.INNODB_TABLES b WHERE a.SPACE=b.SPACE AND a.NAME LIKE 'ts1';
+------------+------------+
| space_name | table_name |
+------------+------------+
| ts1        | test/t1    |
| ts1        | test/t2    |
| ts1        | test/t3    |
+------------+------------+

如果对* empty *通用 table 空间的DROP TABLESPACE操作返回错误,则该 table 空间可能包含由服务器 Export 中断的ALTER TABLE操作留下的孤立临时 table 或中间 table。有关更多信息,请参见第 14.22.3 节“对 InnoDB 数据字典操作进行故障排除”

删除 table 空间中的最后一个 table 时,一般的InnoDBtable 空间不会自动删除。必须使用DROP TABLESPACE tablespace_name明确删除 table 空间。

常规 table 空间不属于任何特定数据库。 DROP DATABASE操作可以删除属于常规 table 空间的 table,但是即使DROP DATABASE操作删除了属于该 table 空间的所有 table,也不能删除该 table 空间。必须使用DROP TABLESPACE tablespace_name显式删除常规 table 空间。

与系统 table 空间类似,截断或删除存储在通用 table 空间中的 table 会在通用 table 空间.ibd 数据文件内部内部创建可用空间,该可用空间仅可用于新的InnoDB数据。在DROP TABLE操作期间删除每 table 文件 table 空间时,不会将空间释放回 os。

本示例演示如何删除InnoDB常规 table 空间。通用 table 空间ts1是使用单个 table 创建的。必须先删除 table,然后再删除 table 空间。

mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' Engine=InnoDB;

mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1 Engine=InnoDB;

mysql> DROP TABLE t1;

mysql> DROP TABLESPACE ts1;

Note

tablespace_name是 MySQL 中区分大小写的标识符。

一般 table 空间限制
  • 生成的 table 空间或现有 table 空间不能更改为常规 table 空间。

  • 不支持创建临时通用 table 空间。

  • 常规 table 空间不支持临时 table。

  • 通用 table 空间中存储的 table 只能在支持通用 table 空间的 MySQL 版本中打开。

  • 与系统 table 空间类似,截断或删除存储在通用 table 空间中的 table 会在通用 table 空间.ibd 数据文件内部内部创建可用空间,该可用空间仅可用于新的InnoDB数据。空间不会像file-per-table个 table 空间那样释放回 os。

此外,驻留在共享 table 空间(通用 table 空间或系统 table 空间)中的 table 的 table 复制ALTER TABLE操作可以增加 table 空间使用的空间量。此类操作需要与 table 中的数据以及索引一样多的额外空间。table 复制ALTER TABLE操作所需的额外空间不会像每个 table 文件 table 空间那样释放回 os。

  • 属于常规 table 空间的 table 不支持ALTER TABLE ... DISCARD TABLESPACE更改 table...导入 table 空间

  • 在 MySQL 5.7.24 中已弃用了将 table 分区放置在常规 table 空间中的支持,并且在将来的 MySQL 版本中将删除该支持。

  • 在源和副本位于同一主机上的复制环境中,不支持ADD DATAFILE子句,因为这会导致源和副本在同一位置创建相同名称的 table 空间。