文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


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

    默认情况下,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=16KFILE_BLOCK_SIZE=8K,则表的 KEY_BLOCK_SIZE 必须为 8。有关更多信息,请参阅第 17.6.3.3 节,“通用表空间”

  • USE LOGFILE GROUPNDB 需要此选项,它是之前使用 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:此选项特定于 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 9.0 版本仅支持 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。 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)

您现在可以使用带有 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 集群数据节点上创建一个表空间及其关联的数据文件。您可以通过查询信息架构 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 集群磁盘数据对象”