InnoDB磁盘结构之在外部创建表
在InnoDB
外部创建表有多种原因;也就是说,在数据目录之外创建表。例如,那些原因可能包括空间管理,I/O优化或将表放置在具有特定性能或容量特性的存储设备上。
InnoDB
支持以下用于在外部创建表的方法:
使用数据目录子句
您可以InnoDB
通过DATA DIRECTORY
在CREATE 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 DIRECTORY
在CREATE 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
方法。相同的使用说明适用。
在外部通用表空间中创建表
您可以在位于外部目录中的常规表空间中创建表。
- 有关在外部目录中创建常规表空间的信息,请参见 创建常规表空间。
- 有关在常规表空间中创建表的信息,请参见 将表添加到常规表空间。