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 line
or的著名习语中使用了它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)
使用备份还原数据库。