14.6.1.3 导入 InnoDBtable

本节介绍如何使用“可传输 table 空间”功能导入 table,该功能允许导入 table,分区 table 或每个 table 文件 table 空间中的单个 table 分区。您可能要导入 table 的原因有很多:

本节以下主题下介绍了“可移动 table 空间”功能:

Prerequisites
Importing Tables

本示例演示如何导入驻留在每个 table 文件 table 空间中的常规非分区 table。

mysql> USE test;
mysql> CREATE TABLE t1 (c1 INT) ENGINE=INNODB;
mysql> ALTER TABLE t1 DISCARD TABLESPACE;
mysql> USE test;
mysql> FLUSH TABLES t1 FOR EXPORT;

冲洗 table...Export确保已将对命名 table 的更改刷新到磁盘,以便可以在服务器运行时进行二进制 table 复制。运行冲洗 table...Export时,InnoDB在 table 的架构目录中生成.cfg元数据文件。 .cfg文件包含在导入操作期间用于架构验证的元数据。

shell> scp /path/to/datadir/test/t1.{ibd,cfg} destination-server:/path/to/datadir/test

释放共享锁之前,必须先复制.ibd文件和.cfg文件,如下一步所述。

Note

如果要从加密的 table 空间导入 table,则InnoDB除了会生成.cfg元数据文件之外,还会生成.cfp文件。 .cfp文件必须与.cfg文件一起复制到目标实例。 .cfp文件包含一个传输密钥和一个加密的 table 空间密钥。导入时,InnoDB使用传输密钥解密 table 空间密钥。有关相关信息,请参见第 14.14 节“ InnoDB 静态数据加密”

mysql> USE test;
mysql> UNLOCK TABLES;
mysql> USE test;
mysql> ALTER TABLE t1 IMPORT TABLESPACE;
导入分区 table

本示例演示了如何导入分区 table,其中每个 table 分区都位于每个 table 文件 table 空间中。

mysql> USE test;
mysql> CREATE TABLE t1 (i int) ENGINE = InnoDB PARTITION BY KEY (i) PARTITIONS 3;

/datadir/test目录中,三个分区中的每个分区都有一个 table 空间.ibd文件。

mysql> \! ls /path/to/datadir/test/
db.opt  t1.frm  t1#P#p0.ibd  t1#P#p1.ibd  t1#P#p2.ibd
mysql> ALTER TABLE t1 DISCARD TABLESPACE;

分区 table 的三个 table 空间.ibd文件从/datadir/test目录中丢弃,剩下以下文件:

mysql> \! ls /path/to/datadir/test/
db.opt  t1.frm
mysql> USE test;
mysql> FLUSH TABLES t1 FOR EXPORT;

冲洗 table...Export确保将对命名 table 的更改刷新到磁盘,以便可以在服务器运行时进行二进制 table 复制。运行冲洗 table...Export时,InnoDB在 table 的架构目录中为每个 table 的 table 空间文件生成.cfg元数据文件。

mysql> \! ls /path/to/datadir/test/
db.opt t1#P#p0.ibd  t1#P#p1.ibd  t1#P#p2.ibd
t1.frm  t1#P#p0.cfg  t1#P#p1.cfg  t1#P#p2.cfg

.cfg文件包含用于在导入 table 空间时用于架构验证的元数据。 冲洗 table...Export只能在 table 上运行,不能在单个 table 分区上运行。

shell>scp /path/to/datadir/test/t1*.{ibd,cfg} destination-server:/path/to/datadir/test

释放共享锁之前,必须先复制.ibd.cfg文件,如下一步所述。

Note

如果要从加密的 table 空间导入 table,则InnoDB除了会生成.cfg元数据文件外,还会生成.cfp文件。 .cfp文件必须与.cfg文件一起复制到目标实例。 .cfp文件包含传输密钥和加密的 table 空间密钥。导入时,InnoDB使用传输密钥解密 table 空间密钥。有关相关信息,请参见第 14.14 节“ InnoDB 静态数据加密”

mysql> USE test;
mysql> UNLOCK TABLES;
mysql> USE test;
mysql> ALTER TABLE t1 IMPORT TABLESPACE;
导入 table 分区

本示例演示了如何导入单个 table 分区,其中每个分区都位于每个 table 文件 table 空间文件中。

在以下示例中,导入了四分区 table 的两个分区(p2p3)。

mysql> USE test;
mysql> CREATE TABLE t1 (i int) ENGINE = InnoDB PARTITION BY KEY (i) PARTITIONS 4;

/datadir/test目录中,四个分区中的每个分区都有一个 table 空间.ibd文件。

