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

以前拜读过一位Oracle大大的文章,结果自己在测试环境也遇到了,顺手记下来
Oracle大大的文章链接http://blog.itpub.net/17203031/viewspace-1077770/
-------------------------------------------------------------------------------------正文------------------------------------------------------------------------------------
背景:DB的测试环境误删MySQL的日志文件ib_logfile1
环境:MySQL5.6.27
问题原因的分析:手滑了_(:з」∠)_
总体思路:
最重要的是冷静,不要乱搞...
Linux下的文件描述符的介绍,直接摘录Oracle大大的描述

所以最重要的一点:冷静,不要去随便重启数据库,保持当时候的操作现场;

现场还原:测试环境中模拟误删ib_logfile1

然后发现数据依然在正常运行,可以插入新的数据

结合之前对Linux的文件描述符的介绍,可以确定这个文件还是存在的~
那么动手找一下,先确定MySQL的进程ID:ps -ef | grep mysql
然后在/proc/fd里面找到这个PID对应的文件夹(文件名=pid)看一下里面的内容

可以看到文件还在,但是被标记成了deleted,既然文件还在,那就好办了~
赶紧把文件拷贝回去?  No!
由于日志也有buffer(innodb_log_buffer_size),拷回去之前,要确认这些日志都刷新到了磁盘,同时也要确认在拷贝的时候,没有新的事务在操作MySQL数据库;
所以先执行flush tables with readlock;再执行flush logs;

然后看一下新生成的几个binlog,旧一点的binlog里面能看到“误删”ib_logfile1之后执行的语句

在新生成的binlog里面则什么都没有

确认了旧的redo log已经写入到磁盘,也没有新的事务在执行,那么再把“误删”的文件拷贝回去;

错误的场景:
假设最初出现问题的时候,关闭了数据库,最终这个log没了,那么在启动MySQL的时候就会有如下的报错

或者是内容有问题,(这里偷懒了,忘了在刷buffer前拷贝一个错误的logfile1,姑且就拿logfile0来凑数了,当成一个错误的logfile....._(:з」∠)_...本质上应该是一样的效果)

那么把之前处理好以后拷贝出来的logfile拷回去看看,修改文件的所有者和权限,启动MySQL之后,噫!报错了~
对比下之前拷贝一个内容有问题的logfile的错误信息(模拟操作:没有把log buffer的数据刷新到磁盘,结果拷贝出来的logfile不对)

数据文件和正确处理的logfile的LSN是恰好对应上的;
为什么明明这个ib_logfile明明有问题,mysql还启动了?
看看两次替换日志文件后, mysql输出的信息(上面是没有刷新buffer的logfile,下面是刷新过buff的)


可以看到数据库根据刷新到磁盘的数据文件的为准,截断了这些有问题的logfile,然后重新生成了新的logfile的LSN,
推测:生成新的logfile的LSN之后,数据文件中的标记位也发生了变更,从3117292814变成了3117292824,这也是为什么第二次拷贝正确的logfile进去之后,还是打印出了错误日志;
-------------------------------------------------------------------------------------结束------------------------------------------------------------------------------------
PS:不管是误删了数据文件还是日志文件,切记不要关掉数据库,且恢复的时候一定要确认缓存数据全部刷新到了磁盘~

时间: 2024-12-27 06:03:51

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

电脑不小心误删的文件可以恢复吗?简单恢复教程

定期的清理电脑上的垃圾文件可以保证电脑的健康,运行时速度也比较流畅,但是如果在清理电脑的过程中不小心误删了一些重要的文件,那就十分的糟心了.于是很多朋友会问:电脑不小心误删的文件可以恢复吗? 一般来讲,用户想要恢复删除的文件,在数据丢失后,一定不能对电脑内的数据进行格式化处理,或者是继续在这个文件夹内进行存储操作.这些行为都会直接威胁到数据的安全,不利于进行数据恢复,因此建议大家一定要谨记,误轻举妄动. 那么,如何恢复不小心删除的文件?建议大家使用专业的数据恢复软件,这款软件不需要用户具备任何的

解决误删mysql表物理文件的方法

该方法只介绍了如何救回这个表名(数据不恢复) 如果想要恢复原来数据 直接用extundelete把文件恢复后放回去即可  并且是适用于平时没有全备的情况下  如果有全备 直接那全备的frm和idb文件放回去 就可以了  该方法同样适用于数据表迁移(只迁移一个表)  因为discard再import的速度 远比先dump再恢复的速度要快得多 建议: 平时备份一下表结构是非常重要的 -- 如果你直接删除了mysql的表文件 (.frm .idb)  在mysql5.6 可能你就悲剧了  可能再也用不

