编辑:后续问题: 通过 --repair 和 WiredTiger 恢复 mongoDB。
我的开发人员犯了一个大错误,我们无法在服务器上的任何地方找到我们的 Mongo 数据库。
他登录到服务器,并将以下shell保存在~/crontab/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 错误:
他联系了阿里云,工程师将磁盘连接到另一台正常工作的服务器,以便他可以检查磁盘。看起来有些文件夹不见了,包括/data/
mongodb 所在的文件夹!
- 我们不明白脚本如何破坏磁盘,包括
/data/
; - 当然,还有可能取回吗
/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) 不幸的是,从备份中恢复是此处继续操作的唯一方法。