一个rm-rf把公司整个数据库删没了...
⼀个rm-rf把公司整个数据库删没了...古戈尔
经历了两天不懈努⼒,终于恢复了⼀次误操作删除的⽣产服务器数据。
对本次事故过程和解决办法记录在此,警醒⾃⼰,也提⽰别⼈莫犯此错。
也希望遇到问题的朋友能到⼀丝灵感解决问题。
01事故背景
安排⼀个妹⼦在⼀台⽣产服务器上安装 Oracle,妹⼦边研究边安装,感觉装的不对,准备卸载重新安装。
从⽹上到卸载⽅法,其中要执⾏⼀⾏命令删除 Oracle 的安装⽬录,命令如下:
rm -rf $ORACLE_BASE/*
如果 ORACLE_BASE 这个变量没有赋值,那命令就变成了:
rm -rf /*
等等,妹⼦使⽤的可是 Root 账户啊。就这样,把整个盘的⽂件全部删除了,包括应⽤ Tomcat、MySQL 数据库 and
MySQL 数据库不是在运⾏吗?Linux 能删除正在执⾏的⽂件?反正是彻底删除了,最后还剩⼀个 Tomcat 的 Log ⽂件,估计是⽂件过⼤,⼀时没有删除成功。
看着妹⼦⾃责的眼神,⼜是因为这事是我安排她做的,也没有跟她讲清厉害关系,没有任何培训,责任只能⼀个⼈背了,况且怎么能让美⼥背负这个责任呢?
打电话到机房,将盘挂到另⼀台服务器上,SSH 上去查看⽂件全部被清,这台服务器运⾏的可是⼀个客户的⽣产系统啊,已经运⾏⼤半年了,得尽快恢复啊。
于是来脱机备份的数据库,发现备份⽂件只有 1KB,⾥⾯只有⼏⾏熟悉的 mysqldump 注释(难道是 Crontab 执⾏的备份脚本有问题),最接近的备份也是 2013 年 12 ⽉份的了,真是屋漏偏逢连夜⾬啊。
她字组词想起来⼀位领导说过的案例:当⼀个⽣产系统挂掉以后,发现所有备份都有问题,刻录的光盘也有划痕,磁带机也坏了(⼀个业界前辈,估计以前还⽤光盘做备份了),没想到今天真的应验到我的⾝上了,怎么办?
滴答滴答是什么歌部门领导知道情况后,已经做了最坏的 B 计划:领导亲⾃带队和产品 AA 周⽇赶到客户所在的地市,星期⼀去领导层沟通;BB 和 CC 去客户管理员那边想办法说服客户......
02救命稻草: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 >/
过滤出来所有 MySQL 数据库的⽂件名存成 。
编写脚本恢复⽂件:
while read LINE
do
echo "begin to restore file " $LINE
ext3grep /dev/vgdata/LogVol00 --restore-file $LINE
if[ $? != 0 ]
then
echo "restore failed, exit"
# exit1
fi
done < ./
执⾏,⼤概运⾏了 20 分钟,恢复了 40 多个⽂件,但不够啊,我们将近 100 张表,每张表 frm,myd,myi 三个⽂件,怎么说也有 300 多个左右啊!
将回来的⽂件附到现有数据库上,更要⽂件权限为 777 后,重启 MySQL,也算是回⼀部分数据了,但客户重要的考勤签到数据、⼿机端上报数据(据说客户按这些数据做员⼯绩效的)还没回来啊。
咋办?中间⼜试了另⼀款⼯具 extundelete,跟 ext3grep 语法基本⼀致,原理应该也⼀样了,但是据说能按⽬录恢复。
好吧,试⼀试:
extundelete /dev/vgdata/LogVol00 --restore-directory var/lib/mysql/aqsh
果然不出所料,恢复不出来那些⽂件已被破坏了。跟领导汇报,执⾏ B 计划吧......⽆奈之下下班回家。(周末了,回去休息⼀下,想想办法吧)
03灵机⼀动: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,数据回来了!
04后记
也希望谨记此次事故,以后不再犯同样的错误。事故反思如下:
本次安排 MM 进⾏服务器维护时没有提前对她进⾏说明厉害情况,⾃⼰也未重视,管理混乱,流程混乱。⼀个在线的⽣产系统,任何⼀个改动⼀定要先谋⽽后动。
⾃动备份出现问题,没有任何⼈检查。脱机备份⼈员每次从服务器上下载 1K 的⽂件却从未重视。需要明确⼤家在⼯作岗位上的责任。
事故发⽣后,没有及时发现,造成部分数据写⼊磁盘,造成不可恢复问题。需要编写应⽤监控程序,服务⼀旦有异常,短信告警相关责任⼈。
根据评论提醒,再加⼀条:不能使⽤ Root ⽤户来操作。应该在服务器上开设不同权限级别的⽤户。
通过本次事故分享下本⽂所⽤到的⼯具链接:
功能跟 ext3grep 差不多,原理应该也差不多。编译安装依赖包⽐较多,可以到⽹上搜索如何安装。【可惜的是作者给出的 howto 被墙了,
我 FQ 将 howto 的 pdf ⽂档下载下来了,读完后你将会对 Linux 的⽂件系统有进⼀步的认识。】
梁朝伟电影这个⼯具有⼀个 Bug,出错后不会向下执⾏:
ext3grep: :534: void init_directories(): Assertion `lost_plus_found_directory_iter != d()' failed.
从⽽造成恢复失败,作者放出了⼀个补丁,下载地址:补丁下载。
最后希望各位同⾏的⼩伙伴们能谨记本⽂事件,开⼼敲代码,永远不出错~

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。