Filesystems

使用 bash 腳本意外刪除了數據庫

  • March 25, 2019

編輯:後續問題: 通過 –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 錯誤:

格魯布

他聯繫了阿里雲,工程師將磁碟連接到另一個工作伺服器,以便他可以檢查磁碟。看起來有些文件夾不見了,包括/data/mongodb 所在的位置!

  1. 我們不明白腳本如何破壞磁碟,包括/data/
  2. 當然,是否有可能獲得/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

引用自:https://serverfault.com/questions/959707