暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mysql之.frm文件和.ibd格式的数据库文件恢复

Linux运维人 2021-09-15
1534

近期拿到一个数据库备份文件,根据要求需要恢复,看格式是.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运行进程一样的属主,不然最后关联的时候会报错导致关联不成功



文章转载自Linux运维人,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论