mysql根据.frm和.ibd文件恢复表结构和数据

今天吐血向大家分享下mysql通过.frm和.ibd文件恢复数据的方法,因为之前电脑换系统的原因,忘记备份数据库,最后只能通过恢复工具找到数据库的.frm和.ibd文件,至于这两类文件,可以通过winhex软件查看,该软件的破解版传送门:http://download.csdn.net/download/hzw19920329/9987735,为了恢复数据,今天踩了不少坑,下面把我成功恢复的过程分享给大家;

整个恢复过程其实可以总结为下面几步:
(1):恢复表结构
(2):复制出来创建表的sql语句
(3):恢复表数据(在恢复表数据的时候,首先需要解除当前创建的表与默认生成的.ibd文件间的关系,接着将要恢复数据表的.ibd文件与当前创建的表联系起来即可)


恢复表结构

  1. 首先创建一个数据库,可以通过navicat来创建,创建截图为:
    mysql根据.frm和.ibd文件恢复表结构和数据_第1张图片
  2. 使用当前创建的数据库:use wangyi
  3. 随意创建一张表,但是这张表的名字要和你要恢复的.frm或者.ibd一致,在此我的.frm与.ibd文件为songlyric.frm与songlyric.ibd因此我的创建表语句为:
    create table songlyric(id int);
  4. 在执行上面的创建表语句之后,使用net stop mysql关闭数据库服务,然后用需要恢复的songlyric.frm覆盖这个新建的wangyi数据库的songlyric表的物理文件songlyric.frm,接着对配置文件(my.ini)设置innodb_force_recovery = 6,然后使用net start mysql启动服务,接着使用:desc songlyric查看该表结构,会出现下面错误信息:
  5. mysql根据.frm和.ibd文件恢复表结构和数据_第2张图片
    针对这个问题,我们可以通过查看mysql的日志文件来解决,查看mysql安装目录下的data文件夹里面.err结尾的文件,你会发现出现下面所示的错误信息:[Warning] InnoDB: Table wangyi/songlyric contains 1 user defined columns in InnoDB, but 6 columns in MySQL.原来是因为,我们要恢复的表有6个字段,而我们在创建表的时候只创建了1个字段。
    解决方案:删除songlyric表重新创建一个包含6个字段的表,具体这6个字段是什么不用管的。具体执行过程为使用net stop mysql停掉服务,然后在配置文件my.ini中将innodb_force_recovery = 6注释掉(#或;均可),再net start mysql启动服务。接着在控制台先执行drop table songlyric;删除表,再执行创建表语句,我执行的是下面的创建表语句:create table songlyric(id int,id1 int,id2 int,id3 int,id4 int,id5 int);
    紧接着按照前面的方式,使用net stop mysql关闭数据库服务,然后用需要恢复的songlyric.frm覆盖这个新建的wangyi数据库的songlyric表的物理文件songlyric.frm,接着对配置文件(my.ini)设置innodb_force_recovery = 6,然后使用net start mysql启动服务,接着使用:desc songlyric查看该表结构,输出下面结果表示恢复表结构成功:
    mysql根据.frm和.ibd文件恢复表结构和数据_第3张图片
  6. 复制创建songlyric表的语句,我们需要通过创建表的语句重新创建表,当然在创建表之前需要将已经创建好的songlyric删除掉,具体获取创建表的语句可以通过navicat来实现,在navicat中选中songlyric表,右键对象信息,出现下面截图信息,选中DDL,里面的内容就是我们创建songlyric表的sql语句了:
    mysql根据.frm和.ibd文件恢复表结构和数据_第4张图片
    接着在控制台执行drop table songlyric;删除songlyric表,当然在执行删除songlyric命令之前,还需要将my.ini中的innodb_force_recovery = 6删除或者注释掉。接着执行下面命令重新创建表即可:
    CREATE TABLE songlyric (
    date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    lyricBefore text,
    lyricAfter text,
    isTraverse tinyint(1) DEFAULT NULL,
    id int(8) NOT NULL AUTO_INCREMENT,
    songUnique varchar(100) DEFAULT NULL,
    PRIMARY KEY (id),
    UNIQUE KEY songUnique (songUnique)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
    可以看到和之前通过navicat查看得到的创建表的sql语句相比,末尾多了ROW_FORMAT=COMPACT;

恢复表数据

  1. 恢复表数据需要首先将原先的.ibd文件与原先的.frm文件解除绑定,具体就是在控制台执行下面命令:
    alter table songlyric discard tablespace;
  2. 接着执行net stop mysql停掉服务,将需要恢复的songlyric.ibd文件覆盖这个新建的wangyi数据库的songlyric表的物理文件songlyric.ibd,执行net start mysql开启服务。
  3. 将复制过来的songlyric.ibd文件与songlyric.frm文件发生联系。具体执行下面命令:
    alter table songlyric import tablespace;
  4. 这时候通过navicat查看数据表,你会发现数据已经成功恢复啦啦啦。
    mysql根据.frm和.ibd文件恢复表结构和数据_第5张图片

参考文献

  • http://blog.csdn.net/hi__study/article/details/53489672
  • http://www.linuxidc.com/Linux/2016-07/133149.htm
  • http://blog.csdn.net/u012887385/article/details/54406712

你可能感兴趣的:(错误解决)