人工误删除InnoDB ibdata数据文件如何恢复?(没试过)

在日常工作中,因不熟悉InnoDB引擎,在群里看到有很多人误删除了InnoDB ibdata(数据文件)和ib_logfile(redo log重做事务日志文件),结果导致了杯具的发生。如果你有做主从复制同步,那还好,如果是单机呢?如何恢复?

下面,请看恢复演示:

一、你可以用sysbench模拟数据的写入,如:

    sysbench --test=oltp --mysql-table-engine=innodb --oltp-table-size=10000000 --max-requests=10000
    --num-threads=90 --mysql-host=192.168.110.140 --mysql-port=3306 --mysql-user=admin --mysql-password=123456
    --mysql-db=test --oltp-table-name=uncompressed  --mysql-socket=/tmp/mysql.sock run

二、rm -f ib*

三、此时我估计你被吓得够呛,脸白手哆嗦,如果你看到这篇文章,心可以稳稳了,没事,可以恢复的。

四、此时,你会发现数据库还可以正常工作,数据照样可以写入,切记,这时千万别把mysqld进程杀死,否则你只有跳楼了,神仙都没法救你。

五、先找到mysqld的进程pid

    # netstat -ntlp | grep mysqld
    tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      30426/mysqld  

我这里是30426

六、执行关键的一步

    # ll /proc/30426/fd | egrep 'ib_|ibdata'      
    lrwx------ 1 root root 64  9月 24 16:51 10 -> /u2/mysql/data/ib_logfile1
    lrwx------ 1 root root 64  9月 24 16:51 11 -> /u2/mysql/data/ib_logfile2
    lrwx------ 1 root root 64  9月 24 16:51 4 -> /u2/mysql/data/ibdata1
    lrwx------ 1 root root 64  9月 24 16:51 9 -> /u2/mysql/data/ib_logfile0

10,11,4,9就是我们要恢复的文件。

七、你可以把前端业务关闭,或者执行FLUSH TABLES WITH READ LOCK;这一步的作用是让数据库没有写入操作,以便后面的恢复工作。

八、如何验证没有写入操作呢?分以下几步,记住要结合在一起观察。

    set global innodb_max_dirty_pages_pct=0;   
    # 让脏页尽快刷入到磁盘里。

    mysql> show master status;
    +------------------+----------+--------------+------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +------------------+----------+--------------+------------------+
    | mysql-bin.000002 |      107 |              |               |
    +------------------+----------+--------------+------------------+
    1 row in set (0.00 sec)

确保File和Position值不在变化

    show engine innodb status\G;  
      
    ------------  
    TRANSACTIONS  
    ------------  
    Trx id counter A21837  
    Purge done for trx's n:o < A21837 undo n:o < 0  
    ## 确保后台Purge进程把undo log全部清除掉,事务ID要一致。  
      
    -------------------------------------  
    INSERT BUFFER AND ADAPTIVE HASH INDEX  
    -------------------------------------  
    Ibuf: size 1, free list len 65, seg size 67, 0 merges  
    ## insert buffer合并插入缓存等于1  
     
    ---
    LOG
    ---
    Log sequence number 18158813743
    Log flushed up to 18158813743
    Last checkpoint at 18158813743
    ## 确保这3个值不在变化   
     
    ----------------------
    BUFFER POOL AND MEMORY
    ----------------------  
    Total memory allocated 643891200; in additional pool allocated 0
    Dictionary memory allocated 39812
    Buffer pool size   38400
    Free buffers   37304
    Database pages 1095
    Old database pages 424
    Modified db pages  0
    ## 确保脏页数量为0  
     
    --------------
    ROW OPERATIONS
    --------------
    0 queries inside InnoDB, 0 queries in queue
    1 read views open inside InnoDB
    Main thread process no. 30426, id 140111500936976, state: waiting for server activity Number of rows inserted 0, updated 0, deleted 0, read 0
    0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s
    ## 确保插入、更新、删除为0


九、上面一系列确认工作完成之后,我们就可以恢复了。还记得刚才我们记录的删除文件吗?

    # ll /proc/30426/fd | egrep 'ib_|ibdata'       
    lrwx------ 1 root root 64  9月 24 16:51 10 -> /u2/mysql/data/ib_logfile1  
    lrwx------ 1 root root 64  9月 24 16:51 11 -> /u2/mysql/data/ib_logfile2  
    lrwx------ 1 root root 64  9月 24 16:51 4 -> /u2/mysql/data/ibdata1  
    lrwx------ 1 root root 64  9月 24 16:51 9 -> /u2/mysql/data/ib_logfile0  

把这些文件拷贝到原来的目录下并修改用户属性即可。

    #cd /proc/10755/fd
    #cp 10 /u2/mysql/data/ib_logfile1
    #cp 11 /u2/mysql/data/ib_logfile2
    #cp 4 /u2/mysql/data/ibdata1
    #cp 9 /u2/mysql/data/ib_logfile0

并修改用户属性

    #cd /u2/mysql/data/
    #chown mysql:mysql ib*

十、大功告成,只需要重启MySQL即可。

    /etc/init.d/mysql restart

怎样?就这么简单,你也动手试试吧。


来自:http://www.linuxidc.com/Linux/2012-09/71432.htm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值