最近遇到个问题,有个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损坏不会影响数据库数据。
暂无评论,快来评论吧!