InnoDB 在数据目录之外创建表有不同的原因这些原因可能包括空间管理、I/O 优化或将表放置在具有特定性能或容量特征的存储设备上,我来为大家科普一下关于mysql innodb索引底层数据结构?以下内容希望对你有帮助!
mysql innodb索引底层数据结构
InnoDB 在数据目录之外创建表有不同的原因。这些原因可能包括空间管理、I/O 优化或将表放置在具有特定性能或容量特征的存储设备上。
InnoDB支持以下外部建表方式:
- 使用DATA DIRECTORY子句
- 使用 CREATE TABLE ... TABLESPACE 语法
- 在外部通用表空间中创建表
您可以通过在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 |
-------------------------
当您在CREATE TABLE语句中指定DATA DIRECTORY子句时 ,将在指定目录下的模式目录中创建表的数据文件 (table_name.ibd)。
从 MySQL 8.0.21 开始,使用DATA DIRECTORY子句在数据目录之外创建的表和表分区仅限于InnoDB。此要求允许数据库管理员控制在何处创建表空间数据文件,并确保在恢复期间可以找到数据文件。
已知目录是由 datadir、 innodb_data_home_dir和 innodb_directories变量定义的目录。您可以使用以下语句检查这些设置:
mysql> SELECT @@datadir,@@innodb_data_home_dir,@@innodb_directories;
如果您要使用的目录未知, 请在创建表之前将其添加到innodb_directories设置中。innodb_directories变量是只读的。配置它需要重新启动服务器。
以下示例演示了使用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 挂载的卷上之前,请检查 NFS 与 MySQL的潜在问题 。
- 如果使用 LVM 快照、文件复制或其他基于文件的机制来备份表的数据文件,请始终 首先使用FLUSH TABLES ... FOR EXPORT语句以确保在备份发生之前将缓冲在内存中的所有更改刷新到磁盘。
- 使用DATA DIRECTORY子句在外部目录中创建表是使用InnoDB不支持的符号链接的替代方法。
- 在源和副本位于同一主机上的复制环境中不支持DATA DIRECTORY子句。DATA DIRECTORY子句需要完整的目录路径。在这种情况下复制路径将导致源和副本在同一位置创建表。
- 从 MySQL 8.0.21 开始,在独立表空间中创建的表不能再在 undo 表空间目录 ( innodb_undo_directory) 中创建,除非是InnoDB的已知目录。
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方法等效。
在外部通用表空间中创建表您可以在存储在外部目录中的通用表空间中创建表。
,