mysql .frm文件丢失_【1.1】mysql frm文件丢失(ibd文件丢失)

本文介绍了MySQL中.InnoDB存储引擎的表.FRM文件丢失后,如何模拟故障、彻底删除表以及恢复表的方法。通过覆盖.FRM文件、释放和导入表空间等方式,详细展示了恢复过程及注意事项,同时探讨了直接替换.IBD文件和未建表时导入的可行性。
摘要由CSDN通过智能技术生成

【1】故障模拟准备环境

这里以innodb为例

【1.1】配置参数

开启独立表空间 innodb_file_per_table;

【1.2】构建测试数据

create databasetest;create table a(id int,num int);insert into a values(1,11),(2,12);

5e1b8dc4459a3549af822b00d67c594b.png

【2】故障模拟

【2.1】在业务正在运行的情况下,手动删除 test库 下的 a.frm

acc92ecaf649017f9a6f131a7efe9e9d.png

【2.2】删除完之后,会发生什么?

17fa686137eaffc6b9403aaf49e799c0.png

在没有执行drop table的时候,还是可以查询表,查看表结构的,执行后,就查不到了。

4fa171cfa43bf27dcfba1862c71899c0.png

如上图所示可知(在业务还在跑的情况下):

无论是对于数据表的增删查改,还是数据结构的增删查改。统统失效,连 information_schema.columns 都查不到(是因为执行了drop table,虽然报错了,但是把数据字典系统表里的相关信息还是删除了)。

【3】如何彻底删除这个表

df2e9f76b46f2dfde5f8a93c7feddc3a.png

【3.1】保留这个表数据(要是真不想要了,这步也可以不用做)

cp a.ibd a_bak.ibd

【3.2】随便找个其他表的frm文件重命名成故障表的frm文件

cp test1.frm a.frm

【3.3】加上权限,如下图可以发现是root创建的

chown -R mysql:mysql /data/mysql

【3.4】查看表与表结构,然后删除表

07f7422aa293349122bb98e0c4b9f46a.png

我们可以发现已经有了,但很明显,表结构不是我们a表的结构,而是test1表结构。弄好了之后,发现我们可以删除表了!

【3.5】如果用了其他表的表结构替换会发生什么?

对B表进行了同样的操作;B表与A表代码一样。

用test1表的frm 覆盖并重命名成  b表的frm之后,查询b表居然显示的是 test1表的数据!!

c815cd89dcdd8e2c03fcc5e096686c2a.png

1f445bc4406b0869ed3b3fd8a36cc30a.png

b.frm 加上之后,删除表后 ,这个名称就可以重建了。

【4】恢复使用

故障前提,操作完【1】【2】

【4.1】直接在test1库恢复a表

(0)去test1库构建相同名称表

use test1;

create table a(id int,num int);

如何获取表结构?只能desc,information_schem,binlog里看看有没有,最靠谱的当然是去备份里找。

直接在test1库恢复a表。

(1)备份frm,把我们原始的 失去frm 对应idb的文件拷贝过来

47f068a0398fe487dc9e9bfdac91a937.png

(2)释放表空间

alter table a discard tablespace;

如下图所示,释放表空间,只是把idb数据清空了,frm表结构文件还在。

efdcd634702bdcf930246ff73b5f620c.png

3baaea4690a0049a08a4fb9340f5f55a.png

(3)把我们要恢复的ibd文件,重命名成a.ibd

一定要记得,权限问题;

1b01c518e9c5fba25bcc492b929548f1.png

(4)重新导入表空间

alter table a import tablespace;

7fe0c710ace42923902841c741ca6acc.png

至此搞定;

【4.2】在原库恢复

故障前提,操作完【1】【2】

(1)备份

cp -r a.ibd a_bak.ibd

(2)随便找个表frm 复制重命名成 a.frm,删除表

复制前,删除表

60a9b40beca4de783be75084dc38913d.png

cp -r test1.frm a.frm

chown -R mysql:mysql /data/mysql

复制后,删除表

e7848d980a0358a3349d88552cab2355.png

(3)重建表结构相同的a表

create table a(id int,num int);

-- 如何获取表结构? 备份、主从、binlog......

(4)销毁表空间

alter table a discard tablespace;

(5)复制备份文件成a.ibd,导入表空间

41132720c97c620553773a7ec8bee629.png

alter table a import tablespace;

93110c17097cfe60155af272d89dfe53.png

成功!

思考1:可否直接替换ibd?

我建完一个同表结构新的空表之后,可不可以直接用我们需要恢复的ibd文件,替换这个ibd文件呢?

我们初始化,重新新建一个空白的a表;

(1)重建表:create table a(id int,num int);

(2)覆盖文件

f043b4b1077824a1980e986dfd1431e4.png

(3)查看是否有数据,并没有,直接覆盖失败

11edda405dd658d02c9ec742b06e827b.png

结论:不可以;

思考2:没建表的情况下,可以直接用新建的frm和要恢复的ibd使用表空间导入嘛?

不可以,会报错表不存在。而后,即使你新建表也会报错。

f83a8e4e60780497430d1feca082207f.png

如果需要新建,这个时候需要drop table a; 之后,才能够再次新建。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值