mysql表物理文件被误删的解决方法_Mysql

前言       1.该方法只介绍了如何救回这个表名(数据不恢复) 如果想要恢复原来数据 直接用extundelete把文件恢复后放回去即可       2.并且是适用于平时没有全备的情况下  如果有全备 直接那全备的frm和idb文件放回去 就可以了       3.该方法同样适用于数据表迁移(只迁移一个表)  因为discard再import的速度 远比先dump再恢复的速度要快得多 建议: 平时备份一下表结构是非常重要的 -- 如果你直接删除了mysql的表文件 (.frm .idb) 

360误删的文件如何恢复

现在互联网上各种病毒.木马混杂,很多用户为了电脑数据的安全,都会在电脑中安装一款安全防御软件,目前网络上安全软件众多,其中使用比较广泛的就是360安全卫士了.在我们使用360安全卫士清理电脑中的文件时,经常会出现误删除重要文件的现象,如果是重要的文件被删除,那么用户的损失就大了.下面小编就来跟大家分享一种方法,它能有效恢复被360误删的文件,帮助大家解决文件丢失难题. 目前市面上有很多针对电脑丢失数据问题的恢复软件,对于360的误删文件,大家可以使用数据恢复软件找回.不过众多数据恢复软件的功能差

inux-LINUX 文件夹下误删文件如何恢复

问题描述 LINUX 文件夹下误删文件如何恢复 LINUX 下,TOMCAT ROOT里的内容先全删了.此时叫A1,然后重新上传了ROOT文件夹并解压了,此时是A2,发现弄错了,于是把A2也全删了.但是A1不知道怎么恢复,求大神帮助,在线等,QQ:100079465,报酬:100元支付宝转账. 解决方案 用r-studio一类的恢复软件,如果你了解文件系统的细节,也可以用winhex

电脑不小心误删的文件怎么才能恢复哪个软件好

定期的清理电脑上的垃圾文件可以保证电脑的健康,运行时速度也比较流畅,但是如果在清理电脑的过程中不小心误删了一些重要的文件,那就十分的糟心了.于是很多朋友会问:电脑不小心误删的文件可以恢复吗? 一般来讲,用户想要恢复删除的文件,在数据丢失后,一定不能对电脑内的数据进行格式化处理,或者是继续在这个文件夹内进行存储操作.这些行为都会直接威胁到数据的安全,不利于进行数据恢复,因此建议大家一定要谨记,误轻举妄动. 那么,如何恢复不小心删除的文件?建议大家使用专业的数据恢复软件,这款软件不需要用户具备任何的

使用extundelete恢复LINUX下ext4误删的文件

最近看到群里提到如何恢复LINUX下ext4误删的文件,之前听说过ext3分区恢复工具ext3grep,但是恢复ext4一直没有概念,而且目前线上的系统分区格式都是ext4,SO网上找到了一款叫extundelete的文件恢复工具,该工具最给力的一点就是支持ext3/ext4双格式分区恢复,对我们运维攻城狮算是一款神器级别的软件,这里整理了如下文档,供大家参考. 虚拟机:        vmware workstation 9.0.2 操作系统:      CentOS6.3 x64 extun

如何恢复Linux中的误删文件

 写在前面的话 在开始教程之前我有必要提醒大家,使用窗口管理器(GUI)删除文件和使用命令行工具(CLI)删除文件这两种方法之间是有区别的. 当我们使用窗口管理器来删除文件时,我们仅仅只是将文件从某个目录移动到了另一个目录中(回收站).在这种情况下,唯一得到更新的就是你文件系统索引节点(inode)的元数据信息,例如被删除文件的时间戳.文件所占存储区块和扩展属性等数据.你可以使用tune2fs(调整和查看ext2/ext3文件系统的文件系统参数)来查看文件系统的索引节点信息,在命令行工具中输入下

一次心惊肉跳的服务器误删文件的恢复过程

  经历了两天不懈努力,终于恢复了一次误操作删除的生产服务器数据.对本次事故过程和解决办法记录在此,警醒自己,也提示别人莫犯此错.也希望遇到问题的朋友能找到一丝灵感解决问题. 事故背景 安排一个妹子在一台生产服务器上安装Oracle,妹子边研究边安装,感觉装的不对,准备卸载重新安装.从网上找到卸载方法,其中要执行一行命令删除Oracle的安装目录,命令如下: rm -rf $ORACLE_BASE/* 如果ORACLE_BASE这个变量没有赋值,那命令就变成了 rm -rf /* ==||,妹子