web-dev-qa-db-ja.com

データベースがbashスクリプトで誤って削除された

編集:フォローアップの質問:mongoDBを--repairとWiredTigerで復元

開発者が大きなミスを犯したため、サーバー内のどこにもMongoデータベースが見つかりません。

彼はサーバーにログインし、次のシェルを~/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

彼はディスクをチェックできるようにエンジニアがディスクを別の稼働中のサーバーに接続したAliCloudに連絡しました。 mongodbが存在する/data/など、一部のフォルダがなくなっているようです。

  1. スクリプトが/data/を含むディスクをどのように破壊するか理解できません。
  2. そしてもちろん、/data/を取り戻すことは可能ですか?

PS:彼は以前にディスクのスナップショットを撮りませんでした。

PS2:「バックアップ」についてよく言われるように、この2日間は重要なユーザーとデータがたくさんあります。このアクションの目的は、それらを(初めて)バックアップすることでしたが、完全に削除されました。

9
SoftTimur

簡単です。 //シーケンスはbashのコメントではありません(# is)。

ステートメントOUT_DIR=x // textは、不可解なエラーメッセージを除いて効果がありません*。

したがって、OUT_DIRが空の文字列であるため、最終的に実行されるコマンドの1つはrm -rf /*でした。 /の直下に配置された一部のディレクトリは、ユーザーに権限がないため削除されませんでしたが、重要なディレクトリwereが削除されたようです。バックアップから復元する必要があります。


* 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
36
kubanczyk

1)//がbashコメントであると誤解していた。そうではなく、#のみです。

シェルは// textを通常のコマンドとして解釈し、//というバイナリーを見つけられなかったため、何もしませんでした。

Bashでは、コマンド(OUT_DIR=/data/backup/mongod/tmp)の直前に変数割り当て(// text)がある場合、コマンドの実行中にのみ変数を設定します。したがって、OUT_DIRの設定をすぐに解除し、rm行に達するとOUT_DIRが設定解除され、rm -rf /が呼び出されて、削除する権限があるすべてのものが削除されます。

2)ソリューションはすべてのrm -rf /ケースと同じです:バックアップから復元します。ハードドライブに物理的にアクセスできないため、他の解決策はありません。

8
Ray Wu

1)Bashコメントは#で始まります。紛失してすみません。 2)残念ながら、ここから先に進むには、バックアップから復元するしか方法がありません。

4
RMPJ