MySQL数据恢复(通过.frm和.idb文件)

转载自:https://www.2cto.com/database/201709/683413.html

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

整个恢复过程其实可以总结为下面几步:

一:无表数据结构

(1):恢复表结构

(2):复制出来创建表的sql语句

(3):恢复表数据(在恢复表数据的时候,首先需要解除当前创建的表与默认生成的.ibd文件间的关系,接着将要恢复数据表的.ibd文件与当前创建的表联系起来即可)

恢复表结构

首先创建一个数据库,可以通过navicat来创建,创建截图为:

这里写图片描述
使用当前创建的数据库:use wangyi 随意创建一张表,但是这张表的名字要和你要恢复的.frm或者.ibd一致,在此我的.frm与.ibd文件为songlyric.frm与songlyric.ibd因此我的创建表语句为:

create table songlyric(id int); 在执行上面的创建表语句之后,使用net stop mysql关闭数据库服务,然后用需要恢复的songlyric.frm覆盖这个新建的wangyi数据库的songlyric表的物理文件songlyric.frm,接着对配置文件(my.ini)设置innodb_force_recovery = 6,然后使用net start mysql启动服务,接着使用:desc songlyric查看该表结构,会出现下面错误信息:

这里写图片描述

针对这个问题,我们可以通过查看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查看该表结构,输出下面结果表示恢复表结构成功:

这里写图片描述
复制创建songlyric表的语句,我们需要通过创建表的语句重新创建表,当然在创建表之前需要将已经创建好的songlyric删除掉,具体获取创建表的语句可以通过navicat来实现,在navicat中选中songlyric表,右键对象信息,出现下面截图信息,选中DDL,里面的内容就是我们创建songlyric表的sql语句了:
这里写图片描述

接着在控制台执行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;

恢复表数据

恢复表数据需要首先将原先的.ibd文件与原先的.frm文件解除绑定,具体就是在控制台执行下面命令:

alter table songlyric discard tablespace; 接着执行net stop mysql停掉服务,将需要恢复的songlyric.ibd文件覆盖这个新建的wangyi数据库的songlyric表的物理文件songlyric.ibd,执行net start mysql开启服务。 将复制过来的songlyric.ibd文件与songlyric.frm文件发生联系。具体执行下面命令:

alter table songlyric import tablespace; 这时候通过navicat查看数据表,你会发现数据已经成功恢复啦啦啦。

这里写图片描述





二:有数据结构的只需要

通过

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;

恢复表数据

恢复表数据需要首先将原先的.ibd文件与原先的.frm文件解除绑定,具体就是在控制台执行下面命令:

alter table songlyric discard tablespace; 接着执行net stop mysql停掉服务,将需要恢复的songlyric.ibd文件覆盖这个新建的wangyi数据库的songlyric表的物理文件songlyric.ibd,执行net start mysql开启服务。 将复制过来的songlyric.ibd文件与songlyric.frm文件发生联系。具体执行下面命令:

alter table songlyric import tablespace; 这时候通过navicat查看数据表,你会发现数据已经成功恢复啦啦啦。





转载自:https://www.2cto.com/database/201709/683413.html
  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值