【1】故障模拟准备环境

这里以innodb为例

【1.1】配置参数

    开启独立表空间 innodb_file_per_table;

【1.2】构建测试数据

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

      

【2】故障模拟

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

      

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

      

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

       

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

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

     

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

        

【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】查看表与表结构,然后删除表

          

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

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

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

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

    

    

    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的文件拷贝过来

    

  (2)释放表空间

      alter table a discard tablespace;

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

    

    

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

      一定要记得,权限问题;

      

  (4)重新导入表空间

    alter table a import tablespace;

      

    至此搞定;

  

【4.2】在原库恢复

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

(1)备份

  cp -r a.ibd a_bak.ibd

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

  复制前,删除表

    

  cp -r test1.frm a.frm

  chown -R mysql:mysql /data/mysql

  复制后,删除表

    

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

create table a(id int,num int);

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

(4)销毁表空间

alter table a discard tablespace;

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

  

alter table a import tablespace;

  

成功!

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

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

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

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

     (2)覆盖文件

        

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

        

    结论:不可以;

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

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

    

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

【1.1】mysql frm文件丢失(ibd文件丢失)的更多相关文章

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

    起因是这样的,公司的领导表示说服务器崩了,修理好之后,只剩下数据库目录下的物理文件(即.frm文件与.ibd文件).然后,整了一份压缩包给我,叫我瞅一下能不能把数据恢复出来.我当场愣了一下,这都啥文件 ...

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

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

  3. 详解MySQL表空间以及ibdata1文件过大问题

    ibdata1文件过大 原因分析 ibdata1是一个用来构建innodb系统表空间的文件,关于系统表空间详细介绍参考MySQL官网文档 上面是一个数据库的ibdata1文件,达到了780多G,而且还 ...

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

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

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

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

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

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

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

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

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

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

  9. mysql 之 frm+ibd文件还原data

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

随机推荐

  1. 011_linuxC++之_继承的引入

    (一)面向对象程序设计中最重要的一个概念是继承.继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易.这样做,也达到了重用代码功能和提高执行时间的效果. (二)引入继承程序 # ...

  2. 51 Nod 1449 砝码称重

    1449 砝码称重  题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 现在有好多种砝码,他们的重量是 w0,w1, ...

  3. 【线性代数】1-1:线性组合(Linear Combinations)

    title: [线性代数]1-1:线性组合(Linear Combinations) toc: true categories: Mathematic Linear Algebra date: 201 ...

  4. java中的变量和数据类型

    变量和javascript的变量含义一样 在Java中,变量分为两种:基本类型的变量和引用类型的变量.(javascript中同样是这样的) 基本数据类型 基本数据类型是CPU可以直接进行运算的类型. ...

  5. 在django中解决跨域AJAX

    由于浏览器存在同源策略机制,同源策略阻止从一个源加载的文档或脚本获取另一个源加载的文档的属性. 特别的:由于同源策略是浏览器的限制,所以请求的发送和响应是可以进行,只不过浏览器不接收罢了. 浏览器同源 ...

  6. Python基础之enumerate枚举

    枚举,对于一个可迭代的(iterable)/可遍历的对象(如列表,字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值. 1. 第一种类型 lst = ["a&quo ...

  7. 使用shell脚本完成自动化部署及秒级回滚

    一.部署机代码目录结构 使用www用户进行代码部署,所有部署机上需要创建www用户,并赋予根目录权限,同时配置公私钥认证建立信任关系. [www@ansible-node1 deploy]$ tree ...

  8. Zookeeper系列(十四)Zookeeper的数据与存储

    作者:leesf    掌控之中,才会成功:掌控之外,注定失败. 出处:http://www.cnblogs.com/leesf456/p/6179118.html尊重原创,奇文共欣赏: 一.前言 前 ...

  9. Alpha冲刺(6/6)

    队名:new game 组长博客:戳 作业博客:戳 组员情况 鲍子涵(队长) 燃尽图 过去两天完成了哪些任务 协调了一下组内的工作 复习了一下SuffixAutomata 接下来的计划 实现更多的功能 ...

  10. 在windows系统搭建Flutter开发环境

    开发环境搭建(Windows) 系统要求 设置FLutter镜像(非必须) 获取Flutter SDK Android开发环境设置 安装Flutter插件 系统要求 在Windows上要安装并运行Fl ...