Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Creating Tables Externally

17.6.1.2 在外部创建表

有多种原因可以在外部创建 InnoDB 表,即在数据目录外创建表。这些原因可能包括空间管理、I/O 优化或将表放在具有特定性能或容量特征的存储设备上,例如。

InnoDB 支持以下方法来创建外部表:

使用 DATA DIRECTORY 子句

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

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

DATA DIRECTORY 子句仅支持在文件每表表空间中创建的表。表隐式地在文件每表表空间中创建,当 innodb_file_per_table 变量启用时,默认情况下是启用的。

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

有关文件每表表空间的更多信息,请参阅 第 17.6.3.2 节,“文件每表表空间”

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

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

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

如果要使用的目录未知,请在创建表之前将其添加到 innodb_directories 设置中。该 innodb_directories 变量是只读的。配置它需要重新启动服务器。有关设置系统变量的常规信息,请参阅 第 7.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
Usage Notes:
  • MySQL 初始保持表空间数据文件打开,防止您卸载设备,但可能会在服务器忙时关闭文件。如果您在设备卸载时访问表,或者在设备断开连接时启动 MySQL,将导致严重错误,需要服务器重新启动。

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

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

  • 如果使用 LVM 快照、文件副本或其他基于文件的机制来备份表的数据文件,始终使用 FLUSH TABLES ... FOR EXPORT 语句,以确保所有缓存在内存中的更改被 flushed 到磁盘,然后再进行备份。

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

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

  • 在文件每个表空间中创建的表不能在撤销表空间目录 (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';

该方法仅支持在文件每个表空间中创建的表,但不需要启用 innodb_file_per_table 变量。在所有其他方面,该方法等同于上述 CREATE TABLE ... DATA DIRECTORY 方法。相同的使用注意事项适用。

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

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