通用表空间InnoDB
是使用CREATE
TABLESPACE
语法创建的共享表空间。本节的以下主题描述了常规表空间功能和特性:
通用表空间提供以下功能:
与系统表空间类似,通用表空间是能够为多个表存储数据的共享表空间。
与file-per-table 表空间 相比,通用表空间具有潜在的内存优势 。服务器在表空间的生命周期内将表空间元数据保存在内存中。更少的通用表空间中的多个表比单独的每个表文件表空间中的相同数量的表消耗更少的表空间元数据内存。
通用表空间数据文件可以放在相对于或独立于MySQL数据目录的目录中,这为您提供了 file-per-table表空间的许多数据文件和存储管理功能。与 file-per-table 表空间一样,将数据文件放置在 MySQL 数据目录之外的能力允许您单独管理关键表的性能,为特定表设置 RAID 或 DRBD,或者将表绑定到特定磁盘,例如。
通用表空间同时支持 Antelope 和 Barracuda 文件格式,因此支持所有表行格式和相关功能。由于支持两种文件格式,通用表空间没有依赖
innodb_file_format
或innodb_file_per_table
设置,这些变量也不会对通用表空间产生任何影响。该
TABLESPACE
选项可用于CREATE TABLE
在通用表空间、file-per-table 表空间或系统表空间中创建表。该
TABLESPACE
选项可用于ALTER TABLE
在通用表空间、file-per-table 表空间和系统表空间之间移动表。
通用表空间是使用
CREATE TABLESPACE
语法创建的。
CREATE TABLESPACE tablespace_name
ADD DATAFILE 'file_name'
[FILE_BLOCK_SIZE = value]
[ENGINE [=] engine_name]
可以在数据目录中或数据目录外创建通用表空间。为避免与隐式创建的 file-per-table 表空间发生冲突,不支持在数据目录下的子目录中创建通用表空间。在数据目录之外创建通用表空间时,该目录必须在创建表空间之前存在。
当在 MySQL 数据目录之外创建通用表空间时,会在 MySQL 数据目录中创建 一个.isl文件。
例子:
在数据目录中创建一个通用表空间:
mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' Engine=InnoDB;
在数据目录之外的目录中创建通用表空间:
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
)。
创建通用表空间后,
可以使用or
语句向表空间中添加表,示例如下:
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;
MySQL 5.7.24 中不再支持将表分区添加到共享表空间;希望在未来的 MySQL 版本中将其删除。共享表空间包括
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
值也可以以字节为单位指定。要确定KEY_BLOCK_SIZE
给定的有效值FILE_BLOCK_SIZE
,请将该
FILE_BLOCK_SIZE
值除以 1024。表压缩不支持 32K 和 64K
InnoDB
页面大小。有关 的更多信息
KEY_BLOCK_SIZE
,请参阅
CREATE TABLE
和
第 14.9.1.2 节“创建压缩表”。
表 14.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 ,则表空间不能包含压缩表。 |
4K | 2K (2048) | 2个 |
4KB | 1K (1024) | 1个 |
此示例演示创建通用表空间和添加压缩表。该示例假定默认
innodb_page_size
值为 16KB。8192的
FILE_BLOCK_SIZE
要求压缩表的 aKEY_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
with
TABLESPACE
选项可用于将表移动到现有的通用表空间、新的 file-per-table 表空间或系统表空间。
在 MySQL 5.7.24 中弃用了对在共享表空间中放置表分区的支持;希望在未来的 MySQL 版本中将其删除。共享表空间包括
InnoDB
系统表空间和通用表空间。
要将表从 file-per-table 表空间或从系统表空间移动到通用表空间,请指定通用表空间的名称。通用表空间必须存在。有关
ALTER TABLESPACE
详细信息,请参阅。
ALTER TABLE tbl_name TABLESPACE [=] tablespace_name;
要将表从通用表空间或 file-per-table 表空间移动到系统表空间,请指定
innodb_system
为表空间名称。
ALTER TABLE tbl_name TABLESPACE [=] innodb_system;
要将表从系统表空间或通用表空间移动到 file-per-table 表空间,请指定
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
选项结合使用。
从加密表空间移动表时有限制。请参阅 加密限制。
该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 |
+------------+------------+
如果DROP TABLESPACE
对空通用表空间的操作返回错误,则该表空间可能包含一个孤立的临时表或中间表,该表由
ALTER TABLE
被服务器出口中断的操作留下。有关详细信息,请参阅
第 14.22.3 节,“InnoDB 数据字典操作故障排除”。
InnoDB
删除表空间中的最后一个表时,不会自动删除
通用表空间。必须使用 显式删除表空间
。
DROP TABLESPACE
tablespace_name
通用表空间不属于任何特定的数据库。操作可以删除属于通用表空间的DROP DATABASE
表,但不能删除表空间,即使该DROP
DATABASE
操作删除了属于该表空间的所有表。
与系统表空间类似,截断或删除存储在通用表空间中的表会在通用表空间.ibd 数据文件内部创建只能用于新
InnoDB
数据的可用空间。空间不会像在操作期间删除 file-per-table 表空间时那样释放回操作系统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
生成的或现有的表空间不能更改为通用表空间。
不支持创建临时通用表空间。
一般表空间不支持临时表。
存储在通用表空间中的表只能在支持通用表空间的 MySQL 版本中打开。
与系统表空间类似,截断或删除存储在通用表空间中的表会在通用表空间 .ibd 数据文件内部创建只能用于新
InnoDB
数据的可用空间。空间不会像file-per-table表空间那样释放回操作系统 。Additionally, a table-copying
ALTER TABLE
operation on table that resides in a shared tablespace (a general tablespace or the system tablespace) can increase the amount of space used by the tablespace. Such operations require as much additional space as the data in the table plus indexes. The additional space required for the table-copyingALTER TABLE
operation is not released back to the operating system as it is for file-per-table tablespaces.ALTER TABLE ... DISCARD TABLESPACE
andALTER TABLE ...IMPORT TABLESPACE
are not supported for tables that belong to a general tablespace.在 MySQL 5.7.24 中弃用了对在通用表空间中放置表分区的支持;希望在未来的 MySQL 版本中将其删除。
在源和副本位于同一主机上的复制环境中不支持该
ADD DATAFILE
子句,因为它会导致源和副本在同一位置创建同名的表空间。