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

向大家分享下mysql通过.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://blog.csdn.net/Sonny_alice/article/details/80198200

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

使用新浪微博登陆