有时候可能手误删除了某表,想着能恢复原来的表结构及数据,这时候可以通过之前的frm文件和ibd文件恢复;
frm文件:表的结构信息
ibd文件:表的字段值信息
以上文件默认均在mysql安装目录data文件夹下对应的数据库名文件夹中
第一步:创建同名表(如果连表明都忘记了那就GG了)
net start mysql启动mysql创建同名表,记得字段个数的话就直接创建记得的N个字段,字段名及类型随意,不记得就只创建一个就好;
第二步:覆盖新创建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,覆盖ibm文件,my.ini配置文件放开上述注释掉的那行;然后启动mysql查看student表结构就恢复了:
但是此时这个表要重新创建,可以通过show create table student 查看创建表语句:
创建之前先退出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去掉重新建表即可