事先准备:
1.准备MySQL数据库:版本5,7
2.准备需要回复的表的 frm和ibd文件 我的是user.frm 和user.ibd
恢复步骤:
一、恢复表结构:
- 建同名表,随便写一个字段就行
create table user(id int);
-
将新建的表的user.frm 和user.ibd进行备份,我备份到了/tmp目录下,并将user.frm替换需要恢复的user.frm
-
配置MySQL的配置文件,添加
innodb_force_recovery = 6
重启MySQL
(此配置在表结构不对时,MySQL仍能启动,但是删除表和创建表时必须注释或删除此配置) -
进入数据库,然后查看表结构
desc user;
会报错:Table ‘test.user’ doesn’t exist
不用担心,然后查看MySQL error日志,与我是docker启动的,错误日志用 docker logs mysql --tail 200
查看,显示结果有有两列:
- 删除user表
将user.frm替换为备份在/tmp的user.frm
注释配置文件中的:innodb_force_recovery = 6
重启MySQL
drop table user;
- 新建user表,字段个数为错误日中的个数,类型随意:
create table user (id int,id2 int);
备份新生成的user.frm和user.ibd到/tmp目录,强制替换掉原来备份的
8. 将user.frm文件替换为需要恢复的user.frm文件
9. 查看创建表的语句并拷贝到本地文件中;
show create table user;
10.去掉注释的innodb_force_recovery = 6
,将user.frm 和user.ibd替换为/tmp目录下的。
进入MySQL,删掉表
drop table user;
二、恢复表数据
- 使用拷贝下来的创建表语句建表
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
- 删除表空间,也就是解除frm和ibd的关系
alter table user discard tablespace;
- 将user.frm 和user.ibd 替换需要恢复的文件
并改变文件权限
chown -R mysql:mysql user.frm user.ibd
- 绑定数据表.frm和数据.idb的关系。
alter table user import tablespace;