近期拿到一个数据库备份文件,根据要求需要恢复,看格式是.frm和ibd格式的文件。按照普通的数据库恢复方式恢复这种格式的数据库,恢复后会提示表不存在,即明明看到表在的,可是却打不开,更不用说里面的数据了,因为表结构已经损坏。那么如何恢复此类数据呢,今天就来说说恢复方案
一.确定表字段数
1.
首先需要确定恢复的表的字段,首先简单的创建一个与需要恢复的数据表同名的表,比如需要恢复的是t_user表,那么可以创建一个t_user表,字段无所谓,如下:
create table t_user(id int);
2.
创建表后,关闭mysql服务并修改mysql配置文件my.cnf,添加参数"innodb_force_recovery = 6"
使用需要恢复的表的.frm文件覆盖创建的t_user表的.frm文件,比如覆盖test库中的t_user表
cp tmp/t_user.frm data/mysql/data/test/t_user.frm
3.启动mysql服务并查看表结构
desc t_user;
此时如果字段不对,会提示t_user表不存在,通过查看mysql错误日志可以看到t_user表有多少个字段
二.恢复表结构
通过一确定需要恢复表的字段,假设有5个字段
1.删除之前建的t_user表
关闭mysql服务,注释innodb_force_recovery = 6
即修改"innodb_force_recovery = 6"为"#innodb_force_recovery = 6"
重启mysql服务
删除原有的t_user表
drop table t_user
2.创建相同字段的t_user表,字段还是随便取,此处应该是5个字段
create table t_user(id1 int,id2 int,id3 int,id4 int,id5 int);
3.重复上述"一.确定表字段数"中的第2和3步骤,即可查看需要恢复表的表结构,借助工具Navicat复制出建表语句
三.恢复表数据
1.重复二.1当中的操作删除刚才建的表。删除原有的t_user表,
2.使用恢复后的sql建表语句建表(注意在建表语句末尾加个ROW_FORMAT=COMPACT;)
3.解除原有的ibd和.frm文件的绑定关系
alter table t_user discard tablespace;
4.关闭mysql服务.使用需要恢复的ibd文件覆盖原有的ibd文件
cp tmp/t_user.ibd data/mysql/data/test/t_user.ibd
chown -R mysql. /data/mysql/data/test/t_user.ibd
5.后启动mysql服务,使新的.frm文件和.ibd文件关联
alter table t_user import tablespace;
到此可查看已经恢复的数据,此方法操作看起来很简单,就是步骤比较繁琐,容易遗漏,特别最后复制ibd文件这一步,需要将ibd文件属主改成mysql运行进程一样的属主,不然最后关联的时候会报错导致关联不成功




