Documentation Home

15.6.1.2 在外部创建表

InnoDB 在外部 创建表有不同的原因;也就是说,在数据目录之外创建表。例如,这些原因可能包括空间管理、I/O 优化或将表放置在具有特定性能或容量特征的存储设备上。

InnoDB支持以下几种外部建表方式:

使用数据目录子句

您可以通过在语句中指定子句来在InnoDB外部目录 中创建表。 DATA DIRECTORYCREATE TABLE

CREATE TABLE t1 (c1 INT PRIMARY KEY) DATA DIRECTORY = '/external/directory';

DATA DIRECTORY在 file-per-table 表空间中创建的表支持 该子句。当变量启用时,表是在 file-per-table 表空间中隐式创建的 innodb_file_per_table,默认情况下是这样。

mysql> SELECT @@innodb_file_per_table;
+-------------------------+
| @@innodb_file_per_table |
+-------------------------+
|                       1 |
+-------------------------+

有关 file-per-table 表空间的更多信息,请参阅 第 15.6.3.2 节,“File-Per-Table 表空间”

当您在语句中指定DATA DIRECTORY子句时 CREATE TABLE,表的数据文件 ( table_name.ibd) 会在指定目录下的架构目录中创建。

从 MySQL 8.0.21 开始,使用该DATA DIRECTORY子句在数据目录之外创建的表和表分区仅限于已知的目录InnoDB。此要求允许数据库管理员控制创建表空间数据文件的位置,并确保在恢复期间可以找到数据文件(请参阅崩溃恢复期间的表空间发现)。已知目录是由 datadirinnodb_data_home_dirinnodb_directories变量定义的目录。您可以使用以下语句来检查这些设置:

mysql> SELECT @@datadir,@@innodb_data_home_dir,@@innodb_directories;

如果您要使用的目录未知, innodb_directories请在创建表之前将其添加到设置中。该 innodb_directories变量是只读的。配置它需要重新启动服务器。有关设置系统变量的一般信息,请参阅 第 5.1.9 节,“使用系统变量”

DATA DIRECTORY 以下示例演示了使用子句 在外部目录中创建表。假定该 innodb_file_per_table变量已启用并且该目录为 InnoDB.

mysql> USE test;
Database changed

mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) DATA DIRECTORY = '/external/directory';

# MySQL creates the table's data file in a schema directory
# under the external directory

$> cd /external/directory/test
$> ls
t1.ibd
使用说明:
  • MySQL 最初将表空间数据文件保持打开状态,以防止您卸载设备,但如果服务器繁忙,最终可能会关闭该文件。注意不要在 MySQL 运行时意外卸载外部设备,或在设备断开连接时启动 MySQL。在关联的数据文件丢失时尝试访问表会导致严重错误,需要重新启动服务器。

    如果在预期路径中找不到数据文件,服务器重启可能会失败。在这种情况下,您可以从备份中恢复表空间数据文件或删除表以从数据字典中删除有关它的信息 。

  • 在将表放在 NFS 挂载的卷上之前,请查看Using NFS with MySQL 中概述的潜在问题 。

  • 如果使用 LVM 快照、文件复制或其他基于文件的机制来备份表的数据文件,请始终使用 FLUSH TABLES ... FOR EXPORT语句 first 以确保在备份发生之前缓冲在内存中的所有更改都 刷新到磁盘。

  • 使用DATA DIRECTORY子句在外部目录中创建表是使用 不支持 的符号链接的 替代方法。InnoDB

  • DATA DIRECTORY在源和副本位于同一主机上的复制环境中不支持 该子句。该DATA DIRECTORY子句需要完整的目录路径。在这种情况下复制路径会导致源和副本在同一位置创建表。

  • 从 MySQL 8.0.21 开始,在 file-per-table 表空间中创建的表不能再在撤消表空间目录 ( innodb_undo_directory) 中创建,除非直接知道InnoDB。已知目录是由 datadirinnodb_data_home_dirinnodb_directories 变量定义的目录。

使用 CREATE TABLE ... TABLESPACE 语法

CREATE TABLE ... TABLESPACE语法可以与 DATA DIRECTORY子句结合使用以在外部目录中创建表。为此,请指定 innodb_file_per_table为表空间名称。

mysql> CREATE TABLE t2 (c1 INT PRIMARY KEY) TABLESPACE = innodb_file_per_table
       DATA DIRECTORY = '/external/directory';

此方法仅支持在 file-per-table 表空间中创建的表,但不需要 innodb_file_per_table启用变量。在所有其他方面,此方法等同于上述CREATE TABLE ... DATA DIRECTORY方法。适用相同的使用说明。

在外部通用表空间中创建表

您可以在驻留在外部目录中的通用表空间中创建表。