IMPORT TABLE FROM sdi_file [, sdi_file] ...
该 导入表
语句根据 .sdi
(序列化字典信息) 元数据文件中的信息导入 MyISAM
表。 导入表
需要 文件
权限来读取 .sdi
和表内容文件,以及 创建
权限来创建表。
表可以使用 mysqldump 从一个服务器导出到文件中,然后使用 mysql 处理转储文件。 导入表
提供了一个使用原始表文件的更快的替代方案。
在导入之前,必须将提供表内容的文件放在导入服务器的适当模式目录中,并将 .sdi
文件放在服务器可以访问的目录中。例如, .sdi
文件可以放在由 secure_file_priv
系统变量命名的目录中,或者(如果 secure_file_priv
为空)在服务器数据目录下的某个目录中。
以下示例描述了如何从一个服务器的 hr
模式中导出 MyISAM
表 employees
和 managers
,然后将它们导入到另一个服务器的 hr
模式中。该示例使用以下假设(要在您自己的系统上执行类似的操作,请修改路径名):
-
对于导出服务器,
export_basedir
代表其基本目录,其数据目录是
。export_basedir
/data -
对于导入服务器,
import_basedir
代表其基本目录,其数据目录是
。import_basedir
/data -
表文件从导出服务器导出到
/tmp/export
目录中,该目录是安全的(不可访问其他用户)。 -
导入服务器使用
/tmp/mysql-files
作为其secure_file_priv
系统变量命名的目录。
要从导出服务器导出表,请执行以下步骤:
-
确保一致的快照通过执行以下语句来锁定表,以便在导出期间不能修改:
mysql> FLUSH TABLES hr.employees, hr.managers WITH READ LOCK;
在锁定生效期间,表仍然可以用于读取访问。
-
在文件系统级别,将
.sdi
和表内容文件从hr
模式目录复制到安全的导出目录:-
.sdi
文件位于hr
模式目录中,但可能不具有与表名相同的basename。例如,.sdi
文件对于employees
和managers
表可能命名为employees_125.sdi
和managers_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
-
-
解锁表:
mysql> UNLOCK TABLES;
要将表导入到导入服务器,请执行以下步骤:
-
导入模式必须存在。如果必要,请执行以下语句来创建它:
mysql> CREATE SCHEMA hr;
-
在文件系统级别,将
.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
-
通过执行
导入表
语句来导入表,该语句命名.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 DIRECTORY
或 INDEX DIRECTORY
表选项。在那种情况下,修改导入过程使用以下替代方法之一,然后执行 IMPORT TABLE
语句:
-
将数据和索引文件放置在导入服务器主机上的同一个目录中,如导出服务器主机,并在导入服务器模式目录中创建符号链接到这些文件。
-
将数据和索引文件放置在导入服务器主机上的不同目录中,如导出服务器主机,并在导入服务器模式目录中创建符号链接到这些文件。此外,还需要修改
.sdi
文件以反映不同的文件位置。 -
将数据和索引文件放置在导入服务器的模式目录中,并修改
.sdi
文件以删除数据和索引目录表选项。
存储在 .sdi
文件中的任何排序 ID 都必须在导出和导入服务器上引用相同的排序。
表的触发器信息不会被序列化到表的 .sdi
文件中,因此触发器不会被导入操作还原。
在执行 .sdi
文件之前,某些编辑是允许的,而其他编辑可能会出现问题或甚至导致导入操作失败:
-
如果数据目录和索引目录表选项之间的位置不同,则需要更改数据目录和索引目录表选项。
-
如果要将表导入到导入服务器上的不同模式中,而不是导出服务器上的模式,则需要更改模式名称。
-
可能需要更改模式和表名称,以适应导出和导入服务器之间的文件系统大小写敏感语义差异或
lower_case_table_names
设置的差异。在.sdi
文件中更改表名称可能还需要重命名表文件。 -
在某些情况下,允许更改列定义。但是,更改数据类型可能会导致问题。