文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

17.6.3.3 通用表空间

通用表空间是一个共享的 InnoDB 表空间,它是使用 CREATE TABLESPACE 语法创建的。本节中的以下主题描述了通用表空间的功能和特性

通用表空间功能

通用表空间提供以下功能

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

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

  • 通用表空间数据文件可以放置在相对于 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;
注意

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

将表添加到通用表空间

创建通用表空间后,可以使用CREATE TABLE tbl_name ... TABLESPACE [=] tablespace_nameALTER 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 TABLEALTER TABLE

通用表空间行格式支持

通用表空间支持所有表行格式(REDUNDANTCOMPACTDYNAMICCOMPRESSED),但压缩表和未压缩表不能共存于同一个通用表空间,因为物理页面大小不同。

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

下表显示了允许的innodb_page_sizeFILE_BLOCK_SIZEKEY_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时,表空间只能包含具有未压缩行格式的表(COMPACTREDUNDANTDYNAMIC行格式)。

使用 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 TABLESFLUSH 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 TABLESPACEALTER TABLE ...IMPORT TABLESPACE不支持属于通用表空间的表。

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

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

  • 除非该目录为InnoDB所知,否则通用表空间无法在撤消表空间目录(innodb_undo_directory)中创建。已知目录是datadirinnodb_data_home_dirinnodb_directories变量定义的目录。