開発者が大きなミスを犯したため、サーバーにmongoデータベースを見つけることができません。助けてください!!!
彼はサーバーにログインし、次のシェルを~/crontab/mongod_back.sh
に保存しました。
そして、彼は./mongod_back.sh
を実行し、次にpermission denied
がたくさんあり、そしてCtrl+C
を実行しました。その後、サーバーは自動的にシャットダウンします。
彼はサーバーを再起動しようとしたところ、重大なエラーが発生しました。
次に、エンジニアがディスクをチェックできるように、エンジニアがディスクを別の稼働中のサーバーに接続したAliCloudに連絡しました。その後、彼はmongodbがある/data/
を含むいくつかのフォルダがなくなったことに気づきました!!!
1)bashが/data/
を含むディスクをどのように破壊するか理解できません。
2)そしてもちろん、/data/
を取り戻すことは可能ですか?
PS:彼は以前にディスクのスナップショットを撮りませんでした。
1)bashが/ data /を含むディスクをどのように破壊するかを理解していません。
$OUT_DIR
の設定が解除されましたbash
およびsh
では、コメントは# comment
ではなく// comment
として記述されます。
次の行には次の効果があります
someVariable=someValue // not a comment
someValue
を変数someVariable
に割り当てますが、その1行のみです。その行の後、変数は古い値に戻りますが、この場合はnullです。// not a comment
を実行します。つまり、プログラム//
をパラメータnot
、a
、およびcomment
で実行します。 //
は単なるディレクトリ(/
と同じ)であるため、エラーメッセージが表示され、それ以上は発生しません。現在、この動作は奇妙に思えるかもしれませんが、IFS= read -r line
やLC_ALL=C sort
などのよく知られたイディオムですでに使用している可能性があります。
スクリプトを見て、次の行が問題の原因である可能性があります。
OUT_DIR=/data/backup/mongodb/tmp // ...
...
rm -rf $OUT_DIR/*
申し訳ありませんが、rm -rf /*
が空の文字列に展開されているため、基本的に$OUT_DIR
を実行しました。
$OUT_DIR
が空でなくても、rm
の後に//
"コメント"があるため、効果は同じでした。コマンドを検討する
rm -rf some // thing
これは、3つのファイル/ディレクトリsome
、//
、およびthing
を削除することになっています。すでに指摘したように、//
は/
と同じディレクトリです。
ただし、Linuxのrm
のmost実装には、このケースに対するガードがあり、/
を簡単に削除しません。 Ubuntuの場合、次の警告が表示されます(自宅ではこれを試さないでください。rm
が異なる場合は問題があります。)
$ rm -rf //
rm: it is dangerous to operate recursively on '//' (same as '/')
rm: use --no-preserve-root to override this failsafe
2)そして、当然のことながら、/ data /を取り戻すことは可能ですか?
これはStackOverflowのトピックから外れています。ただし、 多数回答tothisquestiononその他stackexchangeサイト 。
試すことができる回復ツールはありますが、バックアップがない場合にデータを復元できる保証はありません。
言語の切り替えには注意が必要です。 //
はシェルのコメントスターターではなく、#
。これらの「コメント」を含むすべてのコマンドが誤って解析され、スキップされました:
$ VAR=whatever // comment
bash: //: Is a directory
[$?=126]
$ echo "($VAR)"
()
したがって、OUT_DIR=...
は無視され、$OUT_DIR
は空でした。何を推測するのは簡単です
rm -rf $OUT_DIR/*
その後しました。基本的には
rm -rf /*
バックアップを使用してデータベースを復元します。
コメントフィールドで中国語の文言を読み取ることができます。10行目から、ユーザーは一時フォルダーを作成したいがcd
を使用しているので、/data/backup/mongodb/tmp
が最初に存在しない場合、$ OUT_DIRは空またはnull、その後11行目がrm -rf /*
になった。