通用表空间是使用 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
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1;
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
行格式) 的表。
使用 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;
是 MySQL 中区分大小写的标识符。tablespace_name
生成的或已存在的表空间不能更改为通用表空间。
不支持创建临时通用表空间。
通用表空间不支持临时表。
与系统表空间类似,截断或删除存储在通用表空间中的表会在通用表空间 .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
变量定义的目录。