MySQL的SQL语句 - 数据操作语句(5)- IMPORT TABLE 语句

IMPORT TABLE 语句
1. 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 模式导出名为 employees 和 managers 的 MyISAM 表,并将它们导入到另一台服务器的 hr 模式中。该示例使用以下假设(要在您自己的系统上执行类似的操作,请根据需要修改路径名):

● 对于导出服务器,export_basedir 表示其基本目录,其数据目录为 export_basedir/data。

● 对于导入服务器,import_basedir 表示其基本目录,其数据目录为 import_basedir/data。

● 表文件从导出服务器导出到 /tmp/export 目录中,该目录是安全的(其他用户无法访问)。

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

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

  1. 通过执行以下语句锁定表以确保快照一致,以便在导出过程中无法修改这些表:
  2. mysql> FLUSH TABLES hr.employees, hr.managers WITH READ LOCK;

    
    当锁生效时,表仍然可用,但只能对表进行读操作。
  3. 在文件系统级别,将 .sdi 和表内容文件从 hr 模式目录复制到安全导出目录:

■ .sdi 文件位于 hr 模式目录中,但可能与表名的基本名称不完全相同。例如,employees 和 managers 表的 .sdi 文件可能命名为 employees_125.sdi 和 managers_238.sdi。

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

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

1. shell> cd export_basedir/data/hr
2. shell> cp employees_125.sdi /tmp/export
3. shell> cp managers_238.sdi /tmp/export
4. shell> cp employees.{MYD,MYI} /tmp/export
5. shell> cp managers.{MYD,MYI} /tmp/export
  1. 解锁表:
  2. mysql> UNLOCK TABLES;

    
    要将表导入到导入服务器,请使用以下过程:
  3. 导入模式必须存在。如有必要,执行以下语句以创建它:
  4. mysql> CREATE SCHEMA hr;
  5. 在文件系统级别,将 .sdi 文件复制到导入服务器 secure_file_priv 目录,/tmp/mysql files。同时,将表内容文件复制到 hr 模式目录:

  6. shell> cd /tmp/export
  7. shell> cp employees_125.sdi /tmp/mysql-files
  8. shell> cp managers_238.sdi /tmp/mysql-files
  9. shell> cp employees.{MYD,MYI} import_basedir/data/hr
  10. shell> cp managers.{MYD,MYI} import_basedir/data/hr

  11. 通过执行 IMPORT TABLE 语句将 .sdi 文件导入表:
1. mysql> IMPORT TABLE FROM
2.        ‘/tmp/mysql-files/employees.sdi‘,
3.        ‘/tmp/mysql-files/managers.sdi‘;

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

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

● ? 匹配任何单个字符

● * 匹配任何字符序列,包括匹配无字符的情况

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

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

为了解析 .sdi 文件路径名的位置,服务器对 IMPORT TABLE 使用与 LOAD DATA 的服务器端规则相同的规则(即非本地规则)。

如果找不到 .sdi 或表文件,则 IMPORT TABLE 语句失败。导入表后,服务器将尝试打开该表,并将检测到的任何问题报警。要尝试修复以更正任何报告的问题,请使用 REPAIR TABLE。

IMPORT TABLE 语句未写入二进制日志。

限制和局限性

IMPORT TABLE 仅适用于非临时 MyISAM 表。它不适用于使用事务性存储引擎创建的表、使用 CREATE TEMPORARY TABLE 创建的表或视图。

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

1. {
2.    "mysqld_version_id":80019,
3.    "dd_version":80017,
4.    "sdi_version":80016,
5.    ...
6. }

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

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

● 将数据和索引文件放在导入服务器主机上与导出服务器主机上相同的目录中,并在导入服务器模式目录中创建指向这些文件的符号链接。

● 将数据和索引文件放到与导出服务器主机不同的导入服务器主机目录中,并在导入服务器模式目录中创建指向这些文件的符号链接。另外,修改 .sdi 文件以反映不同的文件位置。

● 将数据和索引文件放到导入服务器主机上的模式目录中,并修改 .sdi 文件,删除数据和索引目录表选项。

存储在 .sdi 文件中的任何排序规则 ID 都必须引用导出和导入服务器上的相同排序规则。

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

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

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

● 若要将表导入到导入服务器上与导出服务器上不同的模式中,则需要更改模式名称。

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

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

官方网址:
https://dev.mysql.com/doc/refman/8.0/en/import-table.html

MySQL的SQL语句 - 数据操作语句(5)- IMPORT TABLE 语句

上一篇:CentOS 7.X 静默安装Oracle 12C数据库


下一篇:MySQL的SQL语句 - 数据操作语句(9)- LOAD DATA 语句(2)