MySQL中怎么备份恢复单个innodb表

MySQL中怎么备份恢复单个innodb表,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

创新互联为企业级客户提高一站式互联网+设计服务,主要包括成都网站建设、网站设计、app软件开发小程序设计、宣传片制作、LOGO设计等,帮助客户快速提升营销能力和企业形象,创新互联各部门都有经验丰富的经验,可以确保每一个作品的质量和创作周期,同时每年都有很多新员工加入,为我们带来大量新的创意。 

使用限制和说明

innodb_file_per_table必须设置为on,在 MySQL5.6.6版本默认是开启的。居留在共享系统表空间的表不能静默。

当表静默时,只有只读事务被允许。

当导入表空间时,页面大小必须与导入实例的页面大小相符合。

DISCARD TABLESPACE 不支持分区表,也就意味着transportable tablespaces 也不支持分区表。如果在分区表上执行ALTER TABLE ... DISCARD TABLESPACE 将会返回下面的错误信息:ERROR 1031 (HY000): Table storage engine for 'part' doesn't have this option.

当foreign_key_checks=1时,DISCARD TABLESPACE 不支持主键外键约束关系。操作这些表时需要设置为foreign_key_checks。

ALTER TABLE ... IMPORT TABLESPACE 不强制外键约束。如果表之间有外键约束,所有的表应该在同一个时间点被导出。

ALTER TABLE ... IMPORT TABLESPACE 导入表空间不要求.cfg元数据文件。然而在导入时缺少了.cfg文件元数据检查就无法完成,或返回下面的信息:InnoDB: IO Read error: (2, No such file or directory) Error opening '.\test\t.cfg', will attempt to import without schema verification 1 row in set (0.00 sec) 。

当没有不匹配的表结构时,导入没有.cfg文件可能会更方便。此外,在元数据不能从.ibd文件中收集的故障恢复时,导入没有.cfg可能更有用的。

导出导入的MySQL版本需要相同。否则,文件必须要在导入的服务器上创建。

在复制架构中,主和从必须设置innodb_file_per_table=1。

在windows中,文件是不区分大小写的,而Linux和unix是区分大小写的,在跨平台导入导出时,需要设置lower_case_table_names=1。

将表空间复制到另一台上

此过程将演示如何从一个运行的MySQL服务器实例上将表空间复制到另一台上。假设源实例为server_A,目的实例为server_B。

在server_A上

mysql> use test;

mysql> CREATE TABLE ttlsa(id INT) engine=InnoDB;

在server_B上

mysql> use test;

mysql> CREATE TABLE ttlsa(id INT) engine=InnoDB;

在server_B上

放弃现有的表空间。在表空间导入前,InnoDB必须丢弃已连接到接受表的表空间。

1mysql> ALTER TABLE ttlsa DISCARD TABLESPACE;

在server_A上

执行FLUSH TABLES ... FOR EXPORT语句静默表并生成.cfg元数据文件。FLUSH TABLES ... FOR EXPORT 这个执行之后,会话不能退出,否则cfg自动消失。

mysql> use test;

mysql> FLUSH TABLES ttlsa FOR EXPORT;

文件.cfg创建在InnoDB数据目录。

在server_A上

复制.ibd和.cfg文件到server_B上;

shell> scp /path/to/datadir/test/ttlsa.{ibd,cfg} destination-server:/path/to/datadir/test

文件.ibd和.cfg必须在释放共享锁之前复制。

在server_A上

释放FLUSH TABLES ... FOR EXPORT语句锁

mysql> use test;

mysql> UNLOCK TABLES;

在server_B上

导入表空间

mysql> use test;

mysql> ALTER TABLE ttlsa IMPORT TABLESPACE;

Transportable Tablespace 内幕

以下说明在表空间传输过程中的内部和错误日志信息。

当在server_B上执行ALTER TABLE ... DISCARD TABLESPACE

该表锁定在X模式下;

表空间从该表分离;

当在server_A上执行FLUSH TABLES ... FOR EXPORT

表锁定在共享模式下;

purge coordinator 线程停止;

脏页被同步到磁盘上;

表元数据写入到二进制.cfg文件中;

日志信息如下:

[Note] InnoDB: Sync to disk of '"test"."ttlsa"' started.

[Note] InnoDB: Stopping purge

[Note] InnoDB: Writing table metadata to './test/ttlsa.cfg'

[Note] InnoDB: Table '"test"."ttlsa"' flushed to disk

当在server_A上执行UNLOCK TABLES

二进制.cfg文件将删除;

共享锁将释放,purge coordinator 线程将重启;

日志信息如下:

[Note] InnoDB: Deleting the meta-data file './test/ttlsa.cfg'

[Note] InnoDB: Resuming purge

当在server_B上执行ALTER TABLE ... IMPORT TABLESPACE

每个表空间页面将检查损坏;

每个空间ID和日志序号(LSN)将更新;

标志有效的和LSN更新头页;

Btree页将更新;

页面状态被设置为脏将被写入到磁盘;

日志信息如下:

[Note] InnoDB: Importing tablespace for table 'test/ttlsa' that was exported from host 'ubuntu'

[Note] InnoDB: Phase I - Update all pages

[Note] InnoDB: Sync to disk

[Note] InnoDB: Sync to disk - done!

[Note] InnoDB: Phase III - Flush changes to disk

[Note] InnoDB: Phase IV - Flush complete

看完上述内容,你们掌握MySQL中怎么备份恢复单个innodb表的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读!


分享标题:MySQL中怎么备份恢复单个innodb表
文章URL:http://hbruida.cn/article/pdipji.html