创造有不同的原因InnoDB
外部表;也就是说,在数据目录之外创建表。例如,这些原因可能包括空间管理、I/O优化或将表放置在具有特定性能或容量特征的存储设备上。
InnoDB
支持以下方法在外部创建表:
您可以创建InnoDB
表中数据目录
条款创建表
声明。
创建表t1 (c1 INT主键)/外部/目录”;
的数据目录
子句支持在“逐表文件”表空间中创建的表。表隐式地创建在每表文件的表空间中innodb_file_per_table
变量是启用的,默认为启用。
SELECT @@innodb_file_per_table;+-------------------------+ | @@ innodb_file_per_table | +-------------------------+ | 1 | +-------------------------+
有关逐表文件表空间的详细信息,请参见第15.6.3.2节,“每个表空间文件”.
当您指定数据目录
a条款创建表
语句,则表的数据文件(
)将在指定目录下的架构目录中创建。table_name
.ibd
从MySQL 8.0.21开始,表和表分区在数据目录之外使用数据目录
子句仅限于已知的目录InnoDB
.此要求允许数据库管理员控制表空间数据文件的创建位置,并确保在恢复过程中可以找到数据文件(请参见崩溃恢复期间的表空间发现).类定义的目录为已知目录datadir
,innodb_data_home_dir
,innodb_directories
变量。你可以使用下面的语句来检查这些设置:
mysql> SELECT @@datadir,@@innodb_data_home_dir,@@ innodb_directory;
如果要使用的目录未知,请将其添加到innodb_directories
在创建表之前进行设置。的innodb_directories
变量为只读。配置它需要重新启动服务器。有关设置系统变量的一般信息,请参见第5.1.9节“使用系统变量”.
属性在外部目录中创建表数据目录
条款。这是假定的innodb_file_per_table
变量,且该目录已知InnoDB
.
mysql>使用测试;mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY)/外部/目录”;# MySQL在外部目录$> cd /external/directory/test $> ls t1.ibd下的模式目录下创建表的数据文件
使用注意:
MySQL最初保持表空间数据文件打开,防止您卸载设备,但如果服务器很忙,最终可能会关闭该文件。注意不要在MySQL运行时意外卸载外部设备,或者在设备断开连接时启动MySQL。当关联的数据文件丢失时,试图访问表会导致严重错误,需要重新启动服务器。
如果在预期的路径上没有找到数据文件,服务器重新启动可能会失败。在这种情况下,您可以从备份中恢复表空间数据文件,或者删除表以从数据字典.
在将表放置到nfs挂载的卷上之前,请检查中概述的潜在问题使用NFS和MySQL.
如果使用LVM快照、文件副本或其他基于文件的机制来备份表的数据文件,请始终使用
抽水马桶…用于出口
语句,以确保在内存中缓冲的所有更改都是正确的刷新在备份发生之前,将数据删除到磁盘。使用
数据目录
子句在外部目录中创建表是使用符号链接,这InnoDB
不支持。的
数据目录
子句在源和副本位于同一主机上的复制环境中不支持。的数据目录
子句需要一个完整的目录路径。在这种情况下复制路径会导致源和副本在相同的位置创建表。从MySQL 8.0.21开始,在“逐表文件”表空间中创建的表不能再在undo表空间目录(
innodb_undo_directory
),除非有人直接知道InnoDB
.类定义的目录为已知目录datadir
,innodb_data_home_dir
,innodb_directories
变量。
创建表…表空间
语法可与数据目录
子句在外部目录中创建表。为此,请指定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
变量要启用。在所有其他方面,这种方法都等价于创建表…数据目录
方法如上所述。同样的用法说明也适用。