修复innodb表结构,并从.ibd文件中恢复数据

原创 zhaoliang  2015-12-27 23:14  阅读 1,940 views 次

写了七八年的代码,也了解MySQL数据表易损坏,但自己却一直没有碰到过类似案例,这次新做了三四个月的小项目,赶上了。

项目是在ecshop基础上二次开发的,原胡的数据表结构基本未变,也依然采用的是MyISAM存储引擎。损坏的几张表是后期扩展的几个功能表,存储引擎全部使用的innodb格式。出问题时发现基本上所有的innodb表都损坏了,用工具可以看到表名,但是打不开,也看不到数据表的结构信息,提示数据表不存在,可视觉上明明又能看得到那些张数据表。

度娘了一些资料,经过几轮测试之后,终于把数据表修复并找回了原有的数据,具体步骤如下:

一、找回数据表的结构信息

a.为防止操作失误,新建一个临时数据库;

b.创建一张表,表名与损坏的数据表名完全一致,数据表的属性随意创建一个即可;

c.停掉mysql服务;

d.到损坏的数据库中找到对应表的.frm文件,用它覆盖掉前面创建的数据表frm文件;

e.启动mysql;

这时应该就能看到原来的数据表结构了。建议另找一台机器做此操作,毕竟恢复过程中,需要停止数据库服务,尽可能降低对运转正常的功能模块的影响。

我这次恢复表结构时,就是将线上linux环境下的frm拖至本地的windows环境来恢复的。

二、恢复数据

前面已经找回数据表的结构了,下面就需要恢复原有的数据信息了。

a.在新建的数据库中将当前数据表的表空间废除掉:ALTER TABLE 数据表名 DISCARD TABLESPACE;

b.把正式环境中损坏数据表对应的.ibd文件移到临时数据库文件夹内,(如果该操作是linux下操作,注意变更.ibd文件的用户组和用户为数据库对应的用户组和用户);

c.把损坏的ibd数据文件与数据表结构frm文件重新建立关系:ALTER TABLE 数据表名 IMPORT TABLESPACE;

d.确定临时数据库中的数据表已经恢复了,将正式环境下的损坏表的frm和ibd文件删掉,然后把临时数据库中的数据表复制过去即可

如此重复操作多次,终于把几张损坏的innodb数据表和数据修复了

本文地址:http://blog.58cm.cn:8088/archives/176.html
版权声明:本文为原创文章,版权归 zhaoliang 所有,欢迎分享本文,转载请保留出处!
NEXT:已经是最新一篇了

评论已关闭!