文档首页
MySQL 8.4 参考手册
相关文档 下载此手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  通用表空间

17.6.3.3 通用表空间

通用表空间是使用 CREATE TABLESPACE 语法创建的共享 InnoDB 表空间。通用表空间的功能和特性在本节的以下主题中介绍

通用表空间功能

通用表空间提供以下功能

  • 与系统表空间类似,通用表空间是共享表空间,能够存储多个表的。数据。

  • 通用表空间相对于 每个表一个文件表空间 具有潜在的内存优势。服务器将表空间元数据保存在内存中,直到表空间的生命周期结束。较少通用表空间中的多个表比相同数量的表在独立的每个表一个文件表空间中消耗的表空间元数据内存更少。

  • 通用表空间数据文件可以放置在相对于 MySQL 数据目录或独立于 MySQL 数据目录的目录中,这为您提供了 每个表一个文件表空间 的许多数据文件和存储管理功能。与每个表一个文件表空间一样,能够将数据文件放置在 MySQL 数据目录之外使您能够单独管理关键表的性能、为特定表设置 RAID 或 DRBD,或将表绑定到特定磁盘,例如。

  • 通用表空间支持所有表行格式和关联的特性。

  • 可以使用 TABLESPACE 选项与 CREATE TABLE 一起在通用表空间、每个表一个文件表空间或系统表空间中创建表。

  • 可以使用 TABLESPACE 选项与 ALTER TABLE 一起在通用表空间、每个表一个文件表空间和系统表空间之间移动表。

创建通用表空间

通用表空间是使用 CREATE TABLESPACE 语法创建的。

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

通用表空间可以在数据目录中或数据目录之外创建。为了避免与隐式创建的每个表一个文件表空间发生冲突,不支持在数据目录下的子目录中创建通用表空间。在数据目录之外创建通用表空间时,目录必须存在,并且在创建表空间之前必须为 InnoDB 所知。要使未知目录为 InnoDB 所知,请将该目录添加到 innodb_directories 参数值中。 innodb_directories 是一个只读启动选项。配置它需要重新启动服务器。

示例

在数据目录中创建通用表空间

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

或

mysql> CREATE TABLESPACE `ts1` Engine=InnoDB;

ADD DATAFILE 子句是可选的。如果在创建表空间时未指定 ADD DATAFILE 子句,则会隐式创建具有唯一文件名 的表空间数据文件。唯一文件名是一个 128 位 UUID,格式化为五个由连字符分隔的十六进制数字组 (aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee)。通用表空间数据文件包含 .ibd 文件扩展名。在复制环境中,在源上创建的数据文件名与在副本上创建的数据文件名不同。

在数据目录之外的目录中创建通用表空间

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

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

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

必须在 CREATE TABLESPACE 语句中定义 ENGINE = InnoDB 子句,或者将 InnoDB 定义为默认存储引擎 (default_storage_engine=InnoDB)。

将表添加到通用表空间

创建通用表空间后,可以使用 CREATE TABLE tbl_name ... TABLESPACE [=] tablespace_name 或 ALTER TABLE tbl_name TABLESPACE [=] tablespace_name 语句将表添加到表空间,如下例所示

CREATE TABLE:

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

ALTER TABLE:

mysql> ALTER TABLE t2 TABLESPACE ts1;

不支持将表分区添加到共享表空间。共享表空间包括 InnoDB 系统表空间和通用表空间。

有关详细的语法信息,请参见 CREATE TABLE 和 ALTER TABLE。

通用表空间行格式支持

通用表空间支持所有表行格式 (REDUNDANT、COMPACT、DYNAMIC、COMPRESSED),但压缩表和未压缩表不能共存于同一个通用表空间中,因为它们的物理页大小不同。

对于包含压缩表 (ROW_FORMAT=COMPRESSED) 的通用表空间,必须指定 FILE_BLOCK_SIZE 选项,并且 FILE_BLOCK_SIZE 值必须是与 innodb_page_size 值相关的有效压缩页大小。此外,压缩表的物理页大小 (KEY_BLOCK_SIZE) 必须等于 FILE_BLOCK_SIZE/1024。例如,如果 innodb_page_size=16KB 并且 FILE_BLOCK_SIZE=8K,则表的 KEY_BLOCK_SIZE 必须为 8。

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

表 17.3 压缩表的允许页大小、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) 无。如果 innodb_page_size 等于 FILE_BLOCK_SIZE,则表空间不能包含压缩表。
16KB 8K (8192) 8
16KB 4K (4096) 4
16KB 2K (2048) 2
16KB 1K (1024) 1
8KB 8K (8192) 无。如果 innodb_page_size 等于 FILE_BLOCK_SIZE,则表空间不能包含压缩表。
8KB 4K (4096) 4
8KB 2K (2048) 2
8KB 1K (1024) 1
4KB 4K (4096) 无。如果 innodb_page_size 等于 FILE_BLOCK_SIZE,则表空间不能包含压缩表。
4KB 2K (2048) 2
4KB 1K (1024) 1

