CREATE TABLESPACE 语句
1. CREATE [UNDO] TABLESPACE tablespace_name
2.
3. InnoDB and NDB:
4. [ADD DATAFILE 'file_name']
5.
6. InnoDB only:
7. [FILE_BLOCK_SIZE = value]
8. [ENCRYPTION [=] {'Y' | 'N'}]
9.
10. NDB only:
11. USE LOGFILE GROUP logfile_group
12. [EXTENT_SIZE [=] extent_size]
13. [INITIAL_SIZE [=] initial_size]
14. [AUTOEXTEND_SIZE [=] autoextend_size]
15. [MAX_SIZE [=] max_size]
16. [NODEGROUP [=] nodegroup_id]
17. [WAIT]
18. [COMMENT [=] 'string']
19.
20. InnoDB and NDB:
21. [ENGINE [=] engine_name]
22.
23. Reserved for future use:
24. [ENGINE_ATTRIBUTE [=] 'string']
该语句用于创建表空间。精确的语法和语义取决于所使用的存储引擎。在标准MySQL版本中,这始终是一个 InnoDB 表空间。MySQL NDB Cluster 也支持使用NDB存储引擎的表空间。
InnoDB 注意事项
CREATE TABLESPACE 语法用于创建通用表空间或 undo (回滚)表空间。UNDO 关键字在MySQL 8.0.14中引入,必须指定它才能创建 UNDO 表空间。
通用表空间是共享表空间。它可以保存多个表,并支持所有表行格式。通用表空间可以创建在数据目录相关的位置,也可以或独立于数据目录。
在创建一个 InnoDB 通用表空间之后,使用 CREATE TABLE tbl_name ... TABLESPACE [=] tablespace_name 或 ALTER TABLE tbl_name TABLESPACE [=] tablespace_name 将表添加到表空间中。
Undo 表空间包含回滚日志。通过指定完全限定的数据文件路径,可以在选定的位置创建 undo 表空间。
NDB Cluster 的注意事项
该语句用于创建表空间,表空间可以包含一个或多个数据文件,为 NDB Cluster Disk Data 表提供存储空间。使用该语句创建一个数据文件并将其添加到表空间中。可以使用 ALTER TABLESPACE 语句将其他数据文件添加到表空间中。
注意
所有 NDB Cluster Disk Data 对象共享同一个命名空间。这意味着每个磁盘数据对象的命名必须唯一(而不仅仅是给定类型的每个磁盘数据对象)。例如,不能让表空间和日志文件组具有相同的名称,或者表空间和数据文件具有相同的名称。
必须将包含一个或多个UNDO日志文件的日志文件组分配给使用 USE LOGFILE GROUP 子句创建的表空间。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服务器会发出警告。NDB 内核也使用舍入值来用于计算 INFORMATION_SCHEMA.FILES 列值和其他用途。但是,为了避免意外的结果,建议在指定这些选项时始终使用32K的整数倍。
当与 ENGINE [=] NDB 一起使用 CREATE TABLESPACE 时,会在每个集群数据节点上创建一个表空间和相关的数据文件。可以通过查询 INFORMATION_SCHEMA.FILES 表来验证已经创建的数据文件,并获得关于它们的信息。
选项
● ADD DATAFILE: 定义表空间数据文件的名称。在创建NDB表空间时,总是需要这个选项;对于MySQL 8.0.14及以后版本的 InnoDB,只有在创建 undo 表空间时才需要。包含指定路径的 file_name 必须用单引号或双引号括起来。文件名(不包括文件扩展名)和目录名的长度必须至少为一个字节。不支持零长度的文件名和目录名。
因为 InnoDB 和 NDB 在处理数据文件的方式上有很大的不同,所以这两个存储引擎将在下面的讨论中分别介绍。
InnoDB 数据文件。InnoDB 表空间只支持单个数据文件,该文件的名称必须包含 .ibd 扩展名。
要将 InnoDB 共享表空间数据文件放在数据目录之外的位置,需要包含一个完全限定的路径或相对于数据目录的路径。undo 表空间只允许完全限定的路径。如果不指定路径,则在数据目录中创建一个共享表空间。未指定路径的 undo 表空间被创建在 innodb_undo_directory 变量定义的目录中。如果 innodb_undo_directory 变量未定义,则在数据目录中创建 undo 表空间。
为了避免与隐式创建的独立表空间冲突,不支持在数据目录的子目录中创建 InnoDB 共享表空间。当在数据目录之外创建一个共享表空间或 undo 表空间时,这个目录必须存在,并且在创建表空间之前目录对 InnoDB 必须是已知的。要让 InnoDB 知道一个目录,可以将它添加到 innodb_directories 值中,或者添加到一个变量中,该变量的值附加到 innodb_directories 值中。innodb_directories 是一个只读变量。配置它需要重新启动服务器。
如果在创建 InnoDB 表空间时没有指定 ADD DATAFILE 子句,则隐式创建具有唯一文件名的表空间数据文件。唯一的文件名是一个128位UUID,格式为五组十六进制数字,用破折号隔开(aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee)。如果存储引擎需要,将添加文件扩展名。InnoDB 共享表空间数据文件添加 .ibd 文件扩展名。在复制环境中,在复制源服务器上创建的数据文件名与在副本上创建的数据文件名不同。
从 MySQL 8.0.17 开始,在创建 InnoDB 表空间时,ADD DATAFILE 子句不允许使用循环目录引用。例如,不允许以下语句中的循环目录引用(/../):
1. CREATE TABLESPACE ts1 ADD DATAFILE ts1.ibd 'any_directory/../ts1.ibd';
这个限制在 Linux 上存在一个例外,在 Linux 中,如果前面的目录是符号链接,则允许循环目录引用。例如,如果 any_directory 是符号链接,那么上面示例中的数据文件路径是允许的。(仍然允许数据文件路径以 '../' 开头。)
NDB 数据文件。NDB 表空间支持多个数据文件,这些文件可以有任何合法的文件名;通过使用 ALTER TABLESPACE 语句,可以将更多数据文件添加到 NDB Cluster 表空间中。
默认情况下,NDB 表空间数据文件创建在数据节点文件系统目录中,即数据节点的数据目录(DataDir)下名为 ndb_nodeid_fs/TS 的目录,其中 nodeid 是数据节点的 NodeId。若要将数据文件放置在默认位置以外的位置,请包含绝对目录路径或相对于于默认位置的路径。如果指定的目录不存在,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。
● USE LOGFILE GROUP: 这是 NDB 所需的,这是以前使用 CREATE LOGFILE GROUP 创建的日志文件组的名称。InnoDB不支持,如使用会报错。
● EXTENT_SIZE: 这个选项是 NDB 特有的,InnoDB 不支持。EXTENT_SIZE 以字节为单位设置属于表空间的文件所使用的区的大小。默认值是1M。最小是32K,理论上的最大值是2G,实际的最大值取决于许多因素。在大多数情况下,更改区大小不会对性能产生任何可测量的影响,除了最不寻常的情况外,建议在所有情况下都使用缺省值。
区是磁盘空间分配的一个单位。只有一个区空间全部用完,才能使用另一个区。理论上,每个数据文件最多可使用65535 (64K)个区;但是,推荐的最大值是32768 (32K)。建议单个数据文件的最大大小为32G——即32K个区×每个区1 MB。此外,一旦将一个区分配给给定的分区,它就不能用于存储来自不同分区的数据;一个区不能存储来自多个分区的数据。这意味着,如果一个拥有单个数据文件的表空间,其 INITIAL_SIZE (在下面的项中描述)为 256MB,其 EXTENT_SIZE 为 128M,只有两个区,因此最多可以用于存储来自两个不同磁盘数据表分区的数据。
通过查询 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: 当前被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 权限来使用不同于 default_table_encryption 设置的 ENCRYPTION 子句设置。
在创建支持加密的表空间之前,必须安装和配置 keyring 插件。
当一个共享表空间被加密时,表空间中的所有表都被加密。同样,在加密的表空间中创建的表也会被加密。
● ENGINE: 定义使用表空间的存储引擎,其中 engine_name 是存储引擎的名称。目前,标准的MySQL 8.0版本只支持 InnoDB 存储引擎。MySQL NDB Cluster 同时支持 NDB 和 InnoDB 表空间。如果没有指定该选项,则 default_storage_engine 系统变量的值将用于ENGINE。
● ENGINE_ATTRIBUTE 选项(从MySQL 8.0.21开始可用)用于为主存储引擎指定表空间属性。这个选项留作将来使用。
允许的值是包含有效JSON文档的字符串字面量或空字符串(")。拒绝无效的JSON。
1. CREATE TABLESPACE ts1 ENGINE_ATTRIBUTE='{"key":"value"}';
ENGINE_ATTRIBUTE 值可以重复。在这种情况下,使用最后一个指定的值。
服务器不会检查 ENGINE_ATTRIBUTE 值,也不会在更改表的存储引擎时清除。