admin管理员组文章数量:1583042
恢复前提
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.* 恢复
版权声明:本文标题:MySQL根据idb文件恢复数据 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1726034758a1052800.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论