Mysql,innodb使用.ibd文件快速批量恢复数据---批量快速!

总述

本文以linux安装的mysql记录一次恢复数据的过程。
一般情况,如果我们有一个数据库叫做testDB,里面有一张表叫testTable,那么就会在mysql的目录下创建一个叫做testDB的目录,同时在这个目录下,会生成两个文件,testTable.frm和testTable.idb。当然创建表或者增加数据还会修改其它文件,这边不强调这个。
如果这两个文件保留正常的情况下,我们就可以在一个新库里面恢复到之前的表结构以及数据。
恢复数据的前提是需要知道表结构,我自己的在操作的时候,因为知道表结构,手动创建的,所以没有真正执行这一步,不过网上有通过.frm恢复表结构的,可以参考一下,比如:
.frm恢复表结构

然后就可以利用idb文件恢复数据了,当然这个文章也很多,不过都是单表的,表太多的话,那操作起来实在太麻烦了,本文稍微处理了一下,能够快速批量的恢复数据。

前期准备

  1. 需要有正确的frm和idb文件。
  2. 第一步先得创建一个数据库,同时创建一个同名的表以及表结构。如果你很清楚表结构的话,直接跑sql还是非常快的。因为我们这边每个库里面的所有的表都是比较规范,有固定的sql,直接跑一下即可;如果没有的话,可能先得很费劲的恢复表结构。

具体操作

调整innodb的参数

修改/etc/my.cnf文件,增加一个强制恢复相关的参数:
innodb_force_recovery=1
至于什么意思,网上也有不少解释。

让表结构和表空间脱离

执行sql:

alter table testTable discard tablespace;

这个sql会删除testTable.ibd这个文件。

文件拷贝和赋予权限

把备份的ibd文件拷贝进去,
同时执行一下下述命令,赋予一下权限:

chown -R mysql.mysql testTable.ibd
导入表空间

执行sql:

alter table testTable import tablespace

然后你就会发现,数据已经回来了。
到此,大功告成,这4步都是从网上抄来的。

但是问题来了,这才是恢复了一个表呀,表太多了,肯定想批量呀。当然也可以。

批量恢复

上面其实就4步,脱离,拷贝,赋予权限,导入表空间。
因为这4步操作都可以批量执行,因此合起来也就批量执行。

批量执行sql

有了表结构以后,我们就可以知道一个库里面所有的表,不管是脱离还是导入,语句都一样,只不过换了个表名而已,所以我们要批量生成sql就行了,如下:

SELECT concat('alter table ', table_name, ' discard tablespace;')
	FROM information_schema.tables
	WHERE table_schema = 'testDB';
SELECT concat('alter table ', table_name, ' import tablespace;')
	FROM information_schema.tables
	WHERE table_schema = 'testDB';

testDB就是当前数据库的名称。然后结果你就可以拿到所有的sql语句了。
(话说上面这个sql,用处还是非常大的)

批量拷贝

这个太容易了,不说了。

批量赋权

也非常容易

chown -R mysql.mysql *

然后把他们组合起来,一个库,瞬间就恢复了~~~

总结

  1. 恢复表结构非常重要,一旦有些出入的话,很容易出现一些匪夷所思的事情(具体的话,就期待吧~)。
  2. 两个数据库相关的配置,尽可能保持一致,比如一些编码之类的,不然一些数据可能也会有问题。
  3. innodb_force_recovery=1这个配置用完了记得改为0或者删除了,否则也会有问题。
  4. 大量重复的事情,有时候可以想一些批量的操作,简单快捷。
  5. 最关键的问题,什么场景下会用到这个呢?我也不知道。反正我是之前的旧库起不来了,然后折腾半天也起不来了,最后实在放弃了,备份了一下文件,卸载重装了,然后恢复的数据。

猜你喜欢

转载自blog.csdn.net/ywg_1994/article/details/102692017