写了七八年的代码,也了解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数据表和数据修复了
评论已关闭!