17.6.1.2 创建外部表
创建InnoDB
表外部的原因可能包括空间管理、I/O优化或将表放置在具有特定性能或容量特征的存储设备上,例如。
InnoDB
支持以下方法来创建外部表:
您可以使用CREATE TABLE
语句中的DATA DIRECTORY
子句在外部目录中创建一个InnoDB
表。
CREATE TABLE t1 (c1 INT PRIMARY KEY) DATA DIRECTORY = '/external/directory';
DATA DIRECTORY
子句支持文件-per-表空间中创建的表。表隐式地在文件-per-表空间中创建,当innodb_file_per_table
变量启用时,这是默认情况。
mysql> SELECT @@innodb_file_per_table;
+-------------------------+
| @@innodb_file_per_table |
+-------------------------+
| 1 |
+-------------------------+
关于文件表空间的更多信息,请见第17.6.3.2节,“File-Per-Table Tablespaces”。
在使用CREATE TABLE
语句指定DATA DIRECTORY
子句时,您可以将表的数据文件(
)创建在指定目录下的schema目录下。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
Usage Notes:
-
MySQL最初保持表空间数据文件打开,防止您从分离设备,但可能最终关闭文件如果服务器繁忙。请小心不要意外地从外部设备分离 MySQL 运行时,或者在设备断开连接时启动 MySQL。尝试访问表时,如果关联的数据文件丢失,将出现严重错误,需要重新启动服务器。
如果服务器无法找到预期路径中的数据文件,可能会失败。在这种情况下,您可以从备份中恢复表空间数据文件或删除表以从数据字典中删除关于该表的信息。
-
在将表置于 NFS 挂载卷之前,请查看Using NFS with MySQL中列出的潜在问题。
-
如果使用LVM快照、文件复制或其他文件机制来备份表的数据文件,始终在备份发生前使用
FLUSH TABLES ... FOR EXPORT
语句,以确保内存中的所有更改都被刷新到磁盘。 -
使用
DATA DIRECTORY
子句创建表在外部目录中是一个与使用符号链接的替代方案,InnoDB
不支持符号链接。 -
在复制环境中,如果源和副本位于同一主机上,
DATA DIRECTORY
子句不可用。该子句需要完整的目录路径。在这种情况下,复制路径将导致源和副本创建表在相同的位置。 -
文件-per-表空间中的表不能在
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';
这种方法仅支持在文件-per-表空间中创建的表,但不需要启用innodb_file_per_table
变量。在其他方面,这种方法与上述 CREATE TABLE ... DATA DIRECTORY
方法等效。同样适用的使用说明。
在外部一般表空间中创建表
您可以在外部目录中的一般表空间中创建表。
-
关于在外部目录中创建一般表空间的信息,请见Creating a General Tablespace。
-
关于在一般表空间中创建表的信息,请见Adding Tables to a General Tablespace。