• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • IMPORT TABLE语句

    IMPORT TABLE FROM sdi_file [, sdi_file] ...
    

    IMPORT TABLE语句MyISAM基于.sdi(序列化字典信息)元数据文件中包含的信息导入表。IMPORT TABLE需要具有FILE读取.sdi和表内容文件的CREATE特权,以及要创建表的特权。

    可以使用mysqldump从一台服务器导出表以编写SQL语句文件,然后使用mysql将表导入另一台服务器以处理转储文件。IMPORT TABLE使用“原始”表文件提供了更快的替代方法。

    导入之前,必须将提供表内容的文件放在导入服务器的相应架构目录中,并且该.sdi文件必须位于服务器可访问的目录中。例如,.sdi可以将文件放置在secure_file_priv系统变量命名的目录中,或者放置在secure_file_priv服务器数据目录下的目录中(如果为空)。

    下面的示例说明如何从一个服务器的架构中导出MyISAM名为employees和的表,并将其导入另一台服务器的架构中。该示例使用以下假设(要在您自己的系统上执行类似的操作,请相应地修改路径名):managershrhr

    • 对于导出服务器,export_basedir代表其基本目录,其数据目录为export_basedir/data
    • 对于导入服务器,import_basedir代表其基本目录,其数据目录为import_basedir/data
    • 表文件从导出服务器导出到/tmp/export目录中,该目录是安全的(其他用户不可访问)。
    • 导入服务器使用/tmp/mysql-filessecure_file_priv系统变量命名的目录。

    要从导出服务器导出表,请使用以下过程:

    1. 通过执行以下语句来锁定表,以确保快照一致,以便在导出期间无法对其进行修改:

      mysql> FLUSH TABLES hr.employees, hr.managers WITH READ LOCK;
      

      当锁定生效时,这些表仍然可以使用,但只能用于读取访问。

    2. 在文件系统级别,将.sdi和目录内容文件从hr架构目录复制到安全导出目录:

      • .sdi文件位于hr架构目录中,但可能没有与表名完全相同的基本名。例如,和表的.sdi文件可能命名为和。employeesmanagersemployees_125.sdimanagers_238.sdi
      • 对于MyISAM表,内容文件是其.MYD数据文件和.MYI索引文件。

      给定这些文件名,复制命令如下所示:

      shell>cd export_basedir/data/hr
      shell>cp employees_125.sdi /tmp/export
      shell>cp managers_238.sdi /tmp/export
      shell>cp employees.{MYD,MYI} /tmp/export
      shell>cp managers.{MYD,MYI} /tmp/export
      
    3. 解锁表格:

      mysql> UNLOCK TABLES;
      

    要将表导入到导入服务器,请使用以下过程:

    1. 导入模式必须存在。如有必要,执行以下语句来创建它:

      mysql> CREATE SCHEMA hr;
      
    2. 在文件系统级别,将.sdi文件复制到导入服务器secure_file_priv目录/tmp/mysql-files。另外,将表内容文件复制到hr架构目录:

      shell>cd /tmp/export
      shell>cp employees_125.sdi /tmp/mysql-files
      shell>cp managers_238.sdi /tmp/mysql-files
      shell>cp employees.{MYD,MYI} import_basedir/data/hr
      shell>cp managers.{MYD,MYI} import_basedir/data/hr
      
    3. 通过执行IMPORT TABLE命名.sdi文件的语句来导入表:

      mysql> IMPORT TABLE FROM
             '/tmp/mysql-files/employees.sdi',
             '/tmp/mysql-files/managers.sdi';
      

    如果该.sdi文件secure_file_priv为空,则无需将该文件放置在系统变量命名的导入服务器目录中;它可以位于服务器可访问的任何目录中,包括导入表的架构目录。.sdi但是,如果文件位于该目录中,则可能会被重写;导入操作.sdi将为该表创建一个新文件,.sdi如果该操作对新文件使用相同的文件名,则该文件将覆盖旧文件。

    每个sdi_file值必须是.sdi为表的文件命名的字符串文字,或者是与.sdi文件匹配的模式。如果字符串是模式,则.sdi必须直接提供任何前导目录路径和文件名后缀。模式字符仅允许在文件名的基本名称部分中使用:

    • ?匹配任何单个字符
    • *匹配任何字符序列,包括没有字符

    使用一个模式,上一条IMPORT TABLE语句可能是这样写的(假设/tmp/mysql-files目录中不包含.sdi与该模式匹配的其他文件):

    IMPORT TABLE FROM '/tmp/mysql-files/*.sdi';
    

    为了解释.sdi文件路径名的位置,服务器使用与IMPORT TABLE服务器端规则相同的规则LOAD DATA(即非LOCAL规则)。请参见“ LOAD DATA语句”,特别注意用于解释相对路径名的规则。

    IMPORT TABLE如果无法找到.sdi或表文件,则失败。导入表后,服务器尝试打开它,并报告检测到的任何问题作为警告。要尝试修复以纠正任何报告的问题,请使用REPAIR TABLE

    IMPORT TABLE未写入二进制日志。

    限制与限制

    IMPORT TABLE仅适用于非TEMPORARYMyISAM表。它不适用于使用事务存储引擎创建的表CREATE TEMPORARY TABLE,使用或视图创建的表。

    .sdi导入操作中使用的文件必须在与导入服务器具有相同数据字典版本和sdi版本的服务器上生成。在.sdi文件中找到生成服务器的版本信息:

    { 
       "mysqld_version_id":80019,
       "dd_version":80017,
       "sdi_version":80016,
       ...
    }
    

    要确定导入服务器的数据字典和sdi版本,您可以检查.sdi导入服务器上最近创建的表的文件。

    表数据和索引文件必须在导入操作之前放置在导入服务器的架构目录中,除非导出服务器上定义的表使用DATA DIRECTORYINDEX DIRECTORY表选项。在这种情况下,请在执行该IMPORT TABLE语句之前使用以下替代方法之一修改导入过程:

    • 将数据和索引文件放入导入服务器主机上与导出服务器主机上相同的目录中,并在导入服务器架构目录中创建到这些文件的符号链接。
    • 将数据和索引文件放入与导出服务器主机上不同的导入服务器主机目录中,并在导入服务器架构目录中创建到这些文件的符号链接。此外,修改.sdi文件以反映不同的文件位置。
    • 将数据和索引文件放入导入服务器主机上的架构目录,然后修改.sdi文件以删除数据和索引目录表选项。

    存储在.sdi文件中的所有归类ID 必须引用导出和导入服务器上的相同归类。

    表的触发器信息不会序列化到表.sdi文件中,因此导入操作不会还原触发器。

    .sdi在执行IMPORT TABLE语句之前,允许对文件进行某些编辑,而其他编辑则有问题,甚至可能导致导入操作失败:

    • 如果导出服务器和导入服务器之间数据和索引文件的位置不同,则需要更改数据目录和索引目录表选项。
    • 需要将架构名称更改为将表导入到导入服务器上与导出服务器上不同的架构中。
    • 可能需要更改架构和表名,以适应导出和导入服务器上文件系统区分大小写的语义之间的差异或lower_case_table_names设置的差异。更改.sdi文件中的表名可能还需要重命名表文件。
    • 在某些情况下,允许更改列定义。更改数据类型可能会引起问题。

    上篇:HANDLER语句

    下篇:INSERT语句