文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  CREATE TABLESPACE 语句

15.1.21 CREATE TABLESPACE 语句

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_nameALTER TABLE tbl_name TABLESPACE [=] tablespace_name 将表添加到表空间。有关更多信息,请参阅第 17.6.3.3 节,“通用表空间”

撤消表空间包含撤消日志。可以通过指定完全限定的数据文件路径在选定位置创建撤消表空间。有关更多信息,请参阅第 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_SIZEINITIAL_SIZE 时,您可以选择在数字后跟一个字母缩写来表示数量级,类似于 my.cnf 中使用的缩写。通常,这是字母 M(表示兆字节)或 G(表示千兆字节)之一。

INITIAL_SIZEEXTENT_SIZE 将按如下方式进行舍入

  • EXTENT_SIZE 舍入为最接近的 32K 的整数倍。

  • INITIAL_SIZE向下舍入为最接近的 32K 的整数倍;此结果舍入为最接近的 EXTENT_SIZE 的整数倍(在进行任何舍入之后)。

注意

NDB 为数据节点重启操作保留了 4% 的表空间。此保留空间不能用于数据存储。

刚刚描述的舍入是显式完成的,并且在执行任何此类舍入时,MySQL 服务器会发出警告。NDB 内核还使用舍入后的值来计算INFORMATION_SCHEMA.FILES 列值和其他用途。但是,为了避免意外结果,我们建议您在指定这些选项时始终使用 32K 的整数倍。

CREATE TABLESPACEENGINE [=] NDB 一起使用时,将在每个集群数据节点上创建一个表空间和关联的数据文件。您可以通过查询信息架构 FILES 表来验证数据文件是否已创建并获取有关它们的信息。(请参阅本节后面的示例。)

(请参阅第 28.3.15 节,“INFORMATION_SCHEMA FILES 表”。)

选项

  • ADD DATAFILE:定义表空间数据文件的名称。创建 NDB 表空间时始终需要此选项;对于 InnoDB,仅在创建撤消表空间时才需要。必须使用单引号或双引号将 file_name(包括任何指定的路径)引起来。文件名(不包括文件扩展名)和目录名的长度必须至少为一个字节。不支持零长度的文件名和目录名。

    由于 InnoDBNDB 处理数据文件的方式存在很大差异,因此在下面的讨论中将分别介绍这两种存储引擎。

    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 表空间支持多个数据文件,这些文件可以具有任何合法的文件名;创建 NDB 集群表空间后,可以使用 ALTER TABLESPACE 语句向其中添加更多数据文件。

    默认情况下,NDB 表空间数据文件是在数据节点文件系统目录中创建的,即数据节点数据目录 (DataDir) 下名为 ndb_nodeid_fs/TS 的目录,其中 nodeid 是数据节点的 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 值,则表空间只能包含具有未压缩行格式(COMPACTREDUNDANTDYNAMIC)的表。具有 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 GROUPNDB 需要此选项,它是先前使用 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 表来查看给定数据文件中还剩多少个可用区,并由此估算出该文件中还剩多少可用空间。有关更多讨论和示例,请参见第 28.3.15 节 “INFORMATION_SCHEMA FILES 表”

  • INITIAL_SIZE:此选项特定于 NDBInnoDB 不支持该选项,使用该选项会导致错误。

    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 8.4 版本仅支持 InnoDB 存储引擎。MySQL NDB Cluster 支持 NDBInnoDB 表空间。如果未指定 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 TABLEALTER TABLE 一起使用,以将 InnoDB 表分区或子分区分配给每个表一个文件的表空间。所有分区必须属于同一个存储引擎。不支持将表分区分配给共享 InnoDB 表空间。共享表空间包括 InnoDB 系统表空间和通用表空间。

  • 通用表空间支持使用 CREATE TABLE ... TABLESPACE 添加任何行格式的表。不需要启用 innodb_file_per_table

  • innodb_strict_mode 不适用于通用表空间。表空间管理规则是严格执行的,与 innodb_strict_mode 无关。如果 CREATE TABLESPACE 参数不正确或不兼容,则无论 innodb_strict_mode 设置如何,操作都将失败。当使用 CREATE TABLE ... TABLESPACEALTER 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 TABLESPACEALTER 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。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;

此示例演示如何在不指定 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 表空间始终需要使用由一个或多个撤消日志文件组成的日志文件组。对于此示例,我们首先使用此处显示的 CREATE LOGFILE GROUP 语句创建一个名为 mylg 的日志文件组,该文件组包含一个名为 myundo-1.dat 的撤消长日志文件

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)

您现在可以使用带有 TABLESPACESTORAGE 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)

需要注意的是,由于 idlnamefname 列都已建立索引,因此实际上只有 mytable 中的 dobjoined 列存储在磁盘上。

如前所述,当 CREATE TABLESPACEENGINE [=] NDB 一起使用时,会在每个 NDB Cluster 数据节点上创建一个表空间及其关联的数据文件。您可以通过查询信息架构 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 集群磁盘数据对象”