Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

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

15.2.6 导入表语句

IMPORT TABLE FROM sdi_file [, sdi_file] ...

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

表可以使用 mysqldump 从一个服务器导出到文件中,然后使用 mysql 处理转储文件。 导入表 提供了一个使用原始表文件的更快的替代方案。

在导入之前,必须将提供表内容的文件放在导入服务器的适当模式目录中,并将 .sdi 文件放在服务器可以访问的目录中。例如, .sdi 文件可以放在由 secure_file_priv 系统变量命名的目录中,或者(如果 secure_file_priv 为空)在服务器数据目录下的某个目录中。

以下示例描述了如何从一个服务器的 hr 模式中导出 MyISAMemployeesmanagers,然后将它们导入到另一个服务器的 hr 模式中。该示例使用以下假设(要在您自己的系统上执行类似的操作,请修改路径名):

  • 对于导出服务器, 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 模式目录中,但可能不具有与表名相同的basename。例如, .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. 通过执行 导入表 语句来导入表,该语句命名 .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 规则)。见 第 15.2.9 节,“LOAD DATA 语句”,特别注意相对路径名的解释规则。

IMPORT TABLE 如果无法定位 .sdi 或表文件,将失败。在导入表后,服务器尝试打开它,并报告任何检测到的问题。要尝试修复报告的任何问题,请使用 REPAIR TABLE

IMPORT TABLE 不写入二进制日志。

限制和限制

IMPORT TABLE 仅适用于非 TEMPORARY MyISAM 表。它不适用于事务存储引擎创建的表、使用 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 文件之前,某些编辑是允许的,而其他编辑可能会出现问题或甚至导致导入操作失败:

  • 如果数据目录和索引目录表选项之间的位置不同,则需要更改数据目录和索引目录表选项。

  • 如果要将表导入到导入服务器上的不同模式中,而不是导出服务器上的模式,则需要更改模式名称。

  • 可能需要更改模式和表名称,以适应导出和导入服务器之间的文件系统大小写敏感语义差异或 lower_case_table_names 设置的差异。在 .sdi 文件中更改表名称可能还需要重命名表文件。

  • 在某些情况下,允许更改列定义。但是,更改数据类型可能会导致问题。