文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  IMPORT TABLE 语句

15.2.6 IMPORT TABLE 语句

IMPORT TABLE FROM sdi_file [, sdi_file] ...

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

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

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

以下示例描述了如何从一个服务器的 hr 模式中导出名为 employeesmanagersMyISAM 表,并将它们导入到另一个服务器的 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 模式目录中,但其基本名称可能与表名称不完全相同。例如,employeesmanagers 表的 .sdi 文件可能分别命名为 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';

如果 secure_file_priv 系统变量为空,则 .sdi 文件不必放置在导入服务器由该变量命名的目录中;它可以位于服务器可以访问的任何目录中,包括导入表的模式目录。但是,如果 .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 语句”,尤其要注意解释相对路径名的规则。

如果无法找到 .sdi 或表文件,则 IMPORT TABLE 会失败。导入表后,服务器会尝试打开它,并报告检测到的任何问题作为警告。要尝试进行修复以更正任何报告的问题,请使用 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 文件中,因此导入操作不会恢复触发器。

在执行 IMPORT TABLE 语句之前,对 .sdi 文件进行一些编辑是允许的,而另一些编辑则存在问题,甚至可能导致导入操作失败

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

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

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

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