17.6.1.4 InnoDB 表的移动或复制
本节描述了将某些或所有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
表的技术包括:
Importing 表
可以使用Transportable Tablespace特性将一个文件表空间中的表从另一个MySQL服务器实例或备份中导入。见第17.6.1.3节,“Importing InnoDB Tables”。
MySQL Enterprise Backup产品可以在最小地中断操作的情况下对运行中的MySQL数据库进行备份,生成一个一致的数据库快照。当MySQL Enterprise Backup正在复制表时,可以继续读取和写入。在此外,MySQL Enterprise Backup还可以创建压缩后的备份文件,并备份表的子集。结合MySQL二进制日志,您可以执行点-in-time恢复。MySQL Enterprise Backup是MySQL Enterprise订阅的一部分。
关于MySQL Enterprise Backup的更多信息,请见第32.1节,“MySQL Enterprise Backup Overview”。
可以简单地将InnoDB
数据库移动到另一个位置,只需复制“Cold Backups”部分中列出的所有相关文件,见第17.18.1节,“InnoDB Backup”。
InnoDB
数据和日志文件在所有具有相同浮点数格式的平台上是二进制兼容的。如果浮点格式不同,但您尚未使用FLOAT
或DOUBLE
数据类型在表中,那么程序相同:简单地复制相关文件。
当您移动或复制文件-per-table .ibd
文件时,数据库目录名称必须在源和目标系统上相同。InnoDB
共享表空间中的表定义包括数据库名称。事务ID和日志序列号也存储在表空间文件中,并且在不同的数据库之间不同。
要将 .ibd
文件和关联表从一个数据库移到另一个数据库,使用RENAME TABLE
语句:
RENAME TABLE db1.tbl_name TO db2.tbl_name;
如果您有一个““clean””备份的 .ibd
文件,可以将其恢复到原始 MySQL 安装中如下所示:
-
表不能已经被删除或截断,因为这样会更改表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
功能不强制执行外键约束。
在这个上下文中,一个““clean””.ibd
文件备份是指满足以下要求的备份:
-
没有未提交的事务对
.ibd
文件进行修改。 -
.ibd
文件中没有未合并的插入缓冲区条目。 -
Purge已经从
.ibd
文件中删除了所有删除标记的索引记录。 -
mysqld已经将
.ibd
文件中的所有修改页面从缓冲池中刷新到文件中。
您可以使用以下方法创建一个“clean”备份.ibd
文件:
-
停止mysqld服务器的所有活动,并提交所有事务。
-
等待
SHOW ENGINE INNODB STATUS
显示数据库中没有活动事务,并且InnoDB
的主要线程状态为Waiting for server activity
。然后,您可以将.ibd
文件复制。
另一种方法是使用 MySQL Enterprise Backup 产品来创建一个干净的.ibd
文件副本:
-
使用 MySQL Enterprise Backup 将
InnoDB
安装备份。 -
在备份中启动第二个mysqld服务器,让它清理备份中的
.ibd
文件。
您可以使用工具,如mysqldump,执行逻辑备份,这将生成一组 SQL 语句,可以执行以重现原始数据库对象定义和表数据,以便在另一个 SQL 服务器上转移。使用这种方法,不管格式是否不同,如果您的表包含浮点数数据也无关紧要。
为了提高该方法的性能,在导入数据时禁用autocommit
。在导入整个表或表段后,执行 commit 操作。