zoukankan      html  css  js  c++  java
  • 【1.1】mysql frm文件丢失(ibd文件丢失)

    【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; 之后,才能够再次新建。

  • 相关阅读:
    进程和线程的一个简单形象的解释
    java流的性能优化1-文件复制
    JAVA修饰符类型(public,protected,private,friendly)
    Codeforces Round #252 (Div. 2) 441B. Valera and Fruits
    游戏开场镜头拉近(Unity3D开发之四)
    P1282 多米诺骨牌
    P1280 尼克的任务
    求最小生成树(暴力法,prim,prim的堆优化,kruskal)
    暴力求最短路
    用MyEclipse将java文件转换成UML类图
  • 原文地址:https://www.cnblogs.com/gered/p/11865624.html
Copyright © 2011-2022 走看看