移动或复制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
表的技术包括:
- 导入表格
- MySQL企业备份
- 复制数据文件(冷备份方法)
- 从逻辑备份还原
导入表格
可以使用可传输表空间功能从另一个MySQL服务器实例或备份中导入每表文件表空间中的表。请参见“导入InnoDB表”。
MySQL企业备份
MySQL Enterprise Backup产品使您可以在不影响操作的情况下备份正在运行的MySQL数据库,同时生成一致的数据库快照。当MySQL企业备份复制表时,读写可以继续。另外,MySQL Enterprise Backup可以创建压缩的备份文件,并备份表的子集。结合MySQL二进制日志,您可以执行时间点恢复。MySQL Enterprise Backup是MySQL Enterprise订阅的一部分。
有关MySQL企业备份的更多详细信息,请参见“ MySQL企业备份概述”。
复制数据文件(冷备份方法)
您InnoDB
只需复制“ InnoDB备份”中“冷备份”下列出的所有相关文件,即可移动数据库。
InnoDB
数据和日志文件在具有相同浮点数格式的所有平台上都是二进制兼容的。如果浮点格式不同,但是您尚未使用表中的数据类型,FLOAT
或者DOUBLE
您的表中没有数据类型,则过程相同:只需复制相关文件。
移动或复制每表.ibd
文件时,数据库目录名称在源系统和目标系统上必须相同。存储在InnoDB
共享表空间中的表定义包括数据库名称。表空间文件中存储的事务ID和日志序列号在数据库之间也有所不同。
要将.ibd
文件和关联的表从一个数据库移动到另一个数据库,请使用以下RENAME TABLE
语句:
RENAME TABLE db1.tbl_nameTO db2.tbl_name;
如果您有文件的“干净”备份.ibd
,则可以将其还原到其原始来源的MySQL安装中,如下所示:
- 自复制
.ibd
文件以来,该表一定不能删除或截断,因为这样做会更改存储在表空间中的表ID。 发出以下
ALTER TABLE
语句以删除当前.ibd
文件:ALTER TABLE tbl_nameDISCARD TABLESPACE ;- 将备份
.ibd
文件复制到正确的数据库目录。 发出以下
ALTER TABLE
语句,告诉InnoDB
您将新.ibd
文件用于表:ALTER TABLE tbl_nameIMPORT TABLESPACE ;注意
该
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企业备份来备份
InnoDB
安装。 - 在备份上启动第二台mysqld服务器,并让其清理备份中的
.ibd
文件。
从逻辑备份还原
您可以使用诸如mysqldump之类的实用程序执行逻辑备份,该实用程序将生成一组SQL语句,可以执行这些语句以重现原始数据库对象定义和表数据,以将其传输到另一个SQL Server。使用此方法,格式是否不同或表是否包含浮点数据都没有关系。
为了提高此方法的性能,请autocommit
在导入数据时禁用。仅在导入整个表或表的一部分后才执行提交。