在外部创建表,是指在数据目录之外创建表,其原因有很多。这些原因可能包括空间管理,I/O优化,或将表放在一个性能或容量特征特殊的存储设备上。
InnoDB支持的在外部创建表的方法如下:
使用DATA DIRECTORY子句 #
你可以通过在create table语句中显式添加data directory子句来在一个外部目录中创建一个InnoDBB表。
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 |
+-------------------------+
想了解更多关于独立表空间的信息,请查阅15.6.3.2,“独立表空间”。
如果你在create table语句中指定data directory,这张表的数据文件(table_name.ibd)被创建在指定目录的数据库目录下。
从MySQL8.0.21开始,使用data directory子句在数据目录之外创建表和表分区时,相关目录必须对InnoDB可知。这个要求允许数据库管理员控制表空间数据文件的存储位置,保证在恢复时,数据文件可以被发现。可知的目录是指哪些被变量datadir,innodb_data_home_dir,和innodb_directories指定的目录。你可以通过下面的语句来检查这些设置:
mysql> SELECT @@datadir,@@innodb_data_home_dir,@@innodb_directories;
如果你想要使用的目录是未知的,在你创建表之前,将其添加到innodb_directories设置中。这个变量是只读的。修改之后需要重启服务。想了解更多关于设置系统变量的信息,请查阅章节5.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会保持表空间文件打开,阻止你卸载该设备。但是,如果服务繁忙的话,可能最终会关闭文件。请小心,在mysql运行时不要突然卸载一个外部设备,或在设备没有连接时启动mysql。在相关数据文件丢失时,尝试访问一张表会导致严重错误,需要服务重启。
如果在相关目录下没有发现数据文件,服务重启可能会失败。这种情形下,你可以从备份中恢复表空间数据文件,或删除这张表从而将其从数据目录下移除。 - 在讲一张表存储在NFS设备之前,检查**在MySQL中使用NFS设备**指出的潜在问题。 - 如果你使用了一个LVM快照,文件副本,或其它基于文件的机制来背负表数据文件,在备份之前要先使用FLUSH TABLES ... FOR EXPORT语句来保证内存中的所有变更都被刷到了磁盘中。 - 使用DATA DIRECTORY来在外部目录中创建表可以作为symbolic links的替代,后者是InnoDB不支持的。 - 如果源库和副本在同一台机器上,不支持在复制环境中使用DATA DIRECTORY子句。DATA DIRECTORY子句需要全路径。这种情境下复制路径可能导致源库和副本在同一个位置创建表。 - 从MySQL8.0.21开始,不可以在undo表空间目录下创建使用独立表空间的表,除非这个目录对innodb可知。可知的目录是指那些通过变量datadir,innodb_data_home_dir,和innodb_directories定义的目录。
使用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方法是等效的。使用提示页同样适用。
在通用表空间中创建表 #
你可以在外部目录中的一个通用表空间中创建表。
- 想了解更多关于在外部目录创建一个通用表空间的信息,查阅创建通用表空间。
- 想了解更多关于在通用表空间中创建表的信息,请查阅向通用表空间中添加表。