bash脚本意外删除了数据库,请进行救援

Sof*_*mur 22 filesystems bash disaster-recovery data-recovery ubuntu-14.04

我的开发人员犯了一个严重的错误,我们在服务器中找不到任何人的mongo数据库。请营救!!!

他登录到服务器,并将以下shell保存在下~/crontab/mongod_back.sh

在此处输入图片说明

然后他奔跑./mongod_back.sh,然后有很多permission denied,然后他做了Ctrl+C。然后服务器自动关闭。

他尝试重新启动服务器,然后出现grub错误:

在此处输入图片说明

然后,他联系了AliCloud,工程师将磁盘连接到另一台工作服务器,以便他可以检查磁盘。然后,他意识到有些文件夹已经消失了,包括/data/mongodb所在的位置!!!

1)我们只是不了解bash如何破坏磁盘,包括/data/;

2)当然,有可能得到/data/回报吗?

PS:他之前没有为磁盘制作快照。

Soc*_*owi 54

问题1

1)我们只是不了解bash如何破坏包含/ data /的磁盘;

原因:$OUT_DIR未设置

bashsh注释写成# comment,没有// comment
下一行将具有以下效果

someVariable=someValue // not a comment
Run Code Online (Sandbox Code Playgroud)
  • 分配someValue给variable someVariable,但仅用于那一行。在该行之后,变量将返回其旧值,在这种情况下为null。
  • 执行“命令” // not a comment,也就是该程序//与参数notacomment。由于//只是一个目录(与相同/),这将导致错误消息,仅此而已。

现在,这种行为可能看起来很奇怪,但是您可能已经在诸如IFS= read -r lineor的著名习语中使用了它LC_ALL=C sort

查看您的脚本,以下几行可能会引起问题:

OUT_DIR=/data/backup/mongodb/tmp // ...
...
rm -rf $OUT_DIR/*
Run Code Online (Sandbox Code Playgroud)

很抱歉给您带来这个问题,但是您基本上已经执行了,rm -rf /*因为它$OUT_DIR扩展为空字符串。

其他系统的潜在风险

即使$OUT_DIR不为空,效果也可能是相同的,因为//后面有一个“注释” rm。考虑命令

rm -rf some // thing
Run Code Online (Sandbox Code Playgroud)

这应该删除这三个文件/目录some//thing。正如已经指出的//是与相同的目录/

但是,Linux上的大多数实现rm对此情况都有防范措施,因此删除起来并不/容易。在Ubuntu上,您会收到以下警告(不要在家中尝试。如果rm不同,会很糟糕。

$ rm -rf //
rm: it is dangerous to operate recursively on '//' (same as '/')
rm: use --no-preserve-root to override this failsafe
Run Code Online (Sandbox Code Playgroud)

问题2

2)当然,是否有可能取回/ data /?

对于StackOverflow,这是没有主题的。但是,你可以找到很多 答案 这个 问题 其他 stackexchange 网站

您可以尝试使用恢复工具,但不能保证没有备份就可以恢复数据。


cho*_*oba 18

在语言之间切换可能很棘手!//不是shell的注释入门者,而是#。带有这些“注释”的所有命令均被错误地解析并跳过:

$ VAR=whatever // comment
bash: //: Is a directory
[$?=126]
$ echo "($VAR)"
()
Run Code Online (Sandbox Code Playgroud)

因此,OUT_DIR=...被忽略并且$OUT_DIR为空。很容易猜出是什么

rm -rf $OUT_DIR/*
Run Code Online (Sandbox Code Playgroud)

然后做到了。它基本上相当于

rm -rf /*
Run Code Online (Sandbox Code Playgroud)

使用备份还原数据库。