13.1.19 CREATE TABLESPACE 语句

CREATE TABLESPACE tablespace_name

  InnoDB and NDB:
    ADD DATAFILE 'file_name'

  InnoDB only:
    [FILE_BLOCK_SIZE = value]

  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 and NDB:
    [ENGINE [=] engine_name]

该语句用于创建 table 空间。精确的语法和语义取决于所使用的存储引擎。在标准 MySQL 5.7 版本中,这始终是InnoDBtable 空间。 MySQL NDB Cluster 7.5 除使用InnoDB的 table 空间外,还支持使用NDB存储引擎的 table 空间。

InnoDB 注意事项

CREATE TABLESPACE语法用于创建常规 table 空间。通用 table 空间是共享 table 空间。它可以容纳多个 table,并支持所有 table 行格式。可以在相对于或独立于数据目录的位置中创建常规 table 空间。

创建InnoDB常规 table 空间后,可以使用创建 tabletbl_name ... TABLESPACE [=] tablespace_nameALTER TABLE tbl_name TABLESPACE [=] tablespace_name将 table 添加到 table 空间中。有关更多信息,请参见第 14.6.3.3 节“常规 table 空间”

NDB 群集注意事项

该语句用于创建一个 table 空间,该 table 空间可以包含一个或多个数据文件,为 NDB 群集磁盘数据 table 提供存储空间(请参阅第 21.5.10 节“ NDB 群集磁盘数据 table”)。使用此语句创建一个数据文件并将其添加到 table 空间。可以使用ALTER TABLESPACE语句将其他数据文件添加到 table 空间(请参见第 13.1.9 节“ ALTER TABLESPACE 语句”)。

Note

所有 NDB 群集磁盘数据对象共享相同的名称空间。这意味着“每个磁盘数据对象”必须被唯一命名(而不仅仅是给定类型的每个磁盘数据对象)。例如,您不能具有相同名称的 table 空间和日志文件组,或具有相同名称的 table 空间和数据文件。

必须将一个或多个UNDO日志文件的日志文件组分配给要使用USE LOGFILE GROUP子句创建的 table 空间。 * logfile_group *必须是使用创建日志文件组创建的现有日志文件组(请参见第 13.1.15 节“ CREATE LOGFILE GROUP 语句”)。多个 table 空间可以将同一日志文件组用于UNDO日志记录。

设置EXTENT_SIZEINITIAL_SIZE时,您可以选择在数字后面加上一个字母的缩写,table 示一个数量级,类似于my.cnf中使用的缩写。通常,这是字母M(对于兆字节)或G(对于千兆字节)之一。

INITIAL_SIZEEXTENT_SIZE的取整如下:

  • EXTENT_SIZE四舍五入到最接近的 32K 整数倍。

  • INITIAL_SIZE四舍五入为最接近的 32K 整数倍;此结果四舍五入到EXTENT_SIZE的最接近整数倍(在四舍五入后)。

Note

NDB保留 table 空间的 4%用于数据节点重新启动操作。此保留的空间不能用于数据存储。此限制从 NDB 7.6 开始适用。

刚刚描述的舍入是明确完成的,当执行任何此类舍入时,MySQL Server 都会发出警告。 NDB 内核还将舍入后的值用于计算INFORMATION_SCHEMA.FILES列值和其他目的。但是,为避免意外结果,建议您在指定这些选项时始终使用 32K 的整数倍。

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

(See 第 24.9 节“ INFORMATION_SCHEMA FILEStable”.)

Options

  • ADD DATAFILE:定义 table 空间数据文件的名称;始终需要此选项。 file_name(包括任何指定的路径)必须用单引号或双引号引起来。文件名(不包括文件 extensions)和目录名的长度必须至少一个字节。不支持零长度文件名和目录名。

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

InnoDB 数据文件. InnoDBtable 空间仅支持一个数据文件,其名称必须包含.ibdextensions。

对于InnoDBtable 空间,默认情况下在 MySQL 数据目录(datadir)中创建数据文件。要将数据文件放置在默认位置以外的其他位置,请包括绝对目录路径或相对于默认位置的路径。

在数据目录之外创建InnoDBtable 空间时,将在数据目录中创建isl文件。为避免与隐式创建的每 table 文件 table 空间冲突,不支持在数据目录下的子目录中创建InnoDB常规 table 空间。在数据目录之外创建InnoDB通用 table 空间时,该目录必须在创建 table 空间之前存在。

Note

在 MySQL 5.7 中,InnoDB不支持ALTER TABLESPACE