此示例演示了如何创建通用表空间并添加压缩表。该示例假定默认的 innodb_page_size 为 16KB。 FILE_BLOCK_SIZE 为 8192 要求压缩表具有 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;

如果在创建通用表空间时未指定 FILE_BLOCK_SIZE,则 FILE_BLOCK_SIZE 默认值为 innodb_page_size。当 FILE_BLOCK_SIZE 等于 innodb_page_size 时,表空间只能包含具有未压缩行格式 (COMPACT、REDUNDANT 和 DYNAMIC 行格式) 的表。

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

使用 TABLESPACE 选项的 ALTER TABLE 可以将表移动到现有的通用表空间、新的每个表一个文件表空间或系统表空间。

不支持将表分区添加到共享表空间。共享表空间包括 InnoDB 系统表空间和通用表空间。

要将表从每个表一个文件表空间或系统表空间移动到通用表空间,请指定通用表空间的名称。通用表空间必须存在。有关更多信息,请参见 ALTER TABLESPACE。

ALTER TABLE tbl_name TABLESPACE [=] tablespace_name;

要将表从通用表空间或每个表一个文件表空间移动到系统表空间,请指定 innodb_system 作为表空间名称。

ALTER TABLE tbl_name TABLESPACE [=] innodb_system;

要将表从系统表空间或通用表空间移动到每个表一个文件表空间,请指定 innodb_file_per_table 作为表空间名称。

ALTER TABLE tbl_name TABLESPACE [=] innodb_file_per_table;

ALTER TABLE ... TABLESPACE 操作会导致完全重建表,即使 TABLESPACE 属性没有从其以前的值更改。

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

DATA DIRECTORY 子句允许与 CREATE TABLE ... TABLESPACE=innodb_file_per_table 一起使用,但在其他情况下不支持与 TABLESPACE 选项组合使用。在 DATA DIRECTORY 子句中指定的目录必须为 InnoDB 所知。有关更多信息,请参见 使用 DATA DIRECTORY 子句。

从加密表空间移动表时,会应用限制。请参见 加密限制。

重命名通用表空间

使用 ALTER TABLESPACE ... RENAME TO 语法支持重命名通用表空间。

ALTER TABLESPACE s1 RENAME TO s2;

重命名通用表空间需要 CREATE TABLESPACE 权限。

RENAME TO 操作在 autocommit 模式下隐式执行,无论 autocommit 设置如何。

当对位于表空间中的表执行 LOCK TABLES 或 FLUSH TABLES WITH READ LOCK 时,不能执行 RENAME TO 操作。

在重命名表空间时,会对通用表空间中的表进行排他性 元数据锁,从而阻止并发 DDL。支持并发 DML。

删除通用表空间

使用 DROP TABLESPACE 语句删除 InnoDB 通用表空间。

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

使用类似于以下的查询来识别通用表空间中的表。

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    |
+------------+------------+

删除通用表空间中的最后一个表时,不会自动删除通用 InnoDB 表空间。必须使用 DROP TABLESPACE tablespace_name 显式删除表空间。

通用表空间不属于任何特定数据库。 DROP DATABASE 操作可以删除属于通用表空间的表,但不能删除表空间,即使 DROP DATABASE 操作删除了属于该表空间的所有表。

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

此示例演示了如何删除 InnoDB 通用表空间。通用表空间 ts1 是使用单个表创建的。必须在删除表空间之前删除该表。

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;
注意

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

通用表空间限制
  • 生成的或已存在的表空间不能更改为通用表空间。

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

  • 通用表空间不支持临时表。

  • 与系统表空间类似,截断或删除存储在通用表空间中的表会在通用表空间 .ibd 数据文件 中内部创建可用空间,该空间只能用于新的 InnoDB 数据。空间不会释放回操作系统,就像 每个表一个文件 表空间一样。

    此外,对位于共享表空间(通用表空间或系统表空间)中的表的表复制 ALTER TABLE 操作可能会增加表空间使用的空间量。此类操作需要与表中的数据加上索引一样多的额外空间。表复制 ALTER TABLE 操作所需的额外空间不会释放回操作系统,就像每个表一个文件表空间一样。

  • ALTER TABLE ... DISCARD TABLESPACE 和 ALTER TABLE ...IMPORT TABLESPACE 不支持属于通用表空间的表。

  • 不支持将表分区放置在通用表空间中。

  • 在源和副本位于同一主机的复制环境中,不支持 ADD DATAFILE 子句,因为它会导致源和副本在同一位置创建相同名称的表空间,这是不支持的。但是,如果省略了 ADD DATAFILE 子句,则表空间将在数据目录中以生成的唯一文件名创建,这是允许的。

  • 除非该目录为 InnoDB 所知,否则通用表空间不能在撤消表空间目录 (innodb_undo_directory) 中创建。已知目录是由 datadir、innodb_data_home_dir 和 innodb_directories 变量定义的目录。