记录mysql ibd文件误删,服务启动不了的恢复解决过程
背景:
因技术人员误删用户表的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 位网友评论:
罗迪 11月前(2023-12-25 20:02:37)
哈哈哈哈