MySQL误删物理文件的恢复(Linux)

  以前拜读过一位甲骨文大大的文章,结果自己在测试环境也遇到了,顺手记下来
  甲骨文大大的文章链接http://blog.itpub.net/17203031/viewspace-1077770/
  
  环境:MySQL5.6.27
  问题原因的分析:手滑了_(:з”∠)_
  总体思路:
  
  Linux下的文件描述符的介绍,直接摘录甲骨文大大的描述
   MySQL误删物理文件的恢复(Linux)
  
  所以最重要的一点:冷静,不要去随便重启数据库,保持当时候的操作现场;
  
  现场还原:测试环境中模拟误删ib_logfile1
   MySQL误删物理文件的恢复(Linux)
  
  然后
   MySQL误删物理文件的恢复(Linux)
  结合之前对Linux的文件描述符的介绍,可以确定这个文件还是存在的~
  那么动手找一下,先确定MySQL的进程ID: ps ef | grep MySQL
  看一下里面的内容
   MySQL误删物理文件的恢复(Linux)
  可以看到文件还在,但是被标记成了删除,既然文件还在,那就好办了~
  
  
  所以先执行刷新表readlock;再执行刷新日志;
   MySQL误删物理文件的恢复(Linux)
  然后看一下新生成的几个binlog,旧一点的binlog里面能看到“误删“ib_logfile1之后执行的语句
   MySQL误删物理文件的恢复(Linux)
  在新生成的binlog里面则什么都没有
   MySQL误删物理文件的恢复(Linux)
  确认了旧的重做日志已经写入到磁盘,也没有新的事务在执行,那么再把“误删”的文件拷贝回去;
   MySQL误删物理文件的恢复(Linux)
  
  错误的场景:
  假设最初出现问题的时候,关闭了数据库,最终这个日志没了,那么在启动MySQL的时候就会有如下的报错
   MySQL误删物理文件的恢复(Linux)
  
   MySQL误删物理文件的恢复(Linux)
   MySQL误删物理文件的恢复(Linux)
  对比下之前拷贝一个内容有问题的日志文件的错误信息(模拟操作:没有把日志缓冲区的数据刷新到磁盘,结果拷贝出来的日志文件不对)
   MySQL误删物理文件的恢复(Linux)
  <强> <强>
  为什么明明这个ib_logfile明明有问题,mysql还启动了?
  看看两次替换日志文件后,mysql输出的信息(上面是没有刷新缓冲区的日志文件,下面是刷新过迷的)
   MySQL误删物理文件的恢复(Linux)
  
   MySQL误删物理文件的恢复(Linux)
  
  
  PS:不管是误删了数据文件还是日志文件,切记<强> 强,且~

MySQL误删物理文件的恢复(Linux)