• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 在外部创建表

    InnoDB外部创建表有多种原因。也就是说,在数据目录之外创建表。例如,那些原因可能包括空间管理,I / O优化或将表放置在具有特定性能或容量特性的存储设备上。

    InnoDB支持以下用于在外部创建表的方法:

    • 使用数据目录子句
    • 使用CREATE TABLE ... TABLESPACE语法
    • 在外部通用表空间中创建表

    使用数据目录子句

    您可以InnoDB通过DATA DIRECTORYCREATE TABLE语句中指定子句在外部目录中创建表。

    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 	|
    +-------------------------	+
    

    有关每表文件表空间的更多信息,请参见“每表文件表空间”。

    当您DATA DIRECTORYCREATE TABLE语句中指定子句时,表的数据文件(table_name.ibd)将在指定目录下的架构目录中创建。

    下面的示例演示使用DATA DIRECTORY子句在外部目录中创建表。假定innodb_file_per_table已启用该变量。

    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
    
    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 INT PRIMARY KEY) TABLESPACE = innodb_file_per_table
           DATA DIRECTORY = '/external/directory';
    

    仅在每个表文件表空间中创建的表支持此方法,但不需要innodb_file_per_table启用该变量。在所有其他方面,该方法等效于上述CREATE TABLE ... DATA DIRECTORY方法。相同的使用说明适用。

    在外部通用表空间中创建表

    您可以在位于外部目录中的常规表空间中创建表。

    • 有关在外部目录中创建常规表空间的信息,请参见创建常规表空间。
    • 有关在常规表空间中创建表的信息,请参见将表添加到常规表空间。

    上篇:创建InnoDB表

    下篇:导入InnoDB表