InnoDB磁盘接口之移动或复制InnoDB表
本节介绍将某些或所有InnoDB表移动或复制 到其他服务器或实例的技术。例如,您可以将整个MySQL实例移至更大,速度更快的服务器上。您可以将整个MySQL实例克隆到新的副本服务器上;您可以将单个表复制到另一个实例以开发和测试应用程序,或复制到数据仓库服务器以生成报告。
在Windows上,InnoDB始终在内部以小写形式存储数据库和表名。要将二进制格式的数据库从Unix移至Windows或从Windows移至Unix,请使用小写名称创建所有数据库和表。一种方便的方法是在创建任何数据库或表之前,将以下行添加到[mysqld]您的my.cnf或my.ini文件的 部分 :
[mysqld]
lower_case_table_names=1
移动或复制InnoDB表的技术包括:
导入表格
可以使用可传输表空间功能从另一个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_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。 - 清除已从
.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在导入数据时禁用 。仅在导入整个表或表的一部分后才执行提交。
更多内容欢迎关注我的个人公众号“韩哥有话说”,100G人工智能学习资料,大量后端学习资料等你来拿。