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)我们只是不了解bash如何破坏包含/ data /的磁盘;
$OUT_DIR未设置在bash和sh注释写成# comment,没有// comment。
下一行将具有以下效果
someVariable=someValue // not a comment
Run Code Online (Sandbox Code Playgroud)
someValue给variable someVariable,但仅用于那一行。在该行之后,变量将返回其旧值,在这种情况下为null。// not a comment,也就是该程序//与参数not,a和comment。由于//只是一个目录(与相同/),这将导致错误消息,仅此而已。现在,这种行为可能看起来很奇怪,但是您可能已经在诸如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)当然,是否有可能取回/ 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)
使用备份还原数据库。