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