MySQL根据idb文件恢复数据

恢复前提

MySQL 5.* 和 8.* 的恢复方式大同小异,最基本的区别是8.* 中,不再有表结构frm文件,所以要恢复 8.* 的数据,就必须要有完整的建表语句。
而恢复 5.* 的数据,就需要idb文件和 frm文件,当然,如果有完整的建表语句的话,不用frm文件也行。
数据库的字符编码要一致,不然中文会乱码。

恢复步骤

需要注意的是,以下操作需要选定数据库后执行。

5.*

恢复表结构

确定表列数

首先创建一张 与需要恢复数据的表 的名字相同的新表,如果已知原表的字段数量的话,就按照原表字段数建表,字段名和类型都不用考虑,如果不知道数量的话,就随意建表。

create table temp_1(id int);

然后进入停止mysql,进入mysql的数据存放目录,找到对应的库文件夹,可以看到有刚刚创建temp_1.frm文件,用原表的frm文件覆盖它。
接着再去改mysql的配置文件,my.ini,加入或更改如下配置,使mysql启动时不检查,进而强制启动mysql

innodb_force_recovery = 6

再次启动mysql,查看表结构信息

desc temp_1;

由于表字段数量不对应,此操作会报错:
在这里插入图片描述

这时,可以去mysql 的data文件夹下,找到err后缀的文件,查看错误日志:
在这里插入图片描述
大致的意思是,在缓存中未找到temp_1的数据,尝试加载idb文件;
temp_1表中包含了1个用户定义列,但实际却有14个列存在表结构文件中。

获取建表语句

这时,我们就知道了原表的列数了。
因为mysql被启动为了只读模式,需要停止mysql,再去修改my.ini,把之前新加入的配置注释了,再次启动mysql。
删掉此时新建的temp_1表:

drop table temp_1;

需要去相应目录中删除temp_1相关文件。删除之后,也无法直接再次建表,建表:

create table temp_1(a0 int,a1 int,a2 int,a3 int,a4 int,a5 int,a6 int,a7 int,a8 int,a9 int,b1 int,b2 int,b3 int,b4 int);

建表后,再次停止mysql,重新修改配置文件。
重新覆盖frm文件。
再次启动mysql。
再次desc该表,可以看到原表的表结构了。

在这里插入图片描述

现在仅仅是可以查看表结构了,但此表数据结构还未与mysql真正关联,所以现在要根据此表结构,重新使用建表语句建表,让mysql能够管理此表。
可以使用如下命令查看建表语句,拷贝出来后,删除此表,重新使用此语句建表:

show create table temp_1 ;

得到结果如下:
在这里插入图片描述
拷贝,停止mysql,恢复配置,启动mysql,删表,执行建表语句后,完成表结构的恢复。

数据恢复

解除当前表与当前idb文件的关联

alter table temp_1 discard tablespace;

将原表的idb文件拷贝进数据目录中,关联idb文件

alter table temp_1 import tablespace;

成功恢复数据
在这里插入图片描述

8.*

mysql 8 不再保有frm文件,所以恢复数据时,需要建表语句的支持。

同版本 5 一样,建表后,取消现idb文件的关联

alter table temp_1 discard tablespace;

拷贝原idb文件进入目录中,再重新关联

alter table temp_1 import tablespace;

借鉴参考

mysql 5.* 恢复

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值