CREATE TABLESPACE语句
CREATE [UNDO ]TABLESPACE tablespace_name InnoDB andNDB : [ADD DATAFILE 'file_name'] InnoDBonly : [FILE_BLOCK_SIZE =value ] [ENCRYPTION [=] {'Y' | 'N'}]NDB only :USE LOGFILE GROUP logfile_group [EXTENT_SIZE [=] extent_size] [INITIAL_SIZE [=] initial_size] [AUTOEXTEND_SIZE [=] autoextend_size] [MAX_SIZE [=] max_size] [NODEGROUP [=] nodegroup_id] [WAIT ] [COMMENT [=] 'string'] InnoDB andNDB : [ENGINE [=] engine_name]
该语句用于创建表空间。精确的语法和语义取决于所使用的存储引擎。在标准MySQL版本中,这始终是一个InnoDB
表空间。MySQL NDB Cluster还使用NDB
存储引擎支持表空间。
- InnoDB注意事项
- NDB群集的注意事项
- 选件
- 注意
- InnoDB示例
- NDB示例
InnoDB注意事项
CREATE TABLESPACE
语法用于创建常规表空间或撤消表空间。UNDO
必须指定在MySQL 8.0.14中引入的关键字来创建撤消表空间。
常规表空间是共享表空间。它可以容纳多个表,并支持所有表行格式。可以在相对于或独立于数据目录的位置中创建常规表空间。
创建InnoDB
通用表空间后,使用或将表添加到表空间。有关更多信息,请参见“通用表空间”。CREATE TABLE tbl_name... TABLESPACE[=]tablespace_name
ALTER TABLE tbl_name TABLESPACE[=]tablespace_name
撤消表空间包含撤消日志。通过指定完全限定的数据文件路径,可以在所选位置创建撤消表空间。有关更多信息,请参见“撤消表空间”。
NDB群集的注意事项
该语句用于创建一个表空间,该表空间可以包含一个或多个数据文件,为NDB群集磁盘数据表提供存储空间(请参见“ NDB群集磁盘数据表”)。使用此语句创建一个数据文件并将其添加到表空间。可以使用该ALTER TABLESPACE
语句将其他数据文件添加到表空间(请参见“ ALTER TABLESPACE语句”)。
注意所有NDB群集磁盘数据对象共享相同的名称空间。这意味着每个磁盘数据对象必须唯一地命名(而不仅仅是给定类型的每个磁盘数据对象)。例如,您不能具有相同名称的表空间和日志文件组,或具有相同名称的表空间和数据文件。
UNDO
必须将一个或多个日志文件的日志文件组分配给要使用该USE LOGFILE GROUP
子句创建的表空间。logfile_group
必须是使用创建的现有日志文件组CREATE LOGFILE GROUP
(请参见“ 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 Server都会发出警告。NDB内核还将舍入后的值用于计算INFORMATION_SCHEMA.FILES
列值和其他目的。但是,为避免意外结果,建议您在指定这些选项时始终使用32K的整数倍。
当CREATE TABLESPACE
与使用ENGINE[=] NDB
,表空间和相关联的数据文件的每一个数据群集节点上创建。您可以验证数据文件已创建,并通过查询INFORMATION_SCHEMA.FILES
表来获取有关它们的信息。(请参阅本节后面的示例。)
(请参见“ INFORMATION_SCHEMA FILES表”。)
选件
ADD DATAFILE
:定义表空间数据文件的名称。ADD DATAFILE
创建撤消表空间时,此子句是必需的。否则,从MySQL 8.0.14开始,它是可选的。一个
InnoDB
表空间仅支持单个数据文件,其名称必须包括.ibd
扩展名。NDB群集表空间支持多个数据文件,这些文件可以具有任何合法的文件名。创建后,可以使用一条ALTER TABLESPACE
语句将更多的数据文件添加到NDB群集表空间中。要将常规表空间数据文件放置在数据目录之外的位置,请包括标准路径或相对于数据目录的路径。撤消表空间仅允许使用标准路径。如果未指定路径,则会在数据目录中创建常规表空间。在未指定路径的情况下创建的撤消表空间将在
innodb_undo_directory
变量定义的目录中创建。如果innodb_undo_directory
未定义变量,则在数据目录中创建撤消表空间。不支持在数据目录下的子目录中创建常规表空间,以避免与隐式创建的每表文件表空间冲突。在数据目录之外创建常规表空间或撤消表空间时,该目录必须存在并且
InnoDB
在创建表空间之前必须是已知的。要使目录为所知InnoDB
,请将其添加到innodb_directories
值或值附加到innodb_directories
值的变量之一中。innodb_directories
是只读变量。配置它需要重新启动服务器。file_name
,包括任何指定的路径,必须是单或双引号引起来。文件名(不包括文件扩展名)和目录名的长度必须至少一个字节。不支持零长度的文件名和目录名。如果
ADD DATAFILE
在创建表空间时未指定该子句,则会隐式创建具有唯一文件名的表空间数据文件。唯一文件名是一个128位UUID,格式为五组十六进制数字,中间用破折号(aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
)分隔。如果存储引擎需要,则添加文件扩展名。一个.ibd
文件的扩展名被添加为InnoDB
一般的表空间的数据文件。在复制环境中,在主服务器上创建的数据文件名与在从属服务器上创建的数据文件名不同。从MySQL 8.0.17开始,该
ADD DATAFILE
子句在创建InnoDB
表空间时不允许循环目录引用。例如,/../
以下语句中的循环目录引用()是不允许的:CREATE TABLESPACE ts1ADD DATAFILE ts1.ibd 'any_directory/../ts1.ibd';在Linux上存在此限制的例外,如果前面的目录是符号链接,则允许循环目录引用。例如,如果
any_directory
是符号链接,则允许上面示例中的数据文件路径。(仍然允许数据文件路径以“../
”开头。)FILE_BLOCK_SIZE
:此选项(特定于InnoDB
常规表空间,被忽略)NDB
定义了表空间数据文件的块大小。可以以字节或千字节为单位指定值。例如,一个8 KB的文件块大小可以指定为8192或8K。如果未指定此选项,则FILE_BLOCK_SIZE
默认为该innodb_page_size
值。FILE_BLOCK_SIZE
当您打算使用表空间来存储压缩InnoDB
表时(ROW_FORMAT=COMPRESSED
)是必需的。在这种情况下,必须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欲了解更多信息,请参见第15.6.3.3,“一般的表空间”。USE LOGFILE GROUP
:必需NDB
,这是以前使用创建的日志文件组的名称CREATE LOGFILE GROUP
。不支持InnoDB
,它会因错误而失败。EXTENT_SIZE
:此选项特定于NDB,并且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
表来参见给定数据文件中剩余的扩展数据块数量,然后估算文件中剩余的空间量。有关更多讨论和示例,请参见“ INFORMATION_SCHEMA文件表”。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
:目前被MySQL忽略;保留以备将来使用。无论使用什么存储引擎,在任何版本的MySQL 8.0或MySQL NDB Cluster 8.0中均不起作用。MAX_SIZE
:目前被MySQL忽略;保留以备将来使用。无论使用什么存储引擎,在任何版本的MySQL 8.0或MySQL NDB Cluster 8.0中均不起作用。NODEGROUP
:目前被MySQL忽略;保留以备将来使用。无论使用什么存储引擎,在任何版本的MySQL 8.0或MySQL NDB Cluster 8.0中均不起作用。WAIT
:目前被MySQL忽略;保留以备将来使用。无论使用什么存储引擎,在任何版本的MySQL 8.0或MySQL NDB Cluster 8.0中均不起作用。COMMENT
:目前被MySQL忽略;保留以备将来使用。无论使用什么存储引擎,在任何版本的MySQL 8.0或MySQL NDB Cluster 8.0中均不起作用。该
ENCRYPTION
子句为InnoDB
通用表空间启用或禁用页面级数据加密。MySQL 8.0.13中引入了对常规表空间的加密支持。从MySQL 8.0.16开始,如果
ENCRYPTION
未指定该子句,则该default_table_encryption
设置控制是否启用加密。该ENCRYPTION
子句将覆盖default_table_encryption
设置。但是,如果table_encryption_privilege_check
启用了变量,TABLE_ENCRYPTION_ADMIN
则需要特权才能使用与ENCRYPTION
设置不同的子句default_table_encryption
设置。在创建启用加密的表空间之前,必须先安装和配置密钥环插件。
对通用表空间进行加密时,表空间中的所有表均被加密。同样,在加密表空间中创建的表也被加密。
有关更多信息,请参见“ InnoDB静态数据加密”
ENGINE
:定义使用表空间的存储引擎,其中engine_name
是存储引擎的名称。当前,InnoDB
标准MySQL 8.0版本仅支持存储引擎。MySQL NDB Cluster同时支持NDB
和InnoDB
表空间。如果未指定该选项,则default_storage_engine
使用系统变量的值ENGINE
。
注意
- 有关覆盖MySQL表空间命名的规则,请参见“模式对象名称”。除了这些规则外,不允许使用斜杠字符(“/ ”),也不能使用以开头的名称
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群集表空间之前,还必须使用一个或多个ALTER TABLESPACE ... DROP DATATFILE
语句删除其所有数据文件。请参见“ NDB群集磁盘数据对象”。 InnoDB
添加到InnoDB
通用表空间的表的所有部分都位于通用表空间中,包括索引和BLOB
页。对于
NDB
分配给表空间的表,只有那些未索引的列才存储在磁盘上,并实际使用表空间数据文件。所有NDB
表的索引和索引列始终保留在内存中。- 与系统表空间类似,截断或删除存储在常规表空间中的表会在常规表空间.ibd数据文件内部创建可用空间,该空间只能用于新
InnoDB
数据。每个表文件表空间的空间不会释放回操作系统。 - 常规表空间不与任何数据库或模式关联。
ALTER TABLE ... DISCARD TABLESPACE
并且ALTER TABLE ...IMPORT TABLESPACE
不支持属于一般的表空间的表。- 服务器对引用常规表空间的DDL使用表空间级元数据锁定。相比之下,服务器使用DDL的表级元数据锁定来引用每表文件表空间。
- 生成的或现有的表空间无法更改为常规表空间。
- 通用表空间名称和每表文件表空间名称之间没有冲突。每表文件表空间名称中出现的“/ ”字符在常规表空间名称中是不允许的。
- mysqldump和 mysqlpump不转储
InnoDB
CREATE TABLESPACE
语句。
InnoDB示例
本示例演示如何创建常规表空间并添加三个不同行格式的未压缩表。
mysql>CREATE TABLESPACE `ts1`ADD DATAFILE 'ts1.ibd'ENGINE =INNODB; mysql>CREATE TABLE t1 (c1 INTPRIMARY KEY )TABLESPACE ts1ROW_FORMAT =REDUNDANT ; mysql>CREATE TABLE t2 (c1 INTPRIMARY KEY )TABLESPACE ts1ROW_FORMAT =COMPACT ; mysql>CREATE TABLE t3 (c1 INTPRIMARY KEY )TABLESPACE ts1ROW_FORMAT =DYNAMIC ;
本示例演示如何创建常规表空间并添加压缩表。该示例假定默认innodb_page_size
值为16K。在FILE_BLOCK_SIZE
8192要求压缩表有KEY_BLOCK_SIZE
8个。
mysql>CREATE TABLESPACE `ts2`ADD DATAFILE 'ts2.ibd'FILE_BLOCK_SIZE = 8192Engine =InnoDB; mysql>CREATE TABLE t4 (c1 INTPRIMARY KEY )TABLESPACE ts2ROW_FORMAT =COMPRESSED KEY_BLOCK_SIZE =8;
此示例演示了不指定ADD DATAFILE
子句的情况下创建通用表空间的情况,从MySQL 8.0.14起该子表是可选的。
mysql>CREATE TABLESPACE `ts3`ENGINE =INNODB;
本示例演示如何创建撤消表空间。
mysql>CREATE UNDO TABLESPACE undo_003ADD DATAFILE 'undo_003.ibu';
NDB示例
假设您希望创建一个myts
使用名为的数据文件命名的NDB群集磁盘数据表空间mydata-1.dat
。一个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)
现在,您可以使用CREATE TABLE
带有TABLESPACE
和STORAGE DISK
选项的语句来创建磁盘数据表,类似于此处显示的内容:
mysql>CREATE TABLE mytable ( -> id INTUNSIGNED NOT NULLAUTO_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 mytsSTORAGE DISK ->ENGINE =NDB ; Query OK, 0 rows affected (1.41 sec)
这是需要注意的,只有重要dob
和joined
列从mytable
实际存储在磁盘上,由于事实id
,lname
和fname
列所有索引。
如前所述,当CREATE TABLESPACE
与一起使用时ENGINE[=] NDB
,将在每个NDB群集数据节点上创建一个表空间和关联的数据文件。您可以通过查询INFORMATION_SCHEMA.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)
有关更多信息和示例,请参见“ NDB群集磁盘数据对象”。