记录服务器rm -rf误删文件的恢复过程

安排一个工程师在一台生产服务器上安装Oracle,工程师边研究边安装,感觉装的不对,准备卸载重新安装。从网上找到卸载方法,其中要执行一行命令删除Oracle的安装目录,命令如下:

rm -rf $ORACLE_BASE/*

如果ORACLE_BASE这个变量没有赋值,那命令就变成了

rm -rf /*

==||,妹子使用的可是root账户啊。就这样,把整个盘的文件全部删除了,包括应用Tomcat、MySQL数据库 and so on。。。。

(mysql数据库不是在运行吗?linux能删除正在执行的文件?反正是彻底删除了,最后还剩一个tomcat的log文件,估计是文件过大,一时没有删除成功)

看着妹子自责的眼神,又是因为这事是我安排她做的,也没有跟她讲清厉害关系,没有任何培训,责任只能一个人背了,况且怎么能让美女背负这个责任呢?

打电话到机房,将盘挂到另一台服务器上,ssh上去查看文件全部被清,这台服务器运行的可是一个客户的生产系统啊,已经运行大半年了,得尽快恢复啊。于是找来脱机备份的数据库,发现备份文件只有1kb,里面只有几行熟悉的mysqldump注释(难道是crontab执行的备份脚本有问题),最接尽的备份也是2013年12月份的了,真是屋漏偏逢连夜雨啊。

想起来一位领导说过的案例:当一个生产系统挂掉以后,发现所有备份都有问题,刻录的光盘也有划痕,磁带机也坏了(一个业界前辈,估计以前还用光盘做备份了),没想到今天真的应验到我的身上了,怎么办??

部门领导知道情况后,已经做了最坏的B计划:领导亲自带队和产品AA周日赶到客户所在的地市,星期一去领导层沟通;BB和CC去客户管理员那边想办法说服客户。。。

救命稻草--ext3grep

赶快到网上去查资料进行误删数据恢复,还真找到一款ext3grep能够恢复通过rm -rf删除的文件,我们磁盘也是ext3格式,且网上有不少的成功案例。于是燃起了一丝希望,赶快对盘umount,防止重新写入补删文件扇区。下载ext3grep,安装(编译安装过程艰辛暂且不表)。

先执行扫描文件名命令:

ext3grep /dev/vgdata/LogVol00 --dump-names

打印出了所有被删除文件及路径,心中狂喜,不用执行B计划了,文件都在呢。

这款软件不能按目录恢复文件,只能执行恢复全部命令:

ext3grep /dev/vgdata/LogVol00 --restore-all

结果当前盘空间不足,没办法只能恢复文件,尝试了几个文件,居然部分成功部分失败

ext3grep /dev/vgdata/LogVol00 --restore-file var/lib/mysql/aqsh/tb_b_attench.MYD

心里不禁一凉,难道是删除磁盘上被写过文件了?恢复机率不大了啊,能恢复几个算几个吧,说不定重要数据文件刚好在能恢复的MYD文件中。于是先将所有文件名重定向到一个文件文件中

ext3grep /dev/vgdata/LogVol00 --dump-names >/usr/allnames.txt

过滤出来所有mysql数据库的文件名存成,mysqltbname.txt

编写脚本恢复文件:

while read LINEdo
 echo "begin to restore file " $LINE
 ext3grep /dev/vgdata/LogVol00 --restore-file $LINE if [ $? != 0 ]
 then
  echo "restore failed, exit"
  # exit 1
 fi
done < ./mysqltbname.txt

执行,大概运行了20分钟,恢复了40多个文件,但不够啊,我们将近100张表,每张表frm,myd,myi三个文件,怎么说也有300多个左右啊!!将找回来的文件附到现有数据库上,更要文件权限为777后,重启mysql,也算是找回一部分数据了,但客户重要的考勤签到数据、手机端上报数据(据说客户按这些数据做员工绩效的)还没找回来啊。

咋 办?中间又试了另一款工具extundelete,跟ext3grep语法基本一致,原理应该也一样了,但是据说能按目录恢复,好吧试一试。

extundelete /dev/vgdata/LogVol00 --restore-directory var/lib/mysql/aqsh

果然不出所料,恢复不出来!!!!!!!!那些文件已被破坏了。跟领导汇报,执行B计划吧。。。无奈之下下班回家(周末了,回去休息一下,想想办法吧)

灵机一动:binlog

第二天早晨一早就醒了(心里有事啊),背上电脑,去公司(这个周末算是报销了,不挨批,通报,罚款,开除就不错了,还过什么周末啊)。

依旧运行ext3grep,extundelete,也就那几招啊,把系统架到测试服务器上,看看数据能不能想办法补一补吧。在测试服务器上进行mysqldump,恢复文件,覆盖恢复回来的文件,给文件加权限,重启mysql。

wait,wait,不是有binlog吗?我们服务都要求开启binlog,说不定能通过binlog里恢复数据呢?

于是从dump出来的文件名里找到binlog的文件,一共三个,mysql-binlog0001,mysql-bin.000009,mysql-bin.000010,恢复一下0001

ext3grep /dev/vgdata/LogVol00 --restore-file var/lib/mysql/mysql-bin.000001

居然失败了。。。。。。

再看另两个文件,mysql-bin.000010大概几百MB,应该靠谱一点,执行还原命令,居然成功了!!!!!!!!!!!!!

赶快scp到测试服务器。执行binlog还原。

mysqlbinlog /usr/mysql-bin.000010 | mysql -uroot -p

输入密码,卡住了(好现象),经过漫长的等待,终于结束了。打开应用,哦,感谢cctv,mtv,数据回来了!!!!!!!!!!!!!!!

后记

经过此次事故,虽然数据很幸运能找回来了,但是过程却是惊心动迫。也为自己的错误所带来的后果,给同事和领导带来的连带责任而后怕。也希望谨记此次事故,以后不再犯同样的错误。事故反思如下:

1.本次安排MM进行服务器维护时没有提前对她进行说明厉害情况,自己也未重视,管理混乱,流程混乱。一个在线的生产系统,任何一个改动一定要先谋而后动。

2.自动备份出现问题,没有任何人检查。脱机备份人员每次从服务器上下载1k的文件却从未重视。需要明确大家在工作岗位上的责任。

3.事故发生后,没有及时发现,造成部分数据写入磁盘,造成不可恢复问题。需要编写应用监控程序,服务一旦有异常,短信告警相关责任人。

根据评论提醒,再加一条:

4.不能使用root用户来操作。应该在服务器上开设不同权限级别的用户。

通过本次事故,几位跟这个项目和事故没有任何关系的同事,主动前来帮忙,查资料,帮测试,有一位同事还帮忙到晚上1点多钟进行数据恢复测试。同时产品经理在想到面向客户的巨大压力的情况下,没有慌乱而责怪开发人员和具体操作人,而让大家能静下心来想解决方案。部门领导也积极主动的帮忙想办法,陪我们加班测试,实时跟踪事情进程。

通过大家的共同努力,终于事情相对圆满结束,接下来,周一上午进行集体反思,总结经验教训,这类事故一定尽量大努力进行避免。

/**************************************传送门************************************************/

