mysql5.6(根据.ibd,.frm文件)恢复单表数据

前提:
有数据被删表的.ibd文件,可以从数据库的备份文件中解压出来。然后我虚拟机上的mysql是5.6版本,看了下自己本地电脑上mysql5.5的data里貌似没有.ibd文件

步骤:
1、进入Linux虚拟机,使用service mysql stop停止mysql服务,在mysql的my.cnf下添加innodb_force_recovery=1 ,启动mysql服务

[root@localhost ~]# service mysql stop   --停止mysql
[root@localhost mysql]# cd /usr/local/mysql  --进入mysql目录
[root@localhost mysql]# vim my.cnf    --编辑my.cnf文件

在[mysqld]下添加如下两行

innodb_force_recovery=1 #可以设置1-6
innodb_purge_thread=0   #如果上边的配置值大于1,此处就要设置为0,  否则就会出
                       # 现InnoDB: Waiting for the background threads to start的错误.

2、service mysql start启动数据库,使用数据库连接工具(我用的navcat数据库工具)在虚拟机上新建一个同名同编码格式的数据库,将需恢复的表的结构生成 .sql文件,在虚拟机的同名数据库中运行,就有了和原来同结构的表了。(表结构必须相同)

3、将原先的.ibd文件与原先的.frm文件解除绑定

 alter table XXX(需要恢复数据的表名) discard tablespace;

4、Linux进入mysql的data文件夹下,找到对应数据库文件夹,删除需要恢复表的ibd文件(非备份的)

5、把表的 .ibd(备份的)放到第四步删除ibd的地方

6、修改ibd文件权限,执行alter table tb import tablespace;

[root@localhost ~]# chmod 777   ibd文件  --给ibd文件授权
alter table XXX(需要恢复数据的表名) import tablespace;

之后刷新数据库,看到数据就成功了
注意:记得把第一步的 innodb_force_recovery=1 那两句改回来,以免后续正常操作报错


碰到的坑:
别的资料在第3步后,可能有写关闭mysql,拷完ibd后再启动mysql,但我尝试过不行(可能和mysql版本相关,没具体研究),而且在执行完第三步后用service mysql start重启mysql时,会出现启动mysql失败,按照报错信息查资料没有解决,然后reboot重启虚拟机后开启mysql就可以正常连接

参考文章:https://www.cnblogs.com/hankyoon/p/5667884.html

你可能感兴趣的:(mysql)