本节介绍将部分或全部 InnoDB
表移动或复制到其他服务器或实例的技术。例如,您可以将整个 MySQL 实例移动到更大、更快的服务器;您可以将整个 MySQL 实例克隆到新的副本服务器;您可以将单个表复制到另一个实例以开发和测试应用程序,或者复制到数据仓库服务器以生成报告。
在 Windows 上,InnoDB
始终在内部以小写形式存储数据库和表名。要以二进制格式将数据库从 Unix 移动到 Windows 或从 Windows 移动到 Unix,请使用小写名称创建所有数据库和表。一种方便的方法是在创建任何数据库或表之前,将以下行添加到 my.cnf
或 my.ini
文件的 [mysqld]
部分
[mysqld]
lower_case_table_names=1
禁止在服务器启动时使用与服务器初始化时使用的设置不同的 lower_case_table_names
设置。
移动或复制 InnoDB
表的技术包括
导入表
可以使用 可传输表空间 功能从另一个 MySQL 服务器实例或从备份导入驻留在每个表一个文件的表空间中的表。请参阅 第 17.6.1.3 节“导入 InnoDB 表”。
MySQL 企业版备份
MySQL 企业版备份产品允许您备份正在运行的 MySQL 数据库,同时最大限度地减少对操作的干扰,并生成数据库的一致快照。当 MySQL 企业版备份正在复制表时,读取和写入可以继续。此外,MySQL 企业版备份可以创建压缩备份文件,并备份表的子集。结合 MySQL 二进制日志,您可以执行时间点恢复。MySQL 企业版备份作为 MySQL 企业版订阅的一部分提供。
有关 MySQL 企业版备份的更多详细信息,请参阅 第 32.1 节“MySQL 企业版备份概述”。
复制数据文件(冷备份方法)
您可以通过复制 第 17.18.1 节“InnoDB 备份” 中“冷备份”下列出的所有相关文件来移动 InnoDB
数据库。
InnoDB
数据和日志文件在所有具有相同浮点数格式的平台上都是二进制兼容的。如果浮点数格式不同,但您没有在表中使用 FLOAT
或 DOUBLE
数据类型,则过程相同:只需复制相关文件。
移动或复制每个表一个文件的 .ibd
文件时,源系统和目标系统上的数据库目录名称必须相同。存储在 InnoDB
共享表空间中的表定义包括数据库名称。存储在表空间文件中的事务 ID 和日志序列号在不同数据库之间也不同。
要将 .ibd
文件和关联的表从一个数据库移动到另一个数据库,请使用 RENAME TABLE
语句
RENAME TABLE db1.tbl_name TO db2.tbl_name;
如果您有 .ibd
文件的 “干净” 备份,则可以按如下方式将其还原到其来源的 MySQL 安装
自您复制
.ibd
文件以来,该表一定不能被删除或截断,因为这样做会更改存储在表空间内的表 ID。发出此
ALTER TABLE
语句以删除当前的.ibd
文件ALTER TABLE tbl_name DISCARD TABLESPACE;
将备份的
.ibd
文件复制到正确的数据库目录。发出此
ALTER TABLE
语句以告知InnoDB
对该表使用新的.ibd
文件ALTER TABLE tbl_name IMPORT TABLESPACE;
注意ALTER TABLE ... IMPORT TABLESPACE
功能不会对导入的数据强制执行外键约束。
在此上下文中,“干净的” .ibd
文件备份是指满足以下要求的备份
.ibd
文件中没有事务的未提交修改。.ibd
文件中没有未合并的插入缓冲区条目。Purge 已从
.ibd
文件中删除了所有标记为删除的索引记录。mysqld 已将
.ibd
文件中所有修改过的页面从缓冲池刷新到文件中。
您可以使用以下方法制作干净的备份 .ibd
文件
停止 mysqld 服务器上的所有活动并提交所有事务。
等到
SHOW ENGINE INNODB STATUS
显示数据库中没有活动事务,并且InnoDB
的主线程状态为正在等待服务器活动
。然后,您可以复制.ibd
文件。
制作 .ibd
文件的干净副本的另一种方法是使用 MySQL Enterprise Backup 产品
使用 MySQL Enterprise Backup 备份
InnoDB
安装。在备份上启动第二个 mysqld 服务器,并让其清理备份中的
.ibd
文件。
从逻辑备份还原
您可以使用 mysqldump 等实用程序执行逻辑备份,这会生成一组 SQL 语句,可以通过执行这些语句来复制原始数据库对象定义和表数据,以便传输到另一个 SQL 服务器。使用此方法时,格式是否不同或者表中是否包含浮点数据都无关紧要。
为了提高此方法的性能,请在导入数据时禁用 autocommit
。仅在导入整个表或表的一部分后才执行提交。