ITPub博客

首页 > 数据库 > MySQL > 误删除InnoDB ibdata数据文件(无备份)

误删除InnoDB ibdata数据文件(无备份)

原创 MySQL 作者:许愿流星1号 时间:2015-12-02 15:30:06 0 删除 编辑


     

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

    下面,请看恢复演示:

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

     

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

    二、rm -f ib*

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

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

    五、先找到mysqld的进程pid

     

    1. # netstat -ntlp | grep mysqld 
    1. tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      2463/mysqld  

    我这里是30426

    六、执行关键的一步

    [root@wg1 data]# ll /proc/2463/fd | egrep 'ib_|ibdata'

    lrwx------ 1 root root 64 08-19 09:51 3 -> /mydata/mysql-5.6.25/data/ibdata1 (deleted)

    lrwx------ 1 root root 64 08-19 09:51 8 -> /mydata/mysql-5.6.25/data/ib_logfile0 (deleted)

    lrwx------ 1 root root 64 08-19 09:51 9 -> /mydata/mysql-5.6.25/data/ib_logfile1 (deleted)

     

    3,8,9就是我们要恢复的文件。

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

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

     

    mysql> set global innodb_max_dirty_pages_pct=0;

    Query OK, 0 rows affected (0.00 sec)

     

    1. # 让脏页尽快刷入到磁盘里。

     

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

    确保File和Position值不在变化

     

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

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

     

    [root@wg1 data]# ll /proc/2463/fd | egrep 'ib_|ibdata'

    lrwx------ 1 root root 64 08-19 09:51 3 -> /mydata/mysql-5.6.25/data/ibdata1 (deleted)

    lrwx------ 1 root root 64 08-19 09:51 8 -> /mydata/mysql-5.6.25/data/ib_logfile0 (deleted)

    lrwx------ 1 root root 64 08-19 09:51 9 -> /mydata/mysql-5.6.25/data/ib_logfile1 (deleted)

     

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

     

    [root@wg1 data]# cd /proc/2463/fd

     

    [root@wg1 fd]# cp 3 /mydata/mysql-5.6.25/data/ibdata1

    [root@wg1 fd]# cp 8 /mydata/mysql-5.6.25/data/ib_logfile0

    [root@wg1 fd]# cp 9 /mydata/mysql-5.6.25/data/ib_logfile1

     

    并修改用户属性

     

    [root@wg1 fd]# cd /mydata/mysql-5.6.25/data/

    [root@wg1 data]# chown mysql:mysql ib*

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

     

    1. /etc/init.d/mysql restart 

     

    源文档 <http://www.linuxidc.com/Linux/2012-09/71432.htm> 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29893219/viewspace-1851577/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-09-18

  • 博文量
    46
  • 访问量
    430278