mysql5.7通过frm和ibd文件恢复表

frm文件存储的是表结构,ibd文件存储的是数据信息。

在docker容器mysql5.7中,首先连接到mysql:

mysql -uroot -p123456

进入到mysql命令行后,创建数据库,数据库引擎为innodb,默认字符集与恢复的表的字符集保持一致:

create database test1 charset=utf8;

use test1;

创建表,表名需要与恢复的表名(frm文件的名称)保持一致,如果知道表中列的个数,直接创建相同数量的列,列名任意,类型任意

例如要恢复的表的列数量为9个,则建表:

create table emp(

i1 int,

i2 int,

i3 int,

i4 int,

i5 int,

i6 int,

i7 int,

i8 int,

i9 int,

primary key(i1)

);

表创建完成后,在对应的数据存储目录中就会生成对应的frm和ibd文件,

如下所示:目录/var/lib/mysql/test1/是mysql5.7数据默认的存储目录

 

 

 然后用要恢复的frm文件覆盖对应的emp.frm,命令如下(docker复制本地的文件到容器指定目录下):

本地(win10)PowerShell窗口中连接到容器:docker exec -it f78429f8ebf3 bash

复制文件: docker cp .\emp.frm  f78429f8ebf3:/var/lib/mysql/test1/emp.frm

重启mysql,然后查看表结构desc emp恢复即可:

 

 

 

如果不知道要恢复的表中列的数量,则先建表:

create table emp(i1 int);

然后修改mysql配置文件,修改方式如下:
1.本地修改后复制到容器内部

2.容器内使用yum安装vim工具:yum install vim,安装完vim后,编辑配置文件,mysql5.7容器内默认的配置文件路径是:/etc/my.cnf

修改内容:

# 配置默认的数据库存储引擎为innodb

default-storage-engine=innodb

#不配置默认为0,配置后会变为只读模式,无法修改表等操作

innodb_force_recovery=6

修改后重启mysql,查看表结构,会报错:table 'test1.emp' doesn't exist

查看日志,找到具体的列数,然后恢复配置文件,重启后重复上面的操作,即可恢复表结构。

注意:建表时如果存在主键要定义主键,否则后续操作可能会报错。

 

根据ibd文件恢复数据:

首先恢复刚才的配置文件,即保证有操作表的权限

取消原来的表空间关联关系:alter table emp discard tablespace;

执行完,原来的emp.ibd文件就会删掉了

复制要恢复的ibd文件到对应的目录下,如图所示:

然后修改emp.ibd文件的所属组:chown mysql:mysql emp.*

重新导入:alter table emp import tablespace;

至此,就可以查询数据了。

参考文档:Mysql5.7利用frm与ibd恢复数据 - 简书 (jianshu.com)

参考文档:推送MySQL数据库报错:Got error 168 from storage engine_HanDxin的博客-CSDN博客

posted on 2022-11-01 16:13  渐行渐远的那些人  阅读(1678)  评论(0编辑  收藏  举报