MySQL 通过.frm文件和.ibd文件实现InnoDB引擎的数据恢复

时间:2022-05-24 07:56:42

起因是这样的,公司的领导表示说服务器崩了,修理好之后,只剩下数据库目录下的物理文件(即.frm文件与.ibd文件)。然后,整了一份压缩包给我,叫我瞅一下能不能把数据恢复出来。我当场愣了一下,这都啥文件啊,以前天天整开发,也没见到这种玩意啊。虽然对这文件不是很熟悉,但是领导交给我了,我也不能推脱,好歹要努力一下看看。

环境准备:

1.本文使用的是Windows 笔记本*1 ( 系统可以是Windows、也可以是CentOS、Debian等等MySQL Utilities能兼容的都行)

2.MySQL 5.7+

一、什么是.frm文件

那么首先我要做的事情就是这.frm结尾的文件到底是什么东西?

我通过百度找到了MySQL官网,我点进去一看,第一段就是下面这句话。凭借着我不怎么样的英文,往下看了三行,发现了标红框的两句话。

MySQL 通过.frm文件和.ibd文件实现InnoDB引擎的数据恢复

得到的结论就是:

1..frm文件描述了表的格式,也就是说里面能获取到表的定义

2..frm文件与表格的名字相同

二、什么是.ibd文件

经过上面的猜测,很容易就可以联想到表结构都有了,那么这个.ibd文件可能就是存放数据、索引信息之类的了。

经过一番的百度,查阅到以下资料:

.ibd文件是使用InnoDB引擎的表产生的索引和数据文件。

(如果引擎使用的是MyISAM的话,会产生索引和数据分开存放的两个文件,.MYI(索引文件)和.MYD(数据文件))

三、获取frm文件的表结构信息

接下来,知道了有这么些文件,那么怎么把数据读取出来呢?

MySQL 提供了一款支持多个平台的工具软件,叫做MySQL Utilities。

MySQL 通过.frm文件和.ibd文件实现InnoDB引擎的数据恢复

这个工具包括克隆、复制、比较、差异、导出、导入、解析frm文件等功能。同时,这款软件支持多种系统使用,使用方法都是一致的。

(附下载地址:http://dev.mysql.com/downloads/utilities/)

通过命令:

 mysqlfrm [.frm文件地址] --diagnostic

就可以查看frm文件包含的完整表结构了。

MySQL 通过.frm文件和.ibd文件实现InnoDB引擎的数据恢复

于是我手写了一个批处理脚本,把frm文件的表格结构都读取出来放在一个文本文件里,这样就获取到了所有的表结构。

CHCP 65001>nul
@echo off
for %%i in ([frm文件所在目录]\*.frm) do (
  mysqlfrm %%i --diagnostic >> test.txt
)
pause

接着就是创建对应的数据库,把表结构的语句输入,执行一下SQL就可以了。

四、表结构有了,就可以开始恢复.ibd数据了

先把数据库里自带的数据文件脱离(脱离之后,表对应的.ibd文件会被删除)。

alter table aaa discard tablespace; 

然后把原先的.ibd文件复制到数据库存放的数据目录。

不知道在哪的同学,可以执行以下语句查看数据目录位置:

MySQL 通过.frm文件和.ibd文件实现InnoDB引擎的数据恢复

这个目录里面是按照数据库分目录的:

MySQL 通过.frm文件和.ibd文件实现InnoDB引擎的数据恢复

找到我们自己的数据库,把.ibd文件复制进去。

到了这一步,就可以准备关联数据了。

执行以下命令关联数据:

alter table aaa import tablespace; 

五、成功之后,就可以验证数据了。

MySQL 通过.frm文件和.ibd文件实现InnoDB引擎的数据恢复

在上述的过程中,我是批量操作的。

1.批量获取表结构

2.批量创建表

3.批量脱离表数据。

4.批量管理表数据。

最后,成功恢复数据。

感谢收看。