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
系统变量命名的目录。
要从导出服务器导出表,请使用以下步骤
通过执行以下语句锁定表以确保一致的快照,以便在导出期间无法修改表
mysql> FLUSH TABLES hr.employees, hr.managers WITH READ LOCK;
在锁定生效期间,仍然可以使用这些表,但只能进行读访问。
在文件系统级别,将
.sdi
和表内容文件从hr
模式目录复制到安全的导出目录.sdi
文件位于hr
模式目录中,但可能没有与表名完全相同的基名。例如,employees
和managers
表的.sdi
文件可能分别命名为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
通过执行一个
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 DIRECTORY
或 INDEX DIRECTORY
表选项。在这种情况下,请在执行 IMPORT TABLE
语句之前,使用以下替代方法之一修改导入过程
将数据和索引文件放入导入服务器主机上的与导出服务器主机相同的目录中,并在导入服务器模式目录中创建指向这些文件的符号链接。
将数据和索引文件放入与导出服务器主机不同的导入服务器主机目录中,并在导入服务器模式目录中创建指向这些文件的符号链接。此外,修改
.sdi
文件以反映不同的文件位置。将数据和索引文件放入导入服务器主机上的模式目录中,并修改
.sdi
文件以删除数据和索引目录表选项。
存储在 .sdi
文件中的任何排序规则 ID 必须引用导出和导入服务器上的相同排序规则。
表的触发器信息不会序列化到表 .sdi
文件中,因此导入操作不会恢复触发器。
在执行 IMPORT TABLE
语句之前,对 .sdi
文件进行一些编辑是允许的,而其他一些编辑则有问题,甚至可能导致导入操作失败
如果数据和索引文件的位置在导出服务器和导入服务器之间不同,则需要更改数据目录和索引目录表选项。
更改模式名称是必需的,以便将表导入到导入服务器上的不同模式,而不是导出服务器上的模式。
更改模式和表名可能是必需的,以适应导出和导入服务器上的文件系统区分大小写语义之间的差异,或
lower_case_table_names
设置之间的差异。在.sdi
文件中更改表名可能还需要重命名表文件。在某些情况下,允许对列定义进行更改。更改数据类型可能会导致问题。