文档主页
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 参考手册  /  ...  /  在外部创建表

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
使用说明
  • MySQL 最初会将表空间数据库文件保持打开状态,以防止您卸载设备,但如果服务器繁忙,最终可能会关闭该文件。请注意,不要在 MySQL 运行时意外卸载外部设备,也不要在设备断开连接时启动 MySQL。在关联的数据库文件丢失时尝试访问表会导致严重错误,需要重新启动服务器。

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

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

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

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

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

  • 除非 InnoDB 知道该目录,否则无法在撤消表空间目录 (innodb_undo_directory) 中创建按文件存储表空间的表。已知目录是由 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 方法。同样的使用说明也适用。

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

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