MySQL通过frm文件和ibd文件恢复数据

有时候可能手误删除了某表,想着能恢复原来的表结构及数据,这时候可以通过之前的frm文件和ibd文件恢复;

frm文件:表的结构信息

ibd文件:表的字段值信息

以上文件默认均在mysql安装目录data文件夹下对应的数据库名文件夹中

第一步:创建同名表(如果连表明都忘记了那就GG了)

net start mysql启动mysql创建同名表,记得字段个数的话就直接创建记得的N个字段,字段名及类型随意,不记得就只创建一个就好;MySQL通过frm文件和ibd文件恢复数据_第1张图片

第二步:覆盖新创建student表的frm文件

覆盖前先停止mysql服务,然后将需要备份的frm文件覆盖到上述student表对应的目录下;

然后修改my.ini配置文件增加此行:innodb_force_recovery = 6;

重启mysql服务,desc student,这时会报错

原因是表字段个数不对,可以通过data文件夹下带有err后缀的日志文件查看会有这么一句报错:

2019-03-07T17:07:30.280644Z 2 [Warning] InnoDB: Table rfid/student contains 1 user defined columns in InnoDB, but 5 columns in MySQL.

即要恢复的表有5个字段,但是你创建的表只有一个字段,这时就要删除student表重新创建了,当然这个要先停止mysql服务,然后把my.ini文件添加的那行(innodb_force_recovery = 6):注释掉,然后重启mysql,删除原先只创建了一个字段的student表,重新创建一个5个字段的student表:

MySQL通过frm文件和ibd文件恢复数据_第2张图片

重复上述操作,停止mysql,覆盖ibm文件,my.ini配置文件放开上述注释掉的那行;然后启动mysql查看student表结构就恢复了:

MySQL通过frm文件和ibd文件恢复数据_第3张图片

但是此时这个表要重新创建,可以通过show create table student 查看创建表语句:

MySQL通过frm文件和ibd文件恢复数据_第4张图片

创建之前先退出mysql,将my.ini中添加的一行注释掉,然后重连mysql复制该创建表语句即可

第三步:恢复表数据

第二步已经恢复表结构了,接下来就是恢复表数据,

在恢复表数据之前,要先将原先的ibd文件与frm文件解绑,执行如下语句:

执行完之后退出mysql,将备份表的ibd文件复制到所创建表的ibd所在文件夹下,然后重连mysql,执行如下语句:

即将student表与备份的ibd文件绑定,然后查看student表即恢复数据了:

在绑定这一步很可能会报错

第一种:Error Code: 1808. Schema mismatch (Table has ROW_TYPE_DYNAMIC row format, .ibd file has ROW_TYPE_COMPACT row format

即两个表的字段格式不符(DYNAMIC表示动态表,即字段类型有varchar这种的),这时可以在建表语句后面加上 ROW_FORMAT=COMPACT重新建表即可

第二种:有的可能看了其他的介绍建表时直接加了这一句结果也报错了:

Schema mismatch (Table has ROW_TYPE_COMPACT row format, .ibd file has ROW_TYPE_DYNAMIC row format.

仔细看看和上述有什么区别,COMPACT和DYNAMIC反过来了,这时你把建表语句中的ROW_FORMAT=COMPACT去掉重新建表即可

MySQL通过frm文件和ibd文件恢复数据_第5张图片

 

你可能感兴趣的:(mysql)