NDB 数据文件. NDBtable 空间支持多个数据文件,这些文件可以具有任何合法的文件名;创建后,可以使用ALTER TABLESPACE语句将更多的数据文件添加到 NDB 群集 table 空间中。

默认情况下,在数据节点文件系统目录(即数据节点的数据目录(DataDir)下名为ndb_nodeid_fs/TS的目录)中创建NDBtable 空间数据文件,其中* nodeid *是数据节点的NodeId。要将数据文件放置在默认位置以外的其他位置,请包括绝对目录路径或相对于默认位置的路径。如果指定的目录不存在,则NDB尝试创建它;运行数据节点进程的系统用户帐户必须具有相应的权限。

Note

确定用于数据文件的路径时,NDB不会扩展~(波浪号)字符。

当多个数据节点在同一物理主机上运行时,适用以下注意事项:

  • 创建数据文件时,不能指定绝对路径。

    • 除非每个数据节点都有一个单独的数据目录,否则无法在数据节点文件系统目录之外创建 table 空间数据文件。

    • 如果每个数据节点都有自己的数据目录,则可以在此目录中的任何位置创建数据文件。

    • 如果每个数据节点都有其自己的数据目录,则也可以使用相对路径在该节点的数据目录外部创建数据文件,只要该路径解析为每个正在运行的数据节点在主机文件系统上的唯一位置在那个主机上。

  • FILE_BLOCK_SIZE:此选项(特定于InnoDB,被NDB忽略)定义 table 空间数据文件的块大小。可以以字节或千字节为单位指定值。例如,可以将 8 KB 文件块大小指定为 8192 或 8K。如果未指定此选项,则FILE_BLOCK_SIZE默认为innodb_page_size值。当您打算使用 table 空间来存储压缩的InnoDBtable(ROW_FORMAT=COMPRESSED)时,需要FILE_BLOCK_SIZE。在这种情况下,创建 table 空间时必须定义 table 空间FILE_BLOCK_SIZE

如果FILE_BLOCK_SIZE等于innodb_page_size值,则 table 空间只能包含具有未压缩行格式(COMPACTREDUNDANTDYNAMIC)的 table。行格式为COMPRESSED的 table 与未压缩的 table 具有不同的物理页面大小。因此,压缩 table 不能与未压缩 table 共存于同一 table 空间中。

为了使常规 table 空间包含压缩 table,必须指定FILE_BLOCK_SIZE,并且FILE_BLOCK_SIZE值必须是相对于innodb_page_size值的有效压缩页面大小。另外,压缩 table 的物理页面大小(KEY_BLOCK_SIZE)必须等于FILE_BLOCK_SIZE/1024。例如,如果innodb_page_size=16KFILE_BLOCK_SIZE=8K,则 table 的KEY_BLOCK_SIZE必须为 8.有关更多信息,请参见第 14.6.3.3 节“常规 table 空间”

  • USE LOGFILE GROUPNDB必需,这是以前使用创建日志文件组创建的日志文件组的名称。 InnoDB不支持,它会因错误而失败。

  • EXTENT_SIZE:此选项特定于 NDB,并且 InnoDB 不支持该选项,它会因错误而失败。 EXTENT_SIZE设置属于 table 空间的任何文件使用的扩展数据块的大小(以字节为单位)。默认值为 1M。最小大小为 32K,理论最大值为 2G,尽管实际最大大小取决于许多因素。在大多数情况下,更改扩展数据块大小不会对性能产生任何可衡量的影响,建议将默认值用于除最不常见的情况以外的所有情况。

范围是磁盘空间分配的单位。在使用另一个扩展区之前,一个扩展区将填充该扩展区可以包含的尽可能多的数据。从理论上讲,每个数据文件最多可以使用 65,535(64K)个扩展区。但是,建议的最大值为 32,768(32K)。单个数据文件的建议最大大小为 32G,即 32K 扩展区×每个扩展区 1 MB。此外,将扩展区分配给给定的分区后,就无法将其用于存储来自其他分区的数据。一个扩展区不能存储来自多个分区的数据。这意味着,例如,具有单个数据文件的 table 空间具有两个扩展区,它们的INITIAL_SIZE(在下面的项目中进行描述)为 256 MB,而EXTENT_SIZE为 128M,则仅可用于存储来自两个不同磁盘数据 table 的数据分区。

您可以通过查询INFORMATION_SCHEMA.FILEStable 来查看给定数据文件中剩余的扩展数据块数量,然后估算文件中剩余的可用空间量。有关更多讨论和示例,请参见第 24.9 节“ INFORMATION_SCHEMA FILEStable”

  • INITIAL_SIZE:此选项特定于NDB,但InnoDB不支持该选项,该选项会因错误而失败。

