14.6.3.3 通用 table 空间

常规 table 空间是使用CREATE TABLESPACE语法创建的共享InnoDBtable 空间。本节的以下主题在下面描述了常规的 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 值
64KB 64K (65536) 不支持压缩
32KB 32K (32768) 不支持压缩
16KB 16K (16384) N/A:如果innodb_page_size等于FILE_BLOCK_SIZE,则 table 空间不能包含压缩 table。
16KB 8K (8192) 8
16KB 4K (4096) 4
16KB 2K (2048) 2
16KB 1K (1024) 1
8KB 8K (8192) N/A:如果innodb_page_size等于FILE_BLOCK_SIZE,则 table 空间不能包含压缩 table。
8KB 4K (4096) 4
8KB 2K (2048) 2
8KB 1K (1024) 1
4KB 4K (4096) N/A:如果innodb_page_size等于FILE_BLOCK_SIZE,则 table 空间不能包含压缩 table。
4K 2K (2048) 2
4KB 1K (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 复制ALTER TABLE操作可以增加 table 空间使用的空间量。此类操作需要与 table 中的数据以及索引一样多的额外空间。table 复制ALTER TABLE操作所需的额外空间不会像每个 table 文件 table 空间那样释放回 os。

首页