mysql> \! ls /path/to/datadir/test/
db.opt  t1.frm  t1#P#p0.ibd  t1#P#p1.ibd  t1#P#p2.ibd t1#P#p3.ibd
mysql> ALTER TABLE t1 DISCARD PARTITION p2, p3 TABLESPACE;

从目标实例上的/datadir/test目录中删除了两个废弃分区的 table 空间.ibd文件,保留了以下文件:

mysql> \! ls /path/to/datadir/test/
db.opt  t1.frm  t1#P#p0.ibd  t1#P#p1.ibd

Note

在子分区 table 上运行ALTER TABLE ...磁盘分区... TABLESPACE时,分区和子分区 table 名称均被允许。指定分区名称后,该分区的子分区将包含在操作中。

mysql> USE test;
mysql> FLUSH TABLES t1 FOR EXPORT;

冲洗 table...Export确保将对命名 table 的更改刷新到磁盘上,以便可以在实例运行时进行二进制 table 复制。运行冲洗 table...Export时,InnoDB为 table 的架构目录中的每个 table 的 table 空间文件生成.cfg元数据文件。

mysql> \! ls /path/to/datadir/test/
db.opt  t1#P#p0.ibd  t1#P#p1.ibd  t1#P#p2.ibd t1#P#p3.ibd
t1.frm  t1#P#p0.cfg  t1#P#p1.cfg  t1#P#p2.cfg t1#P#p3.cfg

.cfg文件包含在导入操作期间用于架构验证的元数据。 冲洗 table...Export只能在 table 上运行,不能在单个 table 分区上运行。

shell> scp t1#P#p2.ibd t1#P#p2.cfg t1#P#p3.ibd t1#P#p3.cfg destination-server:/path/to/datadir/test

释放共享锁之前,必须先复制.ibd.cfg文件,如下一步所述。

Note

如果要从加密的 table 空间导入分区,则InnoDB除了会生成.cfg元数据文件之外,还会生成.cfp文件。 .cfp文件必须与.cfg文件一起复制到目标实例。 .cfp文件包含传输密钥和加密的 table 空间密钥。导入时,InnoDB使用传输密钥解密 table 空间密钥。有关相关信息,请参见第 14.14 节“ InnoDB 静态数据加密”

mysql> USE test;
mysql> UNLOCK TABLES;
mysql> USE test;
mysql> ALTER TABLE t1 IMPORT PARTITION p2, p3 TABLESPACE;

Note

在子分区 table 上运行更改 table...导入分区...table 空间时,分区和子分区 table 名称均被允许。指定分区名称后,该分区的子分区将包含在操作中。

Limitations
Usage Notes
Message: InnoDB: IO Read error: (2, No such file or directory) Error opening '.\
test\t.cfg', will attempt to import without schema verification
1 row in set (0.00 sec)

仅当预期不存在架构不匹配时,才应考虑导入不包含.cfg元数据文件的 table。没有.cfg文件的导入功能在无法访问元数据的崩溃恢复方案中很有用。

[mysqld]
lower_case_table_names=1
Internals

以下信息描述了在 table 导入过程中写入错误日志的内部信息和消息。

在目标实例上运行ALTER TABLE ... DISCARD TABLESPACE时:

在源实例上运行冲洗 table...Export时:

此操作的预期错误日志消息:

[Note] InnoDB: Sync to disk of '"test"."t1"' started.
[Note] InnoDB: Stopping purge
[Note] InnoDB: Writing table metadata to './test/t1.cfg'
[Note] InnoDB: Table '"test"."t1"' flushed to disk

在源实例上运行UNLOCK TABLES时:

此操作的预期错误日志消息:

[Note] InnoDB: Deleting the meta-data file './test/t1.cfg'
[Note] InnoDB: Resuming purge

在目标实例上运行更改 table...导入 table 空间时,导入算法将对要导入的每个 table 空间执行以下操作:

此操作的预期错误日志消息:

[Note] InnoDB: Importing tablespace for table 'test/t1' that was exported
from host 'host_name'
[Note] InnoDB: Phase I - Update all pages
[Note] InnoDB: Sync to disk
[Note] InnoDB: Sync to disk - done!
[Note] InnoDB: Phase III - Flush changes to disk
[Note] InnoDB: Phase IV - Flush complete

Note

您还可能会收到一条警告,告知您 table 空间将被丢弃(如果您丢弃了目标 table 的 table 空间),并且一条消息指出由于缺少.ibd文件而无法计算统计信息:

[Warning] InnoDB: Table "test"."t1" tablespace is set as discarded.
7f34d9a37700 InnoDB: cannot calculate statistics for table
"test"."t1" because the .ibd file is missing. For help, please refer to
http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting.html
首页