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

首先声明:这是copy别人的文章,自己觉得可能会用到,在此保留的,不算侵权吧 一次心惊肉跳的服务器误删文件的恢复过程
原文地址:http://www.cnblogs.com/zhouyu629/p/3734494.html


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

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

rm -rf /*

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

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

救命稻草--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 LINE
do
    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

果然不出所料,恢复不出来!!!!!!!!那些文件已被破坏了。

灵机一动: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.ext3grep:https://code.google.com/p/ext3grep/

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

这个工具有一个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差不多,原理应该也差不多。只是号称可以还原目录,我这里没有试验成功

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了实现这个小游戏,我们需要先准备一个成语库,可以在代码中手动定义或者外部导入。在这里,我们先手动定义一个成语库作为例子: ```python idioms = ['画蛇添足', '一马当先', '大海捞针', '心惊肉跳', '两小无猜', '半途而废', '三思而后行', '守株待兔', '文韬武略', '一丝不苟'] ``` 然后我们需要实现随机选择一个成语并在其中随机选择一个字来划线的函数: ```python import random def select_idiom(): return random.choice(idioms) def draw_line(idiom): index = random.randint(0, len(idiom) - 1) return idiom[:index] + '___' + idiom[index + 1:], idiom[index] ``` 其中,`select_idiom`函数用于随机选择一个成语,`draw_line`函数用于在成语中随机选择一个字来划线,并返回划线后的成语以及被划线的字。 接下来,我们需要实现游戏逻辑。首先,让用户选择难度,并根据难度设定每题得分和答错扣分数: ```python def select_difficulty(): while True: difficulty = input('请选择难度(1:简单,2:中等,3:困难):') if difficulty == '1': score_right, score_wrong = 1, -1 break elif difficulty == '2': score_right, score_wrong = 2, -2 break elif difficulty == '3': score_right, score_wrong = 3, -3 break else: print('无效的输入,请重新输入。') return score_right, score_wrong ``` 然后,我们可以实现主逻辑。每次随机选择一个成语,并在其中随机选择一个字来划线。然后让用户输入答案,如果答对则加分,否则扣分,并显示正确答案。当分数小于0时,游戏结束。游戏结束前,如果分值有在前5名,则可以计入游戏榜单。 ```python def main(): score = 10 score_right, score_wrong = select_difficulty() idiom = select_idiom() print('请在以下成语中划线:', idiom) idiom_drawn, answer = draw_line(idiom) print(idiom_drawn) while score > 0: user_input = input('请输入划线部分的成语:') if user_input == answer: score += score_right print('回答正确!当前得分为', score) idiom = select_idiom() print('请在以下成语中划线:', idiom) idiom_drawn, answer = draw_line(idiom) print(idiom_drawn) else: score += score_wrong print('回答错误!正确答案为', answer, '当前得分为', score) if score >= 0 and score_right > 0: print('恭喜您已完成所有简单难度的题目!难度已自动提升至中等!') score_right, score_wrong = 2, -2 elif score >= 0 and score_right > 1: print('恭喜您已完成所有中等难度的题目!难度已自动提升至困难!') score_right, score_wrong = 3, -3 print('挑战失败!您的得分为', score) # 计入游戏榜单 high_scores = [15, 12, 10, 8, 5] # 假设已有的游戏榜单分数 if score > high_scores[-1]: high_scores.append(score) high_scores.sort(reverse=True) print('恭喜您进入游戏榜单!当前排名为', high_scores.index(score) + 1) if len(high_scores) > 5: high_scores.pop() else: print('很遗憾,您未能进入游戏榜单。') ``` 最后,我们可以调用`main`函数开始游戏: ```python main() ``` 这样,一个简单的成语划线小游戏就完成了。在实际的游戏中,我们可以根据需要进一步完善游戏规则和界面设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值