mysql数据库ibdata1损坏时的数据恢复
2111
发布于 云南 2022-11-15 · 1.0w浏览 1回复 4赞

最近遇到个问题,有个mysql数据库使用“show tables”命令时可以正常显示表名,但是查询表数据的时候却提示表不存在。数据库使用的存储引擎是innodb,检查数据库文件发现所有表的frm文件和ibd文件都在。后经排查发现应该是ibdata1文件损坏导致的,由于表数据文件都在,数据应该没丢,只是无法读取而已,下面开始恢复。

步骤一:把整个数据库data目录备份一份,防止后续操作造成数据丢失。

步骤二:启动mysql,如果无法启动则需删除ibdata1和ib_logfile0和ib_logfile1再启动。

步骤三:新建一个库,名字随便,按需要恢复的数据库里的表名来新建表,如果有表结构可以直接按照原有表结构建表,如果没有表结构可以使用mysql-utilities中的mysql工具来读取原有表的frm文件以获取表结构。又或者按照需要恢复的表的字段数随便新建同名的表,然后停止mysql,把原来那个表的frm文件覆盖到新建的库,在mysql配置文件中[mysqld]下面添加“innodb_force_recovery = 6”,再重启数据库,表结构就回来了。

步骤四:mysql命令行下执行“alter table 表名 discard tablespace”,解除表数据和表结构绑定,执行完后,.ibd文件会删除。(这里如果提示:"Cannot delete or update a parent row: a foreign key constraint fails",则关闭外键约束,就可以了:“SET FOREIGN_KEY_CHECKS=0;”, 操作完成后,重新开启外键约束:“SET FOREIGN_KEY_CHECKS=1;”)

步骤五:停止mysql,把原库的ibd文件拷到当前库。

步骤六:启动mysql,命令行下执行“alter table 表名 import tablespace”,绑定表结构和表数据,然后就可以查询表数据了。

步骤七:按照步骤四到六依次处理其他表即可恢复所有数据。

另外,如果数据库使用的是myisam引擎,ibdata1损坏不会影响数据库数据。

2111
~
浏览 1.0w
4
相关推荐
最新评论 1
赞过的人 4
评论加载中...

暂无评论,快来评论吧!