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

环境准备:

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

2.MySQL 5.7+

一、什么是.frm文件

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

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

得到的结论就是:

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

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

二、什么是.ibd文件

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

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

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

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

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

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

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

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

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

通过命令:

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

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

于是我手写了一个批处理脚本,把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文件复制到数据库存放的数据目录。

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

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

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

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

执行以下命令关联数据:

alter table aaa import tablespace; 

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

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

1.批量获取表结构

2.批量创建表

3.批量脱离表数据。

4.批量管理表数据。

最后,成功恢复数据。

感谢收看。

MySQL 通过.frm文件和.ibd文件实现InnoDB引擎的数据恢复的更多相关文章

  1. MySQL 利用frm文件和ibd文件恢复表结构和表数据

    文章目录 frm文件和ibd文件简介 frm文件恢复表结构 ibd文件恢复表数据 通过脚本利用ibd文件恢复数据 通过shell脚本导出mysql所有库的所有表的表结构 frm文件和ibd文件简介 在 ...

  2. 重新学习MySQL数据库7:详解MyIsam与InnoDB引擎的锁实现

    重新学习Mysql数据库7:详解MyIsam与InnoDB引擎的锁实现 说到锁机制之前,先来看看Mysql的存储引擎,毕竟不同的引擎的锁机制也随着不同. 三类常见引擎: MyIsam :不支持事务,不 ...

  3. 为什么 MySQL 回滚事务也会导致 ibd 文件增大?

    一个简单的测试: start transaction; insert into tb1 values(3, repeat('a', 65000),'x',1); --commit; rollback; ...

  4. mysql InnoDB引擎 共享表空间和独立表空间(转载)

    PS:innodb这种引擎,与MYISAM引擎的区别很大.特别是它的数据存储格式等.对于innodb的数据结构,首先要解决两个概念性的问题: 共享表空间以及独占表空间. 1.什么是共享表空间和独占表空 ...

  5. MySQL frm+ibd文件还原data的办法【数据恢复】

    MySQL frm+ibd文件还原data的办法[数据恢复] 此方法只适合innodb_file_per_table          = 1 当误删除ibdata 该怎么办? 如下步骤即可恢复: 1 ...

  6. 【MySQL】InnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据

    参考:http://my.oschina.net/sansom/blog/179116 参考:http://www.jb51.net/article/43282.htm 注意!此方法只适用于innod ...

  7. mysql通过frm+ibd文件还原data

    此方法只适合innodb_file_per_table          = 1 当误删除ibdata 该怎么办? 如下步骤即可恢复: 1.准备工作 1)准备一台纯洁的mysql环境[从启动到现在没有 ...

  8. MYSQL数据库根据data文件中的.frm和ibd文件恢复单表数据

    数据库误操作,把表的字段删除了,关键是被删除的字段的数据很重要,现在想要恢复数据,下面说说是怎么操作的. 数据库只剩.frm和.ibd文件了,按照网上的做法分如下两步来进行:一.找回表结构,二.找回数 ...

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

    记录通过.frm和.ibd文件恢复数据到本地 .frm文件:保存了每个表的元数据,包括表结构的定义等: .ibd文件:InnoDB引擎开启了独立表空间(my.ini中配置innodb_file_per ...

随机推荐

  1. aws EKS EFS storageclass PV PVC Pod

    storageclass [root@localhost specs]# cat storageclass.yaml kind: StorageClass apiVersion: storage.k8 ...

  2. 1014 Waiting in Line

    Suppose a bank has N windows open for service. There is a yellow line in front of the windows which ...

  3. 限制pyqt5应用程序 只允许打开一次

    起因 pyqt5程序创建桌面快捷方式后,多次单击图标 会打开多个UI界面,这种情况肯定是不允许的! 解决 if __name__ == '__main__': try: app = QtWidgets ...

  4. Python语言程序设计(笔记)

    1.平方根的格式化 知识点:平方根计算 pow(a,0.5)[可以计算负数,结果为复数] a**b 例题: 获得用户输入的一个整数a,计算a的平方根,保留小数点后3位,并打印输出.‪‬‪‬‪‬‪‬‪‬ ...

  5. 手动脱ORiEN壳实战

    作者:Fly2015 ORiEN这种壳之前没有接触,到底是压缩壳还是加密壳也不知道,只能试一试喽.需要脱壳的程序是吾爱破解脱壳练习第7期的题目. 首先对加壳程序进行查壳,这一步也是程序脱壳的必要的一步 ...

  6. poj2175费用流消圈算法

    题意:      有n个建筑,每个建筑有ai个人,有m个避难所,每个避难所的容量是bi,ai到bi的费用是|x1-x2|+|y1-y2|+1,然后给你一个n*m的矩阵,表示当前方案,问当前避难方案是否 ...

  7. Python脚本扫描给定网段的MAC地址表(scapy或 python-nmap)

    目录 用scapy模块写 用 python-nmap 模块写 python3.7  windows环境 以下两个都可以扫描指定主机或者指定网段的 IP 对应的 MAC 地址,然后保存到 csv 文件中 ...

  8. 利用 Windows 线程池定制的 4 种方式完成任务(Windows 核心编程)

    Windows 线程池 说起底层的线程操作一般都不会陌生,Windows 提供了 CreateThread 函数来创建线程,为了同步线程的操作,Windows 提供了事件内核对象.互斥量内核对象.关键 ...

  9. spring-boot-maven-plugin not found的解决方案

    spring-boot-maven-plugin not found 在maven测试的生命周期都没有错,但是就是爆红 参考了很多的链接,没有成功解决,最后得到真正有帮助的方法,添加springboo ...

  10. 【js】Leetcode每日一题-停在原地的方案数

    [js]Leetcode每日一题-停在原地的方案数 [题目描述] 有一个长度为 arrLen 的数组,开始有一个指针在索引 0 处. 每一步操作中,你可以将指针向左或向右移动 1 步,或者停在原地(指 ...