CREATE [UNDO] TABLESPACE tablespace_name
InnoDB and NDB:
[ADD DATAFILE 'file_name']
[AUTOEXTEND_SIZE [=] value]
InnoDB only:
[FILE_BLOCK_SIZE = value]
[ENCRYPTION [=] {'Y' | 'N'}]
NDB only:
USE LOGFILE GROUP logfile_group
[EXTENT_SIZE [=] extent_size]
[INITIAL_SIZE [=] initial_size]
[MAX_SIZE [=] max_size]
[NODEGROUP [=] nodegroup_id]
[WAIT]
[COMMENT [=] 'string']
InnoDB and NDB:
[ENGINE [=] engine_name]
Reserved for future use:
[ENGINE_ATTRIBUTE [=] 'string']
此语句用于创建表空间。确切的语法和语义取决于使用的存储引擎。在标准 MySQL 版本中,这始终是 InnoDB
表空间。MySQL NDB 集群还支持使用 NDB
存储引擎的表空间。
InnoDB 的注意事项
CREATE TABLESPACE
语法用于创建通用表空间或撤消表空间。必须指定 UNDO
关键字才能创建撤消表空间。
通用表空间是共享表空间。它可以容纳多个表,并支持所有表行格式。可以在相对于数据目录或独立于数据目录的位置创建通用表空间。
在创建 InnoDB
通用表空间之后,使用 CREATE TABLE
或 tbl_name
... TABLESPACE [=] tablespace_name
ALTER TABLE
将表添加到表空间。有关更多信息,请参阅第 17.6.3.3 节,“通用表空间”。tbl_name
TABLESPACE [=] tablespace_name
撤销表空间包含撤销日志。可以通过指定完全限定的数据文件路径在选定位置创建撤销表空间。有关更多信息,请参阅第 17.6.3.4 节,“撤销表空间”。
NDB 集群注意事项
此语句用于创建一个表空间,该表空间可以包含一个或多个数据文件,为 NDB 集群磁盘数据表提供存储空间(请参阅第 25.6.11 节,“NDB 集群磁盘数据表”)。使用此语句创建一个数据文件并将其添加到表空间。可以使用 ALTER TABLESPACE
语句将其他数据文件添加到表空间(请参阅第 15.1.10 节,“ALTER TABLESPACE 语句”)。
所有 NDB 集群磁盘数据对象共享相同的命名空间。这意味着每个磁盘数据对象都必须具有唯一的名称(而不仅仅是给定类型的每个磁盘数据对象)。例如,您不能拥有同名的表空间和日志文件组,或者同名的表空间和数据文件。
必须使用 USE LOGFILE GROUP
子句将包含一个或多个 UNDO
日志文件的日志文件组分配给要创建的表空间。logfile_group
必须是使用 CREATE LOGFILE GROUP
创建的现有日志文件组(请参阅第 15.1.16 节,“CREATE LOGFILE GROUP 语句”)。多个表空间可以使用同一个日志文件组进行 UNDO
日志记录。
设置 EXTENT_SIZE
或 INITIAL_SIZE
时,可以选择在数字后面跟一个表示数量级的单字母缩写,类似于 my.cnf
中使用的缩写。通常,这是字母 M
(表示兆字节)或 G
(表示千兆字节)之一。
INITIAL_SIZE
和 EXTENT_SIZE
的舍入规则如下
EXTENT_SIZE
向上舍入到最接近的 32K 的整数倍。INITIAL_SIZE
向下舍入到最接近的 32K 的整数倍;此结果向上舍入到最接近的EXTENT_SIZE
的整数倍(在进行任何舍入之后)。
NDB
为数据节点重启操作保留了 4% 的表空间。此保留空间不能用于数据存储。
上述舍入是显式完成的,并且当执行任何此类舍入时,MySQL 服务器会发出警告。NDB 内核还使用舍入后的值来计算 INFORMATION_SCHEMA.FILES
列值和其他用途。但是,为避免意外结果,我们建议您在指定这些选项时始终使用 32K 的整数倍。
当 CREATE TABLESPACE
与 ENGINE [=] NDB
一起使用时,会在每个集群数据节点上创建一个表空间和关联的数据文件。您可以通过查询信息架构 FILES
表来验证数据文件是否已创建并获取有关它们的信息。(请参阅本节后面的示例。)
(请参阅第 28.3.15 节,“INFORMATION_SCHEMA FILES 表”。)
选项
ADD DATAFILE
:定义表空间数据文件的名称。创建NDB
表空间时始终需要此选项;对于InnoDB
,仅在创建撤销表空间时才需要此选项。
(包括任何指定的路径)必须用单引号或双引号引起来。文件名(不包括文件扩展名)和目录名必须至少为一个字节长。不支持零长度文件名和目录名。file_name
由于
InnoDB
和NDB
处理数据文件的方式存在很大差异,因此在下面的讨论中将分别介绍这两种存储引擎。InnoDB 数据文件。
InnoDB
表空间仅支持一个数据文件,其名称必须包含.ibd
扩展名。要将
InnoDB
通用表空间数据文件放置在数据目录之外的位置,请包含完全限定路径或相对于数据目录的路径。撤销表空间只允许使用完全限定路径。如果未指定路径,则会在数据目录中创建通用表空间。在未指定路径的情况下创建的撤销表空间将在innodb_undo_directory
变量定义的目录中创建。如果未设置innodb_undo_directory
,则会在数据目录中创建撤销表空间。为了避免与隐式创建的“每个表一个文件”表空间发生冲突,不支持在数据目录下的子目录中创建
InnoDB
通用表空间。在数据目录之外创建通用表空间或撤销表空间时,该目录必须存在,并且在创建表空间之前必须为InnoDB
所知。要使InnoDB
知道某个目录,请将其添加到innodb_directories
值或其值附加到innodb_directories
值的变量之一中。innodb_directories
是一个只读变量。配置它需要重新启动服务器。如果在创建
InnoDB
表空间时未指定ADD DATAFILE
子句,则会隐式创建一个具有唯一文件名的表空间数据文件。唯一文件名是一个 128 位 UUID,格式化为由破折号分隔的五组十六进制数字(aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
)。如果存储引擎需要,则会添加文件扩展名。对于InnoDB
通用表空间数据文件,会添加.ibd
文件扩展名。在复制环境中,复制源服务器上创建的数据文件名与副本上创建的数据文件名不同。创建
InnoDB
表空间时,ADD DATAFILE
子句不允许循环目录引用。例如,以下语句中的循环目录引用(/../
)是不允许的CREATE TABLESPACE ts1 ADD DATAFILE ts1.ibd 'any_directory/../ts1.ibd';
Linux 上存在此限制的例外情况,如果前面的目录是符号链接,则允许循环目录引用。例如,如果
any_directory
是符号链接,则允许上述示例中的数据文件路径。(仍然允许数据文件路径以“../
”开头。)NDB 数据文件。
NDB
表空间支持多个数据文件,这些文件可以具有任何合法的文件名;可以使用ALTER TABLESPACE
语句在创建 NDB 集群表空间后向其中添加更多数据文件。默认情况下,
NDB
表空间数据文件是在数据节点文件系统目录中创建的,即数据节点数据目录 (DataDir
) 下名为ndb_
的目录,其中nodeid
_fs/TSnodeid
是数据节点的NodeId
。要将数据文件放置在默认位置以外的位置,请包含绝对目录路径或相对于默认位置的路径。如果指定的目录不存在,则NDB
会尝试创建它;运行数据节点进程的系统用户帐户必须具有相应的权限才能这样做。注意确定数据文件的路径时,
NDB
不会扩展~
(波浪号)字符。在同一台物理主机上运行多个数据节点时,请注意以下事项
创建数据文件时不能指定绝对路径。
除非每个数据节点都有一个单独的数据目录,否则无法在数据节点文件系统目录之外创建表空间数据文件。
如果每个数据节点都有自己的数据目录,则可以在该目录中的任何位置创建数据文件。
如果每个数据节点都有自己的数据目录,则也可以使用相对路径在节点的数据目录之外创建数据文件,只要此路径解析为该主机文件系统上运行的每个数据节点的唯一位置即可。
FILE_BLOCK_SIZE
:此选项特定于InnoDB
通用表空间,NDB
会忽略它,它定义表空间数据文件的块大小。可以用字节或千字节指定值。例如,8 千字节的文件块大小可以指定为 8192 或 8K。如果未指定此选项,则FILE_BLOCK_SIZE
默认为innodb_page_size
值。当您打算使用表空间存储压缩的InnoDB
表(ROW_FORMAT=COMPRESSED
)时,需要使用FILE_BLOCK_SIZE
。在这种情况下,您必须在创建表空间时定义表空间FILE_BLOCK_SIZE
。如果
FILE_BLOCK_SIZE
等于innodb_page_size
值,则表空间只能包含具有未压缩行格式(COMPACT
、REDUNDANT
和DYNAMIC
)的表。具有COMPRESSED
行格式的表的物理页面大小与未压缩的表不同。因此,压缩表不能与未压缩表共存于同一个表空间中。要使通用表空间包含压缩表,必须指定
FILE_BLOCK_SIZE
,并且FILE_BLOCK_SIZE
值必须是相对于innodb_page_size
值的有效压缩页面大小。此外,压缩表的物理页面大小(KEY_BLOCK_SIZE
)必须等于FILE_BLOCK_SIZE/1024
。例如,如果innodb_page_size=16K
且FILE_BLOCK_SIZE=8K
,则表的KEY_BLOCK_SIZE
必须为 8。有关更多信息,请参阅第 17.6.3.3 节,“通用表空间”。USE LOGFILE GROUP
:NDB
需要此选项,它是之前使用CREATE LOGFILE GROUP
创建的日志文件组的名称。不支持InnoDB
,如果使用它,则会失败并报错。EXTENT_SIZE
:此选项特定于 NDB,InnoDB 不支持该选项,如果使用该选项,InnoDB 会发生错误。EXTENT_SIZE
设置属于表空间的任何文件使用的区大小(以字节为单位)。默认值为 1M。最小大小为 32K,理论最大值为 2G,但实际最大大小取决于许多因素。在大多数情况下,更改区大小对性能没有任何可衡量的影响,建议在除最特殊情况以外的所有情况下都使用默认值。区是磁盘空间分配的单位。一个区将填充尽可能多的数据,直到该区已满,然后才会使用另一个区。理论上,每个数据文件最多可以使用 65,535(64K)个区;但是,建议的最大值为 32,768(32K)。单个数据文件的建议最大大小为 32G,即 32K 个区 × 每个区 1 MB。此外,一旦将一个区分配给给定分区,就不能将其用于存储来自不同分区的数据;一个区不能存储来自多个分区的数据。例如,这意味着具有单个数据文件的表空间(其
INITIAL_SIZE
(在下一项中介绍)为 256 MB,EXTENT_SIZE
为 128M)只有两个区,因此最多可用于存储来自两个不同磁盘数据表分区的数据。您可以通过查询 Information Schema
FILES
表来查看给定数据文件中还剩多少个可用区,从而估算出文件中还剩多少可用空间。有关进一步的讨论和示例,请参见第 28.3.15 节“INFORMATION_SCHEMA FILES 表”。INITIAL_SIZE
:此选项特定于NDB
,InnoDB
不支持该选项,如果使用该选项,则会发生错误。INITIAL_SIZE
参数使用ADD DATATFILE
设置已指定的数据文件的总大小(以字节为单位)。创建此文件后,将无法更改其大小;但是,您可以使用ALTER TABLESPACE ... ADD DATAFILE
将更多数据文件添加到表空间。INITIAL_SIZE
是可选的;其默认值为 134217728(128 MB)。在 32 位系统上,
INITIAL_SIZE
的最大支持值为 4294967296(4 GB)。AUTOEXTEND_SIZE
:定义InnoDB
在表空间已满时扩展其大小的量。该设置必须为 4MB 的倍数。默认设置为 0,这会导致表空间根据隐式默认行为进行扩展。有关更多信息,请参见第 17.6.3.9 节“表空间 AUTOEXTEND_SIZE 配置”。在任何版本的 MySQL NDB Cluster 中均不起作用,无论使用哪种存储引擎。
MAX_SIZE
:当前被 MySQL 忽略;保留以供将来使用。在任何版本的 MySQL 或 MySQL NDB Cluster 中均不起作用,无论使用哪种存储引擎。NODEGROUP
:当前被 MySQL 忽略;保留以供将来使用。在任何版本的 MySQL 或 MySQL NDB Cluster 中均不起作用,无论使用哪种存储引擎。WAIT
:当前被 MySQL 忽略;保留以供将来使用。在任何版本的 MySQL 或 MySQL NDB Cluster 中均不起作用,无论使用哪种存储引擎。COMMENT
:当前被 MySQL 忽略;保留以供将来使用。在任何版本的 MySQL 或 MySQL NDB Cluster 中均不起作用,无论使用哪种存储引擎。ENCRYPTION
子句启用或禁用InnoDB
常规表空间的页面级数据加密。如果未指定
ENCRYPTION
子句,则default_table_encryption
设置控制是否启用加密。ENCRYPTION
子句会覆盖default_table_encryption
设置。但是,如果启用了table_encryption_privilege_check
变量,则需要TABLE_ENCRYPTION_ADMIN
权限才能使用与default_table_encryption
设置不同的ENCRYPTION
子句设置。必须先安装和配置密钥环插件,然后才能创建启用加密的表空间。
对常规表空间进行加密后,驻留在该表空间中的所有表都将被加密。同样,在加密表空间中创建的表也会被加密。
有关更多信息,请参见第 17.13 节“InnoDB 静态数据加密”
ENGINE
:定义使用表空间的存储引擎,其中engine_name
是存储引擎的名称。当前,标准 MySQL 9.0 版本仅支持InnoDB
存储引擎。MySQL NDB Cluster 支持NDB
和InnoDB
表空间。如果未指定ENGINE
选项,则将使用default_storage_engine
系统变量的值。ENGINE_ATTRIBUTE
选项用于指定主要存储引擎的表空间属性。该选项保留供将来使用。分配给此选项的值必须是包含有效 JSON 文档的字符串文字或空字符串 ('')。无效的 JSON 将被拒绝。
CREATE TABLESPACE ts1 ENGINE_ATTRIBUTE='{"key":"value"}';
ENGINE_ATTRIBUTE
值可以重复,不会出错。在这种情况下,将使用最后指定的值。服务器不会检查
ENGINE_ATTRIBUTE
值,并且在更改表的存储引擎时也不会清除这些值。
注意
有关涵盖 MySQL 表空间命名规则的信息,请参见第 11.2 节“架构对象名称”。除了这些规则之外,还不允许使用斜杠字符(“/”),也不能使用以
innodb_
开头的名称,因为此前缀是系统保留使用的。不支持创建临时常规表空间。
常规表空间不支持临时表。
TABLESPACE
选项可以与CREATE TABLE
或ALTER TABLE
一起使用,以将InnoDB
表分区或子分区分配给每个表一个文件的表空间。所有分区必须属于同一存储引擎。不支持将表分区分配给共享InnoDB
表空间。共享表空间包括InnoDB
系统表空间和常规表空间。常规表空间支持使用
CREATE TABLE ... TABLESPACE
添加任何行格式的表。不需要启用innodb_file_per_table
。innodb_strict_mode
不适用于常规表空间。表空间管理规则严格执行,与innodb_strict_mode
无关。如果CREATE TABLESPACE
参数不正确或不兼容,则无论innodb_strict_mode
设置如何,操作都将失败。使用CREATE TABLE ... TABLESPACE
或ALTER TABLE ... TABLESPACE
将表添加到常规表空间时,将忽略innodb_strict_mode
,但会像启用了innodb_strict_mode
一样评估该语句。使用
DROP TABLESPACE
删除表空间。在删除表空间之前,必须使用DROP TABLE
从表空间中删除所有表。在删除 NDB Cluster 表空间之前,您还必须使用一个或多个ALTER TABLESPACE ... DROP DATATFILE
语句删除其所有数据文件。请参见第 25.6.11.1 节“NDB Cluster 磁盘数据对象”。添加到
InnoDB
常规表空间的InnoDB
表的所有部分都驻留在该常规表空间中,包括索引和BLOB
页面。对于分配给表空间的
NDB
表,只有未编制索引的列存储在磁盘上,并实际使用表空间数据文件。所有NDB
表的索引和索引列始终保留在内存中。与系统表空间类似,截断或删除存储在常规表空间中的表会在常规表空间 .ibd 数据文件 内部创建可用空间,该空间只能用于新的
InnoDB
数据。与每个表一个文件的表空间不同,空间不会释放回操作系统。常规表空间不与任何数据库或架构相关联。
对于属于常规表空间的表,不支持
ALTER TABLE ... DISCARD TABLESPACE
和ALTER TABLE ...IMPORT TABLESPACE
。对于引用常规表空间的 DDL,服务器使用表空间级元数据锁定。相比之下,对于引用每个表一个文件的表空间的 DDL,服务器使用表级元数据锁定。
无法将生成或现有的表空间更改为常规表空间。
常规表空间名称和每个表一个文件的表空间名称之间没有冲突。每个表一个文件的表空间名称中出现的 “/” 字符在常规表空间名称中是不允许的。
mysqldump 不会转储
InnoDB
CREATE TABLESPACE
语句。
InnoDB 示例
此示例演示如何创建常规表空间并添加三个不同行格式的未压缩表。
mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' ENGINE=INNODB;
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1 ROW_FORMAT=REDUNDANT;
mysql> CREATE TABLE t2 (c1 INT PRIMARY KEY) TABLESPACE ts1 ROW_FORMAT=COMPACT;
mysql> CREATE TABLE t3 (c1 INT PRIMARY KEY) TABLESPACE ts1 ROW_FORMAT=DYNAMIC;
此示例演示如何创建常规表空间并添加压缩表。该示例假设默认 innodb_page_size
值为 16K。 8192 的 FILE_BLOCK_SIZE
要求压缩表的 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;
此示例演示如何在不指定 ADD DATAFILE
子句的情况下创建常规表空间,该子句是可选的
mysql> CREATE TABLESPACE `ts3` ENGINE=INNODB;
此示例演示如何创建撤消表空间
mysql> CREATE UNDO TABLESPACE undo_003 ADD DATAFILE 'undo_003.ibu';
NDB 示例
假设您希望使用名为 mydata-1.dat
的数据文件创建一个名为 myts
的 NDB Cluster 磁盘数据表空间。 NDB
表空间始终需要使用由一个或多个撤消日志文件组成的日志文件组。对于此示例,我们首先创建一个名为 mylg
的日志文件组,其中包含一个名为 myundo-1.dat
的撤消长文件,使用 CREATE LOGFILE GROUP
语句(如下所示)
mysql> CREATE LOGFILE GROUP myg1
-> ADD UNDOFILE 'myundo-1.dat'
-> ENGINE=NDB;
Query OK, 0 rows affected (3.29 sec)
现在,您可以使用以下语句创建前面描述的表空间
mysql> CREATE TABLESPACE myts
-> ADD DATAFILE 'mydata-1.dat'
-> USE LOGFILE GROUP mylg
-> ENGINE=NDB;
Query OK, 0 rows affected (2.98 sec)
您现在可以使用带有 TABLESPACE
和 STORAGE DISK
选项的 CREATE TABLE
语句创建磁盘数据表,如下所示
mysql> CREATE TABLE mytable (
-> id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> lname VARCHAR(50) NOT NULL,
-> fname VARCHAR(50) NOT NULL,
-> dob DATE NOT NULL,
-> joined DATE NOT NULL,
-> INDEX(last_name, first_name)
-> )
-> TABLESPACE myts STORAGE DISK
-> ENGINE=NDB;
Query OK, 0 rows affected (1.41 sec)
需要注意的是,由于 id
、lname
和 fname
列都已建立索引,因此实际上只有 mytable
中的 dob
和 joined
列存储在磁盘上。
如前所述,当 CREATE TABLESPACE
与 ENGINE [=] NDB
一起使用时,会在每个 NDB 集群数据节点上创建一个表空间及其关联的数据文件。您可以通过查询信息架构 FILES
表来验证数据文件是否已创建并获取有关它们的信息,如下所示
mysql> SELECT FILE_NAME, FILE_TYPE, LOGFILE_GROUP_NAME, STATUS, EXTRA
-> FROM INFORMATION_SCHEMA.FILES
-> WHERE TABLESPACE_NAME = 'myts';
+--------------+------------+--------------------+--------+----------------+
| file_name | file_type | logfile_group_name | status | extra |
+--------------+------------+--------------------+--------+----------------+
| mydata-1.dat | DATAFILE | mylg | NORMAL | CLUSTER_NODE=5 |
| mydata-1.dat | DATAFILE | mylg | NORMAL | CLUSTER_NODE=6 |
| NULL | TABLESPACE | mylg | NORMAL | NULL |
+--------------+------------+--------------------+--------+----------------+
3 rows in set (0.01 sec)
有关其他信息和示例,请参阅 第 25.6.11.1 节“NDB 集群磁盘数据对象”。