Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  IMPORT TABLE Statement

15.2.6 导入表语句

IMPORT TABLE FROM sdi_file [, sdi_file] ...

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

可以使用mysqldump从一个服务器导出表,然后使用mysql将dump文件处理到另一个服务器。IMPORT TABLE 提供了使用“raw”表文件的更快的替代方案。

在导入之前,提供表内容的文件必须放置在适当的 schema 目录中,以便于导入服务器,并且.sdi文件必须位于服务器可访问的目录中。例如,.sdi文件可以被放置在由secure_file_priv系统变量指定的目录中,或者(如果secure_file_priv为空)在服务器数据目录下的子目录中。

以下示例描述了如何从一个服务器的hr schema 中导出名为employeesmanagersMyISAM表,并将其导入到另一个服务器的hr schema 中。该示例假设了以下条件(要在自己的系统上执行类似的操作,请根据需要修改路径名):

  • 对于导出服务器,export_basedir表示其基础目录,而其数据目录是export_basedir/data

  • 对于导入服务器,import_basedir表示其基础目录,而其数据目录是import_basedir/data

  • 表文件将从导出服务器导出到/tmp/export目录中,并且该目录是安全的(不允许其他用户访问)。

  • 导入服务器使用/tmp/mysql-files作为其secure_file_priv系统变量指定的目录。

从导出服务器导出表格,请按照以下步骤进行:

  1. 确保执行以下语句锁定表,以便在导出期间不能被修改:

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

    在锁定的有效期内,表可以继续使用,但只能用于读取访问。

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

    • .sdi文件位于hr架构目录,但可能不具有与表名相同的基本名称。例如,.sdi文件对应于employeesmanagers表可能命名为employees_125.sdimanagers_238.sdi

    • 对于MyISAM表,内容文件是其.MYD数据文件和.MYI索引文件。

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

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

    mysql> UNLOCK TABLES;

将表格导入到导入服务器,请按照以下步骤进行:

  1. 导入架构必须存在。如果必要,请执行以下语句创建它:

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

    $> cd /tmp/export
    $> cp employees_125.sdi /tmp/mysql-files
    $> cp managers_238.sdi /tmp/mysql-files
    $> cp employees.{MYD,MYI} import_basedir/data/hr
    $> 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文件放置在导入服务器目录中,如果该变量为空;它可以位于任何可访问的目录中,包括要导入表的架构目录。如果将.sdi文件放置在该目录中,它可能会被重写;导入操作创建一个新的.sdi文件,以覆盖旧的.sdi文件,如果操作使用相同的文件名为新文件。

每个sdi_file值必须是字符串字面量,命名要导入表的.sdi文件或是一个匹配.sdi文件的模式。如果字符串是一个模式,那么任何前缀目录路径和.sdi文件名后缀都必须给出字面量。模式字符只能在文件名的基本名称部分中出现:

  • ?匹配任何单个字符

  • *匹配任何字符序列,包括无字符

使用模式,之前的IMPORT TABLE语句可以写成这样(假设/tmp/mysql-files目录中没有其他匹配模式的.sdi文件):

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

服务器使用与IMPORT TABLE相同的规则来解释.sdi文件路径名,服务器端对LOAD DATA的规则(即非LOCAL规则)。请参阅第15.2.9节,“LOAD DATA Statement”,特别是解释相对路径名的规则。

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语句:

  • 将数据和索引文件放置在导入服务器主机的同一目录中,如export服务器主机,创建schema目录中的符号链接到这些文件。

  • 将数据和索引文件放置在与export服务器主机不同的导入服务器主机目录中,并在schema目录中创建符号链接到这些文件。此外,还需要修改.sdi文件以反映不同文件位置。

  • 将数据和索引文件放置在导入服务器主机的 schema 目录中,并修改.sdi文件以删除数据和索引目录选项。

.sdi文件中存储的任何排序 ID 都必须指向导出和导入服务器上的相同排序。

表的触发器信息不被序列化到表.sdi文件中,因此触发器不会通过导入操作恢复。

在执行IMPORT TABLE语句之前,可以对.sdi文件进行一些编辑,而其他编辑可能会导致导入操作失败:

  • 如果数据和索引文件的位置在导出和导入服务器之间不同,需要更改数据目录和索引目录选项。

  • 需要更改 schema 名以将表导入到导入服务器上的不同 schema 中,而不是在导出服务器上。

  • 如果文件系统的大小写敏感语义或lower_case_表名设置在导出和导入服务器之间不同,可能需要更改 schema 和表名。

  • 在某些情况下,可以对列定义进行修改。更改数据类型可能会导致问题。