INITIAL_SIZE参数设置使用ADD DATATFILE特定的数据文件的总大小(以字节为单位)。创建此文件后,无法更改其大小。但是,您可以使用ALTER TABLESPACE ...添加数据文件将更多数据文件添加到 table 空间中。

INITIAL_SIZE是可选的;其默认值为 134217728(128 MB)。

在 32 位系统上,INITIAL_SIZE的最大支持值为 4294967296(4 GB)。

  • AUTOEXTEND_SIZE:当前被 MySQL 忽略;保留以备将来使用。无论使用哪种存储引擎,在任何版本的 MySQL 5.7 或 MySQL NDB Cluster 7.5 中均不起作用。

  • MAX_SIZE:当前被 MySQL 忽略;保留以备将来使用。无论使用哪种存储引擎,在任何版本的 MySQL 5.7 或 MySQL NDB Cluster 7.5 中均不起作用。

  • NODEGROUP:当前被 MySQL 忽略;保留以备将来使用。无论使用哪种存储引擎,在任何版本的 MySQL 5.7 或 MySQL NDB Cluster 7.5 中均不起作用。

  • WAIT:当前被 MySQL 忽略;保留以备将来使用。无论使用哪种存储引擎,在任何版本的 MySQL 5.7 或 MySQL NDB Cluster 7.5 中均不起作用。

  • COMMENT:当前被 MySQL 忽略;保留以备将来使用。无论使用哪种存储引擎,在任何版本的 MySQL 5.7 或 MySQL NDB Cluster 7.5 中均不起作用。

  • ENGINE:定义使用 table 空间的存储引擎,其中* engine_name *是存储引擎的名称。当前,标准 MySQL 5.7 版本仅支持InnoDB存储引擎。 MySQL NDB Cluster 7.5 支持NDBInnoDBtable 空间。如果未指定该选项,则default_storage_engine系统变量的值将用于ENGINE

Notes

对于分配给 table 空间的NDBtable,只有那些未索引的列存储在磁盘上,并且实际上使用 table 空间数据文件。所有NDBtable 的索引和索引列始终保留在内存中。

  • 与系统 table 空间类似,截断或删除存储在通用 table 空间中的 table 会在通用 table 空间.ibd 数据文件内部内部创建可用空间,该可用空间仅可用于新的InnoDB数据。每个 table 文件 table 空间的空间不会释放回 os。

  • 常规 table 空间不与任何数据库或模式关联。

  • 属于常规 table 空间的 table 不支持ALTER TABLE ... DISCARD TABLESPACE更改 table...导入 table 空间

  • 服务器对引用常规 table 空间的 DDL 使用 table 空间级元数据锁定。相比之下,服务器使用 DDL 的 table 级元数据锁定来引用每 table 文件 table 空间。

  • 生成的 table 空间或现有 table 空间不能更改为常规 table 空间。

  • 由于添加了新的 table 标志,因此只能在 MySQL 5.7.6 或更高版本中打开存储在常规 table 空间中的 table。

  • 常规 table 空间名称和每 table 文件 table 空间名称之间没有冲突。每个 table 文件 table 空间名称中出现的“ /”字符在常规 table 空间名称中是不允许的。

  • mysqldumpmysqlpump不转储InnoDB CREATE TABLESPACE语句。

InnoDB Examples

本示例演示如何创建常规 table 空间并添加三个不同行格式的未压缩 table。

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;

本示例演示如何创建常规 table 空间并添加压缩 table。该示例假定默认的innodb_page_size值为 16K。 8192 的FILE_BLOCK_SIZE要求压缩 table 的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;

NDB Example

假设您希望使用名为mydata-1.dat的数据文件创建名为myts的 NDB 群集磁盘数据 table 空间。 NDBtable 空间始终需要使用由一个或多个撤消日志文件组成的日志文件组。对于此示例,我们首先使用创建日志文件组语句创建一个名为mylg的日志文件组,其中包含一个名为myundo-1.dat的撤销长文件:

mysql> CREATE LOGFILE GROUP myg1
    ->     ADD UNDOFILE 'myundo-1.dat'
    ->     ENGINE=NDB;
Query OK, 0 rows affected (3.29 sec)

现在,您可以使用以下语句创建先前描述的 table 空间:

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语句创建磁盘数据 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 群集数据节点上创建一个 table 空间和关联的数据文件。您可以通过查询INFORMATION_SCHEMA.FILEStable 来验证是否已创建数据文件并获取有关它们的信息,如下所示:

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)

有关其他信息和示例,请参见第 21.5.10.1 节“ NDB 群集磁盘数据对象”