在外部创建表
在InnoDB
外部创建表有多种原因。也就是说,在数据目录之外创建表。例如,那些原因可能包括空间管理,I / O优化或将表放置在具有特定性能或容量特性的存储设备上。
InnoDB
支持以下用于在外部创建表的方法:
- 使用数据目录子句
- 使用CREATE TABLE ... TABLESPACE语法
- 在外部通用表空间中创建表
使用数据目录子句
您可以InnoDB
通过DATA DIRECTORY
在CREATE TABLE
语句中指定子句在外部目录中创建表。
CREATE TABLE t1 (c1 INTPRIMARY KEY )DATA DIRECTORY = '/external/directory';
DATA DIRECTORY
在每个表文件表空间中创建的表支持该子句。当innodb_file_per_table
启用变量时,表是在每表文件表空间中隐式创建的,默认情况下是这样。
mysql>SELECT @@innodb_file_per_table; +------------------------- + | @@innodb_file_per_table | +------------------------- + | 1 | +------------------------- +
有关每表文件表空间的更多信息,请参见“每表文件表空间”。
当您DATA DIRECTORY
在CREATE TABLE
语句中指定子句时,表的数据文件(table_name.ibd
)将在指定目录下的架构目录中创建。
下面的示例演示使用DATA DIRECTORY
子句在外部目录中创建表。假定innodb_file_per_table
已启用该变量。
mysql>USE test;Database changed mysql>CREATE TABLE t1 (c1 INTPRIMARY 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
使用注意事项:
- 在外部目录中创建表时,请确保该目录是已知的
InnoDB
。否则,如果服务器在完全刷新数据文件页面之前意外停止,则在恢复前发现阶段(在已知目录中搜索数据文件)中找不到数据文件时,启动将失败(请参阅崩溃恢复中的表空间发现)。要使目录已知,请将其添加到innodb_directories
参数值。innodb_directories
是只读的启动选项,它定义在启动时扫描数据文件的目录。配置它需要重新启动服务器。 MySQL最初使表空间数据文件保持打开状态,从而防止您卸下设备,但如果服务器繁忙,则可能最终关闭该文件。注意不要在运行MySQL时意外卸除外部设备,或在断开连接时启动MySQL。缺少关联的数据文件时尝试访问表会导致严重错误,需要重新启动服务器。
如果在预期路径中找不到数据文件,则服务器重启可能会失败。在这种情况下,您可以从备份中还原表空间数据文件,也可以删除表以从数据字典中删除有关该文件的信息。
- 在将表放置在已安装NFS的卷上之前,请参见将NFS与MySQL一起使用中概述的潜在问题。
- 如果使用LVM快照,文件副本或其他基于文件的机制来备份表的数据文件,请始终先使用该
FLUSH TABLES ... FOR EXPORT
语句来确保在进行备份之前将缓冲在内存中的所有更改刷新到磁盘。 - 使用
DATA DIRECTORY
子句创建外部目录中的表是另一种使用符号链接,它InnoDB
不支持。 DATA DIRECTORY
在主服务器和从服务器位于同一主机上的复制环境中,不支持该子句。表创建不能复制到同一主机上的同一目录。
使用CREATE TABLE ... TABLESPACE语法
CREATE TABLE ... TABLESPACE
语法可以与该DATA DIRECTORY
子句结合使用,以在外部目录中创建表。为此,将其指定innodb_file_per_table
为表空间名称。
mysql>CREATE TABLE t2 (c1 INTPRIMARY KEY )TABLESPACE = innodb_file_per_tableDATA DIRECTORY = '/external/directory';
仅在每个表文件表空间中创建的表支持此方法,但不需要innodb_file_per_table
启用该变量。在所有其他方面,该方法等效于上述CREATE TABLE ... DATA DIRECTORY
方法。相同的使用说明适用。
在外部通用表空间中创建表
您可以在位于外部目录中的常规表空间中创建表。
- 有关在外部目录中创建常规表空间的信息,请参见创建常规表空间。
- 有关在常规表空间中创建表的信息,请参见将表添加到常规表空间。