本节介绍将部分或全部 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
。仅在导入整个表或表的一部分后执行提交。