InnoDB磁盘结构之在外部创建表

58 阅读4分钟

InnoDB磁盘结构之在外部创建表

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

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

使用数据目录子句

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

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 |
+-------------------------+

有关每个表文件表空间的更多信息,请参见 “每个表文件表空间”

确保您选择的目录位置,因为该 DATA DIRECTORY子句以后不能用于 ALTER TABLE更改位置。

当您DATA DIRECTORYCREATE TABLE语句中指定子句时 ,将*table_name*.ibd在指定目录下的架构目录中创建表的数据文件(),并在MySQL数据目录下的架构目录中创建包含数据文件路径的.isl文件(*table_name*.isl)。一个 .isl文件是在功能上的符号链接相似。(不支持将实际的符号链接用于 InnoDB数据文件。)

下面的示例演示使用DATA DIRECTORY 子句在外部目录中创建表。假定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
使用注意事项:
  • MySQL最初使表空间数据文件保持打开状态,以防止您卸下设备,但如果服务器繁忙,则可能最终关闭该文件。注意不要在运行MySQL时意外卸除外部设备,或在断开连接时启动MySQL。缺少关联的数据文件时尝试访问表会导致严重错误,需要重新启动服务器。

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

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

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

  • 使用DATA DIRECTORY子句创建外部目录中的表是另一种使用 符号链接,它 InnoDB不支持。

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

使用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方法。相同的使用说明适用。

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

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