Случайно удалил базу данных скриптом bash, спасите пожалуйста - PullRequest
20 голосов
/ 24 марта 2019

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

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

enter image description here

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

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

enter image description here

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

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

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

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

Ответы [ 3 ]

54 голосов
/ 24 марта 2019

Вопрос 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 / back?

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

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

17 голосов
/ 24 марта 2019

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

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

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

rm -rf $OUT_DIR/*

.В основном это было эквивалентно

rm -rf /*

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

3 голосов
/ 29 марта 2019

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

...