IMPORT TABLE语句
IMPORT TABLE FROM sdi_file [, sdi_file] ...
该IMPORT TABLE
语句MyISAM
基于.sdi
(序列化字典信息)元数据文件中包含的信息导入表。IMPORT TABLE
需要具有FILE
读取.sdi
和表内容文件的CREATE
特权,以及要创建表的特权。
可以使用mysqldump从一台服务器导出表以编写SQL语句文件,然后使用mysql将表导入另一台服务器以处理转储文件。IMPORT TABLE
使用“原始”表文件提供了更快的替代方法。
导入之前,必须将提供表内容的文件放在导入服务器的相应架构目录中,并且该.sdi
文件必须位于服务器可访问的目录中。例如,.sdi
可以将文件放置在secure_file_priv
系统变量命名的目录中,或者放置在secure_file_priv
服务器数据目录下的目录中(如果为空)。
下面的示例说明如何从一个服务器的架构中导出MyISAM
名为employees
和的表,并将其导入另一台服务器的架构中。该示例使用以下假设(要在您自己的系统上执行类似的操作,请相应地修改路径名):managers
hr
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.managersWITH READ LOCK ;当锁定生效时,这些表仍然可以使用,但只能用于读取访问。
在文件系统级别,将
.sdi
和目录内容文件从hr
架构目录复制到安全导出目录:- 该
.sdi
文件位于hr
架构目录中,但可能没有与表名完全相同的基本名。例如,和表的.sdi
文件可能命名为和。employees
managers
employees_125.sdi
managers_238.sdi
- 对于
MyISAM
表,内容文件是其.MYD
数据文件和.MYI
索引文件。
给定这些文件名,复制命令如下所示:
shell>
cd export_basedir/data/hr shell>cp employees_125.sdi /tmp/export shell>cp managers_238.sdi /tmp/export shell>cp employees.{MYD,MYI} /tmp/export shell>cp managers.{MYD,MYI} /tmp/export- 该
解锁表格:
mysql>
UNLOCK TABLES ;
要将表导入到导入服务器,请使用以下过程:
导入模式必须存在。如有必要,执行以下语句来创建它:
mysql>
CREATE SCHEMA hr;在文件系统级别,将
.sdi
文件复制到导入服务器secure_file_priv
目录/tmp/mysql-files
。另外,将表内容文件复制到hr
架构目录:shell>
cd /tmp/export shell>cp employees_125.sdi /tmp/mysql-files shell>cp managers_238.sdi /tmp/mysql-files shell>cp employees.{MYD,MYI} import_basedir/data/hr shell>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
文件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
规则)。请参见“ 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
在执行IMPORT TABLE
语句之前,允许对文件进行某些编辑,而其他编辑则有问题,甚至可能导致导入操作失败:
- 如果导出服务器和导入服务器之间数据和索引文件的位置不同,则需要更改数据目录和索引目录表选项。
- 需要将架构名称更改为将表导入到导入服务器上与导出服务器上不同的架构中。
- 可能需要更改架构和表名,以适应导出和导入服务器上文件系统区分大小写的语义之间的差异或
lower_case_table_names
设置的差异。更改.sdi
文件中的表名可能还需要重命名表文件。 - 在某些情况下,允许更改列定义。更改数据类型可能会引起问题。