编辑:后续问题: 通过 --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:由于人们经常提到“备份”,这两天我们有很多重要的用户和数据来了,这个动作的目的是备份它们(第一次),然后它们被完全删除了。
很容易。该
//
序列不是 bash (#
is) 中的注释。该语句
OUT_DIR=x // text
没有任何效果*,除了一条神秘的错误消息。因此,由于 OUT_DIR 为空字符串,最终执行的命令之一是
rm -rf /*
. 由于用户没有权限,一些直接放在下面/
的目录没有被删除,但似乎一些重要的目录被删除了。您需要从备份中恢复。* bash 语句的特殊形式
A=b c d e f
大致类似于:一个常见的例子:
有问题的脚本行是这样的:
1) 他错误地认为这
//
是一个 bash 评论。不是,只有#
是。shell 解释
// text
为普通命令,没有找到名为 的二进制文件//
,什么也没做。在 bash 中,当您在
OUT_DIR=/data/backup/mongod/tmp
命令 (// text
) 之前有一个变量赋值 ( ) 时,它只会在运行命令时设置变量。因此,它OUT_DIR
立即取消设置,当到达 rm 行时,OUT_DIR
现在取消设置,rm -rf /
现在调用,删除您有权删除的所有内容。2)解决方案与所有
rm -rf /
情况相同:从备份恢复。没有其他解决方案,因为您无法物理访问硬盘驱动器。1) Bash 注释以# 开头。对不起你的损失。2) 不幸的是,从备份中恢复是唯一的方法。