InnoDB
在外部
创建表有不同的原因;也就是说,在数据目录之外创建表。例如,这些原因可能包括空间管理、I/O 优化或将表放置在具有特定性能或容量特征的存储设备上。
InnoDB
支持以下几种外部建表方式:
您可以通过在语句中指定子句来在InnoDB
外部目录
中创建表。
DATA DIRECTORY
CREATE TABLE
CREATE TABLE t1 (c1 INT PRIMARY KEY) DATA DIRECTORY = '/external/directory';
DATA DIRECTORY
在 file-per-table 表空间中创建的表支持
该子句。当变量启用时,表是在 file-per-table 表空间中隐式创建的
innodb_file_per_table
,默认情况下是这样。
mysql> SELECT @@innodb_file_per_table;
+-------------------------+
| @@innodb_file_per_table |
+-------------------------+
| 1 |
+-------------------------+
有关 file-per-table 表空间的更多信息,请参阅 第 14.6.3.2 节,“File-Per-Table 表空间”。
请确定您选择的目录位置,因为该
DATA DIRECTORY
子句不能用于
ALTER TABLE
稍后更改位置。
当您DATA DIRECTORY
在语句中指定一个子句时
CREATE TABLE
,表的数据文件(
)被创建在指定目录下的模式目录中,并且包含数据文件路径的table_name
.ibd.isl
文件(
)被创建在 MySQL 数据目录下的模式目录中。文件在
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
$> cd /external/directory/test
$> ls
t1.ibd
# An .isl file that contains the data file path is created
# in the schema directory under the MySQL data directory
$> cd /path/to/mysql/data/test
$> ls
db.opt t1.frm t1.isl
使用说明:
MySQL 最初将表空间数据文件保持打开状态,以防止您卸载设备,但如果服务器繁忙,最终可能会关闭该文件。注意不要在 MySQL 运行时意外卸载外部设备,或在设备断开连接时启动 MySQL。在关联的数据文件丢失时尝试访问表会导致严重错误,需要重新启动服务器。
如果在预期路径中找不到数据文件,服务器重启可能会失败。在这种情况下,手动
.isl
从架构目录中删除该文件。重新启动后,删除表以 从数据字典.frm
中删除文件和有关表的信息。在将表放在 NFS 挂载的卷上之前,请查看Using NFS with MySQL 中概述的潜在问题 。
如果使用 LVM 快照、文件复制或其他基于文件的机制来备份表的数据文件,请始终使用
FLUSH TABLES ... FOR EXPORT
语句 first 以确保在备份发生之前缓冲在内存中的所有更改都 刷新到磁盘。使用
DATA DIRECTORY
子句在外部目录中创建表是使用 不支持 的符号链接的 替代方法。InnoDB
DATA DIRECTORY
在源和副本位于同一主机上的复制环境中不支持 该子句。该DATA DIRECTORY
子句需要完整的目录路径。在这种情况下复制路径会导致源和副本在同一位置创建表。
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';
此方法仅支持在 file-per-table 表空间中创建的表,但不需要
innodb_file_per_table
启用变量。在所有其他方面,此方法等同于上述CREATE TABLE ... DATA DIRECTORY
方法。适用相同的使用说明。
您可以在驻留在外部目录中的通用表空间中创建表。
有关在外部目录中创建通用表空间的信息,请参阅 创建通用表空间。
有关在通用表空间中创建表的信息,请参阅 将表添加到通用表空间。