Случайно удалил базу данных скриптом bash, спасите пожалуйста

Мой разработчик допустил огромную ошибку, и мы не можем найти нашу базу данных mongo на сервере. Спасите пожалуйста !!!

Он вошел на сервер и сохранил следующую оболочку в ~/crontab/mongod_back.sh:

enter image description here

И затем он запустил ./mongod_back.sh, затем было много permission denied, в которых он был permission denied, затем он сделал Ctrl+C Затем сервер отключается автоматически.

Он попытался перезапустить сервер, затем он получил ошибку grub:

enter image description here

Затем он связался с AliCloud, инженер подключил диск к другому работающему серверу, чтобы он мог проверить диск. Затем он понял, что некоторые папки исчезли, включая /data/ где находится mongodb !!!

1) Мы просто не понимаем, как bash может уничтожить диск, включая /data/;

2) И, конечно же, возможно ли получить /data/ обратно?

PS: он не делал снимок диска раньше.

Ответ 1

Вопрос 1

1) Мы просто не понимаем, как bash может уничтожить диск, включая /data/;

Причина: $OUT_DIR был не установлен

В bash и sh комментарии пишутся как # comment, а не //comment.
Следующая строка будет иметь следующие эффекты

someVariable=someValue // not a comment
  • Присвойте someValue переменной someVariable, но только для этой одной строки. После этой строки переменная вернется к своему старому значению, которое в данном случае равно нулю.
  • Выполните "команду" //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

Это должно удалить три файла/директории some, // и thing. Как уже указывалось, // это тот же каталог, что и /.

Тем не менее, большинство реализаций rm в Linux имеют защиту для этого случая и не удаляются / так легко. В Ubuntu вы получите следующее предупреждение (не пытайтесь сделать это дома. Сосет, если ваш rm отличается.)

$ rm -rf //
rm: it is dangerous to operate recursively on '//' (same as '/')
rm: use --no-preserve-root to override this failsafe

вопрос 2

2) И, конечно, можно ли получить/data/обратно?

Это не по теме для StackOverflow. Тем не менее, вы можете найти множество ответов на этот вопрос на других stackexchange сайтах.

Есть инструменты восстановления, которые вы можете попробовать, но нет никакой гарантии, что вы сможете восстановить свои данные, если у вас нет резервной копии.

Ответ 2

Переключение между языками может быть сложным! // не является комментарием в оболочке, это #. Все команды с этими "комментариями" были неправильно проанализированы и пропущены:

$ VAR=whatever // comment
bash: //: Is a directory
[$?=126]
$ echo "($VAR)"
()

Поэтому OUT_DIR=... был проигнорирован, а $OUT_DIR был пуст. Легко догадаться, что

rm -rf $OUT_DIR/*

потом сделал. Это было в основном эквивалентно

rm -rf /*

Используйте ваши резервные копии для восстановления базы данных.

Ответ 3

Я могу прочитать китайские формулировки в поле комментария, начиная со строки 10, пользователь хочет создать временную папку, но использовал cd, поэтому, если /data/backup/mongodb/tmp не существует на первом месте, тогда $ OUT_DIR пуст или null, после этого строка 11 стала rm -rf/*.