通用表空间是一个共享的 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_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
变量定义的目录。