有不同的原因会导致外部创建 InnoDB
表;也就是说,在数据目录之外创建表。这些原因可能包括空间管理、I/O 优化或将表放置在具有特定性能或容量特性的存储设备上,例如。
InnoDB
支持以下外部创建表的方法
可以通过在 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
子句时,表的 data 文件 (
) 将在指定目录下的架构目录中创建。table_name
.ibd
使用 DATA DIRECTORY
子句在数据目录之外创建的表和表分区仅限于 InnoDB
已知的目录。此要求允许数据库管理员控制表空间数据文件创建的位置,并确保在恢复期间可以找到数据文件(请参见 崩溃恢复期间的表空间发现)。已知目录是 datadir
、innodb_data_home_dir
和 innodb_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 最初会保持表空间 data 文件打开,阻止您卸载设备,但如果服务器繁忙,最终可能会关闭该文件。在 MySQL 运行时,请注意不要意外地卸载外部设备,或者在设备断开连接时启动 MySQL。尝试在关联的 data 文件丢失时访问表会导致严重错误,需要重新启动服务器。
如果在预期路径找不到 data 文件,则服务器重启可能会失败。在这种情况下,可以从备份中恢复表空间 data 文件,或删除该表以从 数据字典 中删除有关它的信息。
在将表放置到 NFS 挂载的卷上之前,请查看 将 NFS 与 MySQL 配合使用 中概述的潜在问题。
如果使用 LVM 快照、文件复制或其他基于文件的机制备份表的 data 文件,请务必先使用
FLUSH TABLES ... FOR EXPORT
语句,以确保在备份之前将内存中缓冲的所有更改 刷新 到磁盘。使用
DATA DIRECTORY
子句在外部目录中创建表,是使用 符号链接 的替代方法,而InnoDB
不支持符号链接。在源和副本位于同一主机的复制环境中,不支持
DATA DIRECTORY
子句。DATA DIRECTORY
子句需要完整的目录路径。在这种情况下复制路径会导致源和副本在相同位置创建表。在文件每表表空间中创建的表不能在撤消表空间目录 (
innodb_undo_directory
) 中创建,除非该目录对InnoDB
已知。已知目录是指由datadir
、innodb_data_home_dir
和innodb_directories
变量定义的目录。
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
方法。相同的用法说明适用。