14.6.1.4 移动或复制 InnoDBtable

本节介绍了将部分或全部InnoDBtable 移动或复制到其他服务器或实例的技术。例如,您可以将整个 MySQL 实例移至更大,速度更快的服务器上。您可以将整个 MySQL 实例克隆到新的副本服务器上;您可以将单个 table 复制到另一个实例以开发和测试应用程序,或复制到数据仓库服务器以生成报告。

在 Windows 上,InnoDB始终在内部以小写形式存储数据库和 table 名。要将二进制格式的数据库从 Unix 移至 Windows 或从 Windows 移至 Unix,请使用小写名称创建所有数据库和 table。一种方便的方法是在创建任何数据库或 table 之前,将以下行添加到my.cnfmy.ini文件的[mysqld]部分中:

[mysqld]
lower_case_table_names=1

移动或复制InnoDBtable 格的技术包括:

Importing Tables

可以使用* Transportable Tablespace *功能从另一个 MySQL 服务器实例或备份中导入每 table 文件 table 空间中的 table。参见第 14.6.1.3 节“导入 InnoDBtable”

MySQL 企业备份

MySQL Enterprise Backup 产品使您可以在不影响操作的情况下备份正在运行的 MySQL 数据库,同时生成一致的数据库快照。当 MySQL 企业备份复制 table 时,读取和写入可以 continue。此外,MySQL Enterprise Backup 可以创建压缩备份文件,并备份 table 的子集。结合 MySQL 二进制日志,您可以执行时间点恢复。 MySQL Enterprise Backup 是 MySQL Enterprise 订阅的一部分。

有关 MySQL 企业备份的更多详细信息,请参见第 29.2 节“ MySQL 企业备份概述”

复制数据文件(冷备份方法)

您只需复制第 14.19.1 节“ InnoDB 备份”的“冷备份”下列出的所有相关文件,即可移动InnoDB数据库。

InnoDB数据和日志文件在具有相同浮点数格式的所有平台上都是二进制兼容的。如果浮点格式不同,但是在 table 中未使用FLOATDOUBLE数据类型,则过程相同:只需复制相关文件。

移动或复制每 table.ibd文件时,数据库目录名称在源系统和目标系统上必须相同。存储在InnoDB共享 table 空间中的 table 定义包括数据库名称。table 空间文件中存储的事务 ID 和日志序列号在数据库之间也有所不同。

要将.ibd文件和关联的 table 从一个数据库移动到另一个数据库,请使用RENAME TABLE语句:

RENAME TABLE db1.tbl_name TO db2.tbl_name;

如果您拥有.ibd文件的“干净”备份,则可以将其还原到其原始来源的 MySQL 安装中,如下所示:

  • 自从复制.ibd文件以来,不得删除或截断该 table,因为这样做会更改存储在 table 空间中的 tableID。

  • 发出以下ALTER TABLE语句以删除当前的.ibd文件:

ALTER TABLE tbl_name DISCARD TABLESPACE;
  • 将备份.ibd文件复制到正确的数据库目录。

  • 发出以下ALTER TABLE语句,告诉InnoDB为 table 使用新的.ibd文件:

ALTER TABLE tbl_name IMPORT TABLESPACE;

Note

更改 table...导入 table 空间功能不对导入的数据施加外键约束。

在这种情况下,“干净的” .ibd文件备份是可以满足以下要求的文件:

  • .ibd文件中没有未提交的 Transaction 修改。

  • .ibd文件中没有未合并的插入缓冲区条目。

  • 清除已从.ibd文件中删除了所有带有删除标记的索引记录。

  • mysqld已将.ibd文件的所有已修改页面从缓冲池刷新到该文件。

您可以使用以下方法制作干净的备份.ibd文件:

  • 停止mysqld服务器上的所有活动并提交所有事务。

  • await显示引擎的 INNODB 状态显示数据库中没有活动事务,并且InnoDB的主线程状态为Waiting for server activity。然后,您可以制作.ibd文件的副本。

制作.ibd文件的完整副本的另一种方法是使用 MySQL Enterprise Backup 产品:

  • 使用 MySQL 企业备份来备份InnoDB安装。

  • 在备份上启动第二个mysqld服务器,并清理备份中的.ibd文件。

从逻辑备份还原

您可以使用诸如mysqldump之类的 Util 执行逻辑备份,该 Util 将生成一组 SQL 语句,可以执行这些语句以重现原始数据库对象定义和 table 数据,以将其传输到另一个 SQL Server。使用此方法,格式是否不同或 table 是否包含浮点数据都没有关系。

为了提高此方法的性能,请在导入数据时禁用autocommit。仅在导入整个 table 或 table 的一部分后才执行提交。