本文所用到的工具链接:

1.ext3grep: https://code.google.com/p/ext3grep/

编译安装依赖包比较多,可以到网上搜索如何安装。可惜的是作者给出的howto被墙了,我FQ将how to 的pdf文档下载下来了,读完后你将会对linux的文件系统有进一步的认识。

这个工具有一个bug,出错后不会向下执行ext3grep: init_directories.cc:534: void init_directories(): Assertion `lost_plus_found_directory_iter != all_directories.end()' failed.,从而造成恢复失败,作者放出了一个补丁,下载地址: 补丁下载 。不明白为什么作者新版没有把这个补丁加进去。

2.extundelete: http://extundelete.sourceforge.net/

功能跟ext3grep差不多,原理应该也差不多。只是号称可以还原目录,我这里没有试验成功。

后记:现在越来越多的大公司都是禁用rm 的,如果你要移除一个文件,他们会选择mv至一个垃圾文件,隔一段时间来集中处理。避免误删导致众多囧相!

总结

以上所述是小编给大家介绍的记录服务器rm -rf误删文件的恢复过程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • mysql出现Error performing load command的解决方法

    could not read column value from result set :某某字段(birthday) 出现了这样的错误,反复对照,映射文件没问题,字段没问题. 问题在哪呢?测试了下,如果birthday是String 类型的,没问题.如果是Date类型的.出错,其实原因很简单了,把记录中birthday字段的默认值0000 00-00-00改为正常即可

  • jQuery Form 表单提交插件之formSerialize,fieldSerialize,fieldValue,resetForm,clearForm,clearFields的应用

    一.jQuery Form的其他api 1. formSerialize 将表单序列化成查询串.这个方法将返回一个形如: name1=value1&name2=value2的字符串. 是否可以连环调用: 否, 这个方法返回的是一个字符串. 例子: var queryString = $('#myFormId').formSerialize(); // the data could now be submitted using $.get, $.post, $.ajax, etc $.post('

  • CorFlags.exe检查.NET程序平台目标(Platform Target)的工具

    先通过实验观察不同平台目标组件的下拉列表.在Visual Studio中依序调整PlatformTarget为Any CPU, x86及x64,分别编译成EventPingPongAny.exe, EventPingPongX86.exe, EventPingPongX64.exe三个程序集. 再使用corflags EventPingPong*.exe的方法检查相关属性,得到结果如下: H:\Lab\EventPingPong\bin>corflags EventPingPongAny.exe

  • .NET性能调优之一:ANTS Performance Profiler的使用介绍

    在使用.NET进行快速地上手与开发出应用程序后,接下来面临的问题可能就是程序性能调优方面的问题,而性能调优有时候会涉及方方面面的问题,如程序宿主系统.数据库.网络环境等等,而当程序异常庞大复杂的时候,性能调优将变得更加无从下手. 本系列文章主要会介绍一些.NET性能调优的工具.Web性能优化的规则(如YSlow)及方法等等内容.成文前最不希望看到的就是园子里不间断的"哪个语言好,哪个语言性能高"的争论,不多说,真正的明白人都应该知道这样的争论有没有意义,希望我们能从实际性能优化的角度去

  • php使用NumberFormatter格式化货币的方法

    本文实例讲述了php使用NumberFormatter格式化货币的方法.分享给大家供大家参考.具体实现方法如下: $amount = '12345.67'; $formatter = new NumberFormatter('en_GB', NumberFormatter::CURRENCY); echo 'UK: ' . $formatter->formatCurrency($amount, 'EUR') . PHP_EOL; $formatter = new NumberFormatter(

  • 记录服务器rm -rf误删文件的恢复过程

    安排一个工程师在一台生产服务器上安装Oracle,工程师边研究边安装,感觉装的不对,准备卸载重新安装.从网上找到卸载方法,其中要执行一行命令删除Oracle的安装目录,命令如下: rm -rf $ORACLE_BASE/* 如果ORACLE_BASE这个变量没有赋值,那命令就变成了 rm -rf /* ==||,妹子使用的可是root账户啊.就这样,把整个盘的文件全部删除了,包括应用Tomcat.MySQL数据库 and so on.... (mysql数据库不是在运行吗?linux能删除正在执

  • Eclipse 误删文件的恢复与代码的恢复详解

    误删除文件的恢复 在用eclipse进行代码编写操作时,有时会误删除文件或者文件包.通过eclipse的恢复文件功能可以恢复误删除的文件. 具体步骤为: 1.选择误删除文件在eclipse所在包(文件夹) 2.在包上单击右键. 3.选择restore from local history... 4.在弹出的对话框中选择需要恢复的文件 具体如图: 选择需要恢复的文件 代码的恢复.比较 1.选择要修改比较的代码片段 2.单击右键 3.选择Local History 4.选择需要的操作. 具体如图所示

  • pycharm: 恢复(reset) 误删文件的方法

    昨晚写代码的时候,一不小心把某个代码文件误删了...赶紧上网找了一下pycharm如何恢复误删文件,结果还真有. 经过操作,成功恢复了误删文件.现将方法过程记录如下: Method 在Project栏中,右键单击需要恢复的文件夹,选择 Local History -> Show History : 选中需要reset到的时间节点,Revert 即可: 个人感觉,其机理就类似于使用git进行版本控制. 以上这篇pycharm: 恢复(reset) 误删文件的方法就是小编分享给大家的全部内容了,希望

  • Oracle控制文件丢失恢复归档模式

    目录 一.查看控制文件路径和内容 二.模拟控制文件丢失情况: 1.未丢失全部控制文件 2.全部丢失,控制文件存在备份 通过备份文件重建控制文件 通过rman恢复控制文件 3.全部丢失,没有备份 三.建议 一.查看控制文件路径和内容 SQL> show parameter control_files NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ cont

  • Git 撤销操作、删除文件和恢复文件

    大致介绍 经过前面的学习,已经建立了版本库,并上传了文件,这次来学习对这些文件进行基本的操作,即: ◆ 撤销操作 ◆ 删除文件 ◆ 恢复文件 我在此之前,已经将三个文件提交到了版本库 撤销操作 撤销操作的语法: git checkout -- 文件名 撤销操作一般有两种情况: ◆ 文件修改后还没有提交到暂存区,进行撤销操作之后,文件恢复到和版本库中一模一样 ◆文件修改后提交到了暂存区,进行撤销之后,文件恢复到在提交到暂存区之前的状态 现在index.htm中的内容是: index.html 我们

  • 服务器断电导致虚拟机数据丢失的恢复方法详解

    本文实例讲述了服务器断电导致虚拟机数据丢失的恢复方法.分享给大家供大家参考,具体如下: 在服务器运行过程中如果出现意外情况突然断电很容易引起服务器故障,服务器中的硬件设备损坏可以修复或者购买,但是服务器中的数据一旦发生故障丢失,对于企业来说将是不可估量的损失.那么服务器数据一旦丢失就除了痛哭之外别无他法了吗?不是的,下面我将引用一个真实案例为大家讲解意外断电导致服务器数据丢失的数据恢复方法和过程.文中若有歧义之处欢迎探讨. 虚拟机数据丢失情况描述 因服务器突然断电原因导致Xen Server服务

  • rm -rf之后磁盘空间没有释放的解决方法

    目录 rm -rf之后就高枕无忧了? du和ls的区别 总结 rm -rf之后就高枕无忧了? 现在运营的平台采用的是微服务架构,部署的服务较多,开发环境一台服务器上部署几十个服务是很正常的,之前用CI构建部署的时候,发现磁盘满了.我的处理方式是:先删了 /tmp/ 目录, 空闲出部分空间,然后检查下几个常用的用户目录,发现几个日志文件占用了好几个大G,由于是开发环境,所以就直接删除, 于是 rm之后就天真地认为万事大吉了... 然而过几天后,又有同事发现该机器磁盘又满了,惊呼奇怪咋这么快又满了.

  • 慎用rm -rf /与 rm -rf /* 推荐使用mv代替rm

    目录 测试结果(命令总结) rm 命令可以删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删除掉 命令 作用 -f 强制删除文件或目录 -i 删除已有文件或目录之前先询问用户 -r 递归处理, 将指定目录下的所有文件与子目录一并处理 / 在Linux中表示根目录 * 所有文件 /* 根目录下的所有文件 注意:一旦你执行了上述"rm -rf /" 或者"rm -rf /*"命令,会删除Linux根目录下的所有文件,直接导致服务器瘫痪

  • FTP服务器详解之监控ftp服务器、上传文件到ftp服务器、ftp文件监控的方法

    现在FTP文件服务器的使用极为普遍,可以方便地将文件实时存储在FTP文件服务器上,那么如何搭建FTP文件服务器呢,以及如何监控FTP文件服务器文件访问操作日志情况呢?详细如下: 第1页:FTP服务器的作用 FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务.FTP服务器常常被用来进行文件共享和传输,是互联网领域必不可少的一环. FTP服务器的作用 FTP服务器是为了解决文件传输障碍问题而产生的.那么FT

  • PHP如何将log信息写入服务器中的log文件

    将log信息写入服务器中的log文件文件,折腾了一大圈终于找到了解决方案,具体内容如下: 折腾: [记录]php中如何写类和如何使用类 期间,需要整理出一份,可配置的,通用的,log系统. 支持写入log信息到log文件中. [折腾过程] 1.搜: php log to file 参考: PHP: error_log – Manual PHP: syslog – Manual How to create logs with PHP – Web Services Wiki Write to a l

随机推荐