MySQL innodb引擎下根据.frm和.ibd文件恢复表结构和数据

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

记录通过.frm和.ibd文件恢复数据到本地

.frm文件:保存了每个表的元数据,包括表结构的定义等;

.ibd文件:InnoDB引擎开启了独立表空间(my.ini中配置innodb_file_per_table = 1)产生的存放该表的数据和索引的文件。

以actclss表为例,结构如下

MySQL innodb引擎下根据.frm和.ibd文件恢复表结构和数据

1、安装相同版本的mysql;

2、找回表结构(若有表结构,直接导入表即可)

  • 建立同名的表(InnoDB),随意一个字段即可

MySQL innodb引擎下根据.frm和.ibd文件恢复表结构和数据

  • 关闭mysql服务,用需要恢复的.frm文件覆盖新生成的.frm文件。接着修改my.ini配置innodb_force_recovery = 6进入恢复模式。启动mysql。

MySQL innodb引擎下根据.frm和.ibd文件恢复表结构和数据

  • 启动mysql,desc actcalss。我这里直接出现了表结构。若没有,查询日志,会提示该表列数。注释innodb_force_recovery = 6,建立相同列数的表。重复以上步骤,会得到表结构。
  • 导出结构,删除表,导入表结构。

3、.ibd文件包含tablespace id,所以需要修改恢复数据.ibd文件的tablespace id和新建立的相同。可使用winHex(编辑16进制)。打开新建的.ibd文件,得到tablespace id。

MySQL innodb引擎下根据.frm和.ibd文件恢复表结构和数据

4、打开需恢复的.ibd文件,修改为 00 03。

5、停止mysql服务,保证innodb_force_recovery = 6。替换.ibd文件。启动mysql。数据和结构都恢复了。可以导出数据和结构。

注意:

1、数据量大时,查询时mysql会异常停止服务,可修改my.ini配置或使用程序分批导出;

2、.ibd文件过大时,winHex修改文件后无法保存,此时可使用linux的vim进行16进制编辑和保存。

  • vim actcalss.ibd -b 二进制的方式打开 (文件过大时,需耐心等待一会儿)

MySQL innodb引擎下根据.frm和.ibd文件恢复表结构和数据

  • 在vim模式下,输入 :%!xxd 进行16进制编辑

MySQL innodb引擎下根据.frm和.ibd文件恢复表结构和数据

  • 编辑完后,使用 :%!xxd -r 转换为二进制
  • :wq!保存即可