15.2.6 导入表语句
IMPORT TABLE FROM sdi_file [, sdi_file] ...
IMPORT TABLE
语句根据.sdi
(序列化字典信息)元数据文件中的信息导入MyISAM表。IMPORT TABLE
需要FILE
权限来读取.sdi
和表内容文件,以及CREATE
权限来创建表。
可以使用mysqldump从一个服务器导出表,然后使用mysql将dump文件处理到另一个服务器。IMPORT TABLE
提供了使用“raw”表文件的更快的替代方案。
在导入之前,提供表内容的文件必须放置在适当的 schema 目录中,以便于导入服务器,并且.sdi
文件必须位于服务器可访问的目录中。例如,.sdi
文件可以被放置在由secure_file_priv
系统变量指定的目录中,或者(如果secure_file_priv
为空)在服务器数据目录下的子目录中。
以下示例描述了如何从一个服务器的hr
schema 中导出名为employees
和managers
的MyISAM
表,并将其导入到另一个服务器的hr
schema 中。该示例假设了以下条件(要在自己的系统上执行类似的操作,请根据需要修改路径名):
-
对于导出服务器,
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
架构目录,但可能不具有与表名相同的基本名称。例如,.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
-
通过执行
IMPORT TABLE
语句,命名.sdi
文件:mysql> IMPORT TABLE FROM '/tmp/mysql-files/employees.sdi', '/tmp/mysql-files/managers.sdi';
不需要将.sdi
文件放置在导入服务器目录中,如果该变量为空;它可以位于任何可访问的目录中,包括要导入表的架构目录。如果将.sdi
文件放置在该目录中,它可能会被重写;导入操作创建一个新的.sdi
文件,以覆盖旧的.sdi
文件,如果操作使用相同的文件名为新文件。
每个sdi_file
值必须是字符串字面量,命名要导入表的.sdi
文件或是一个匹配.sdi
文件的模式。如果字符串是一个模式,那么任何前缀目录路径和.sdi
文件名后缀都必须给出字面量。模式字符只能在文件名的基本名称部分中出现:
-
?
匹配任何单个字符 -
*
匹配任何字符序列,包括无字符
使用模式,之前的IMPORT TABLE
语句可以写成这样(假设/tmp/mysql-files
目录中没有其他匹配模式的.sdi
文件):
IMPORT TABLE FROM '/tmp/mysql-files/*.sdi';
服务器使用与IMPORT TABLE
相同的规则来解释.sdi
文件路径名,服务器端对LOAD DATA
的规则(即非LOCAL
规则)。请参阅第15.2.9节,“LOAD DATA Statement”,特别是解释相对路径名的规则。
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
语句:
-
将数据和索引文件放置在导入服务器主机的同一目录中,如export服务器主机,创建schema目录中的符号链接到这些文件。
-
将数据和索引文件放置在与export服务器主机不同的导入服务器主机目录中,并在schema目录中创建符号链接到这些文件。此外,还需要修改
.sdi
文件以反映不同文件位置。 -
将数据和索引文件放置在导入服务器主机的 schema 目录中,并修改
.sdi
文件以删除数据和索引目录选项。
在.sdi
文件中存储的任何排序 ID 都必须指向导出和导入服务器上的相同排序。
表的触发器信息不被序列化到表.sdi
文件中,因此触发器不会通过导入操作恢复。
在执行IMPORT TABLE
语句之前,可以对.sdi
文件进行一些编辑,而其他编辑可能会导致导入操作失败:
-
如果数据和索引文件的位置在导出和导入服务器之间不同,需要更改数据目录和索引目录选项。
-
需要更改 schema 名以将表导入到导入服务器上的不同 schema 中,而不是在导出服务器上。
-
如果文件系统的大小写敏感语义或
lower_case_表名
设置在导出和导入服务器之间不同,可能需要更改 schema 和表名。 -
在某些情况下,可以对列定义进行修改。更改数据类型可能会导致问题。