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
文件中的表名称可能还需要重命名表文件。在某些情况下,允许对列定义进行更改。更改数据类型可能会导致问题。