本节描述了将某些或所有 InnoDB
表移到不同服务器或实例的技术。例如,您可能需要将整个 MySQL 实例移到更大的、更快的服务器;您可能需要克隆整个 MySQL 实例到新的副本服务器;您可能需要将单个表复制到另一个实例,以开发和测试应用程序,或者将其复制到数据仓库服务器以生成报告。
在 Windows 上,InnoDB
始终以小写形式存储数据库和表名。要在 Unix 和 Windows 之间以二进制格式移动数据库,或者从 Windows 移动到 Unix,请使用小写名称创建所有数据库和表。实现这一点的一种便捷方式是在创建任何数据库或表之前,在 [mysqld]
部分的 my.cnf
或 my.ini
文件中添加以下行:
[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 企业备份概述”。
复制数据文件(冷备份方法)
您可以通过复制所有相关文件来移动 InnoDB
数据库,文件列表见 第 17.18.1 节,“InnoDB 备份” 中的“冷备份”部分。
InnoDB
数据和日志文件在具有相同浮点数格式的所有平台上都是二进制兼容的。如果浮点数格式不同,但您没有在表中使用 FLOAT
或 DOUBLE
数据类型,那么过程相同:只是复制相关文件。
当您移动或复制文件每表 .ibd
文件时,数据库目录名必须在源和目标系统上相同。InnoDB
共享表空间中的表定义包括数据库名。表空间文件中的事务 ID 和日志序列号也在不同的数据库之间不同。
要将 .ibd
文件和关联表从一个数据库移到另一个数据库,请使用 RENAME TABLE
语句:
RENAME TABLE db1.tbl_name TO db2.tbl_name;
如果您有一个 “clean” 的 .ibd
文件备份,可以将其恢复到原始 MySQL 安装中,如下所示:
-
表不能自从您复制
.ibd
文件以来被删除或截断,因为这样做会更改表空间中的表 ID。 -
发出以下
ALTER TABLE
语句以删除当前.ibd
文件:ALTER TABLE tbl_name DISCARD TABLESPACE;
-
将备份
.ibd
文件复制到适当的数据库目录中。 -
发出以下
ALTER TABLE
语句,以告诉InnoDB
使用新的.ibd
文件 для таблиц:ALTER TABLE tbl_name IMPORT TABLESPACE;
Note该
ALTER TABLE ... IMPORT TABLESPACE
功能不强制在导入的数据上执行外键约束。
在这个上下文中,一个 “干净” .ibd
文件备份是指满足以下要求的备份:
-
在
.ibd
文件中没有未提交的修改事务。 -
在
.ibd
文件中没有未合并的插入缓冲区条目。 -
清除已经从
.ibd
文件中删除了所有删除标记的索引记录。 -
mysqld 已经将
.ibd
文件中的所有修改页面从缓冲池刷新到文件中。
您可以使用以下方法创建一个干净的 .ibd
文件备份:
-
停止 mysqld 服务器的所有活动,并提交所有事务。
-
等待
SHOW ENGINE INNODB STATUS
显示数据库中没有活动事务,并且InnoDB
的主线程状态为Waiting for server activity
。然后,您可以复制.ibd
文件。
创建干净的 .ibd
文件副本的另一种方法是使用 MySQL Enterprise Backup 产品:
-
使用 MySQL Enterprise Backup 备份
InnoDB
安装。 -
在备份上启动第二个 mysqld 服务器,并让其清理备份中的
.ibd
文件。
从逻辑备份还原
您可以使用诸如 mysqldump 之类的实用程序执行逻辑备份,该备份生成一组 SQL 语句,可以执行这些语句以在另一个 SQL 服务器上重新创建原始数据库对象定义和表数据。使用这种方法,不管格式是否不同,或者您的表是否包含浮点数数据。
要提高这种方法的性能,请在导入数据时禁用 autocommit
。仅在导入整个表或表的一部分后提交。