Filesystems
使用 bash 腳本意外刪除了數據庫
編輯:後續問題: 通過 –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
大致類似於: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