14.6.1.2 从外部创建 table

在外部创建InnoDB个 table 有多种原因;也就是说,在数据目录之外创建 table。例如,那些原因可能包括空间 Management,I/O 优化或将 table 放置在具有特定性能或容量特性的存储设备上。

InnoDB支持以下用于在外部创建 table 的方法:

使用 DATA DIRECTORY 子句

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

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

在每个 table 文件 table 空间中创建的 table 支持DATA DIRECTORY子句。启用innodb_file_per_table变量后(默认情况下),将在每 table 文件 table 空间中隐式创建 table。

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

有关每个 table 文件 table 空间的更多信息,请参见第 14.6.3.2 节“每 table 文件 table 空间”

请确保您选择的目录位置,因为DATA DIRECTORY子句不能与ALTER TABLE一起使用,以后再更改位置。

当您在CREATE TABLE语句中指定DATA DIRECTORY子句时,将在指定目录下的架构目录中创建 table 的数据文件(table_name.ibd),并在目录下的架构目录中创建包含数据文件路径的.isl文件(table_name.isl)。 MySQL 数据目录。 .isl文件的功能类似于符号链接。 (实际symbolic links不支持与InnoDB数据文件一起使用。)

下面的示例演示使用DATA DIRECTORY子句在外部目录中创建 table。假定启用了innodb_file_per_table变量。

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

shell> cd /external/directory/test
shell> ls
t1.ibd

# An .isl file that contains the data file path is created
# in the schema directory under the MySQL data directory

shell> cd /path/to/mysql/data/test
shell> ls
db.opt  t1.frm  t1.isl
Usage Notes:
  • MySQL 最初使 table 空间数据文件保持打开状态,以防止您卸下设备,但如果服务器繁忙,则可能最终关闭该文件。注意不要在运行 MySQL 时意外卸除外部设备,或在断开连接时启动 MySQL。缺少关联的数据文件时尝试访问 table 会导致严重错误,需要重新启动服务器。

如果在预期路径中找不到数据文件,则服务器重启可能会失败。在这种情况下,请从架构目录中手动删除.isl文件。重新启动后,删除 table 以从_删除.frm文件和有关该 table 的信息。

  • 在将 table 放置在已安装 NFS 的卷上之前,请查看在 MySQL 中使用 NFS中概述的潜在问题。

  • 如果使用 LVM 快照,文件副本或其他基于文件的机制来备份 table 的数据文件,请始终先使用冲洗 table...Export语句以确保在进行备份之前将缓冲在内存中的所有更改都存储在磁盘上flushed

  • 使用DATA DIRECTORY子句在外部目录中创建 table 是使用不支持的symbolic links的替代方法。

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

使用 CREATE TABLE ... TABLESPACE 语法

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

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

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

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

您可以在位于外部目录中的常规 table 空间中创建 table。