记录mysql ibd文件误删,服务启动不了的恢复解决过程

阅读228评论1

背景:

因技术人员误删用户表的ibd文件,造成数据库崩溃,无法启动。报错:xxxx.ibd is not find

恢复:

其实问题解决起来不难,难的是你不知道技术人员到底咋操作的,技术也说不清个一二三。

1、尝试恢复ibd文件

数据表是innodb引擎的,还好技术只是删除了idb,frm文件还在。

先通过mysqlfrm或dbsake从frm文件中恢复表结构数据。

在另外一个mysql,这里为了区分,就叫好B服务器(服务器环境最好统一,win都用win,Linux都用Linux)中,创建刚刚恢复的数据表。

然后,关闭停止数据库运行(重要),在B服务器的data数据库文件中找到刚刚创建的数据表的ibd和frm文件。

2、同步文件

将现在服务器上的mysql也停止运行(已停止可以需略)。

把B服务器上的ibd和frm文件都同步上去,现服务器的原frm文件覆盖或删除掉就行。

3、启动mysql

尝试启动mysql,如果启动成功,执行第四步。

我这里没有启动成功,报错:

tablespace id and flags are 2713 and 33, but in the InnoDB data dictionary they are 703 and 33.

space id不一致造成的。修改mysql的配置文件,在mysqld配置中加上

innodb_force_recovery=3

force recovery的参数的区别:

1.(SRV_FORCE_IGNORE_CORRUPT):忽略检查到的corrupt页。

2.(SRV_FORCE_NO_BACKGROUND):阻止主线程的运行,如主线程需要执行full purge操作,会导致crash。

3.(SRV_FORCE_NO_TRX_UNDO):不执行事务回滚操作。

4.(SRV_FORCE_NO_IBUF_MERGE):不执行插入缓冲的合并操作。

5.(SRV_FORCE_NO_UNDO_LOG_SCAN):不查看重做日志,InnoDB存储引擎会将未提交的事务视为已提交。

6.(SRV_FORCE_NO_LOG_REDO):不执行前滚的操作。

一般3就可以启动了,如果还是启动不了,就往上加,直到启动为止。

4、drop table

mysql启动后,进入mysql客户端。

注意,这里不要用phpmyadmin操作,drop会失败!!

登录mysql客户端后,把出错的表drop掉。

恢复mysql的配置,重启即可(这一步不搞也许,看心情吧)。

5、收尾

到上一步就OK了,为了验证mysql恢复如初,保持最干净、纯洁,就多来了这一步(强迫症)。

再次关闭现服务器的mysql,将data文件下的出错表的ibd文件删掉。

这里因为ibd文件不匹配,drop的时候没有删掉,所以手动删一下。

6、验证

再次重启现服务器的mysql,查看数据库是否正常,尝试create出错表,看能否正常create。

create成功,完美解决,恢复如初。


这里写的很简单,实际操作的时候各种问题,因为不知道技术到底如何操作的,恢复表后一直drop不掉,表状态显示使用中

后来还找了一位高手来帮忙,也是同样的问题。。。

因为一直在phpmyadmin中操作的,不知道咋想的,就用客户端试试吧,一试操作OK了(●ˇ∀ˇ●)

这里给大家一点忠告:

  1. 遇到不知道的文件、不认识的文件千万不要乱删!!!

  2. 直接操作数据库文件,请先关闭数据库!!!

  3. 不懂别乱动!!!

1 位网友评论:

罗迪 4月前(2023-12-25 20:02:37)

哈哈哈哈

欢迎来评论

暂不支持评论