使用 bash 脚本意外删除了数据库

Sof*_*mur 9 disaster-recovery filesystems shell data-recovery ubuntu-14.04

编辑:一个后续问题: 通过 --repair 和 WiredTiger 恢复 mongoDB

我的开发人员犯了一个巨大的错误,我们在服务器的任何地方都找不到我们的 Mongo 数据库。

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

mongod_back.sh

#!/bin/sh
DUMP=mongodump
OUT_DIR=/data/backup/mongod/tmp  // ????????
TAR_DIR=/data/backup/mongod      // ????????
DATE=`date +%Y_%m_%d_%H_%M_%S`   // ????????????
DB_USER=Guitang                  // ?????
DB_PASS=qq?????????????????????  // ????????
DAYS=14                          // ????14???
TARBAK="mongod_bak_$DATE.tar.gz" // ????????
cd $OUT_DIR                      // ?????
rm -rf $OUT_DIR/*                // ??????
mkdir -p $OUT_DIR/$DATE          // ?????????
$DUMP -d wecard -u $DB_USER -p $DB_PASS -o $OUT_DIR/$DATE  // ??????
tar -zcvf $TAR_DIR/$TAR_BAK $OUT_DIR/$DATE       // ??????????
find $TAR_DIR/ -mtime +$DAYS -delete             // ?14?????
Run Code Online (Sandbox Code Playgroud)

然后他运行它并输出permission denied消息,所以他按下了Ctrl+C。服务器自动关闭。他试图重新启动它,但出现了一个 grub 错误:

格鲁布

他联系了阿里云,工程师将磁盘连接到另一台正常工作的服务器,以便他可以检查磁盘。看起来有些文件夹不见了,包括/data/mongodb在哪里!

  1. 我们不明白脚本如何破坏磁盘,包括/data/
  2. 当然,有没有可能/data/拿回?

PS:他之前没有对磁盘进行快照。

PS2:很多人提到“备份”,这两天我们有很多重要的用户和数据,这个动作的目的是备份它们(第一次),结果它们被完全删除了。

kub*_*zyk 36

很容易。该//序列不是 bash ( #is) 中的注释。

OUT_DIR=x // text除了一条神秘的错误消息外,该语句没有任何效果*。

因此,当 OUT_DIR 为空字符串时,最终执行的命令之一是rm -rf /*. /由于用户没有权限,一些直接放在下面的目录没有被删除,但似乎一些重要的目录删除了。您需要从备份中恢复。


* bash 语句的特殊形式A=b c d e f大致类似于:

export A=b
c d e f
unset A
Run Code Online (Sandbox Code Playgroud)

一个常见的例子:

export VISUAL=vi                       # A standard visual editor to use is `vi`
visudo -f dummy_sudoers1               # Starts vi to edit a fake sudo config. Type :q! to exit
VISUAL=nano visudo -f dummy_sudoers2   # Starts nano to edit a fake sudo config
visudo -f dummy_sudoers3               # Starts vi again (!)
Run Code Online (Sandbox Code Playgroud)

有问题的脚本行如下:

export OUT_DIR=/data/backup/mongod/tmp
// ????????   # shell error as `//` isn't an executable file!
unset OUT_DIR
Run Code Online (Sandbox Code Playgroud)

  • 这是我总是使用 `set -euo pipefail` 的原因之一,它会导致退出而不是使用未设置的变量大错特错 (3认同)

小智 8

1) 他错误地认为那//是 bash 评论。不是,只有#是。

shell 解释// text为普通命令,没有找到名为 的二进制文件//,什么也没做。

在 bash 中,当您OUT_DIR=/data/backup/mongod/tmp直接在命令 ( // text)之前有一个变量赋值 ( ) 时,它只会在运行命令时设置变量。因此,它OUT_DIR立即OUT_DIR取消设置,当到达 rm 行时,现在取消设置,rm -rf /现在被调用,删除您有权删除的所有内容。

2) 解决方法和所有rm -rf /情况一样:从备份中恢复。没有其他解决方案,因为您无法物理访问硬盘驱动器。

  • @SoftTimur `rm` 通常只是“取消链接”文件,但数据在物理上仍然存在,直到被覆盖。这就是为什么专业人士有时可以“取消删除”的原因,如果他们有物理访问权限_并且_在灾难发生后您没有对磁盘做很多事情。如果您没有备份,那是您所能希望的最好的结果。 (2认同)