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博客