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

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

编辑:后续问题: 通过 --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天前的旧备

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

GRUB

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

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

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

PS2:因为大家经常提到“备份”,这两天我们有很多重要的用户和数据过来,这次的目的是为了备份它们(第一次),结果却把它们全部删除了。

答案1

很简单。这个//序列不是 bash 中的注释(#是)。

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

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


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

export A=b
c d e f
unset A

一个常见的例子:

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 (!)

有问题的脚本内容如下:

export OUT_DIR=/data/backup/mongod/tmp
// 备份文件临时目录   # shell error as `//` isn't an executable file!
unset OUT_DIR

答案2

1) 他错误地认为这//是一条抨击性评论。事实并非如此,只是#如此。

shell 将其解释// text为普通命令,并且没有找到名为 的二进制文件//,因此没有执行任何操作。

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

2) 解决方案与所有情况相同rm -rf /:从备份恢复。没有其他解决方案,因为您无法物理访问硬盘。

答案3

1) Bash 注释以 # 开头。很抱歉,您的损失已造成。2) 不幸的是,从备份中恢复是此处继续操作的唯一方法。

相关内容