Base de données supprimées accidentellement par un script bash, de sauvetage veuillez
Mon développeur commis une énorme erreur, et nous ne trouvons pas notre base de données mongo n'importe qui dans le serveur. Le sauvetage s'il vous plaît!!!
Il connecté sur le serveur, et enregistré le shell suivante en vertu de ~/crontab/mongod_back.sh
:
Et puis il exécuter ./mongod_back.sh
, puis il y avait beaucoup de permission denied
, puis il l'a fait Ctrl+C
. Puis, le serveur s'arrête automatiquement.
Il a essayé de redémarrer le serveur, puis il a obtenu un grub erreur:
Il a ensuite contacté AliCloud, l'ingénieur branché le disque sur un autre serveur de travail, afin qu'il puisse vérifier le disque. Puis, il se rendit compte que certains dossiers ont disparu, y compris /data/
où la mongodb est!!!
1) Nous n'avons tout simplement pas comprendre comment le bash pourrait détruire le disque, y compris /data/
;
2) Et, bien sûr, est-il possible d'obtenir le /data/
dos?
PS: il n'a pas prendre un instantané du disque avant.
- Désolé, c'est sur le système de fichiers, et pas seulement de la base de données...
- Il est relié à la coque. Nous ne comprenons pas comment la coque pourrait supprimer ces dossiers. Peut-être il y a d'autres raisons?
- La compréhension de la façon dont le shell supprimé ces dossiers nous aider à les récupérer.
- "Je ne crois pas que le script que vous avez posté ( ni d'images, dont vous n'êtes pas censé poster ici ) n'a rien à voir avec ce soit. "==> Que voulez-vous dire? Vous ne pensez pas que c'est le script qui a supprimé les dossiers? Si oui, nous pourrions nous contenter de laisser le script ici pour un moment et voir ce que les autres en pensent. Nous essayons d'autres sites et solutions en même temps.
- Vous pouvez supprimer un répertoire sans le mentionner.
- Les réponses montrent qu'il est en effet liée à la fête. Rappelle-moi de ce post.
- Si vous souhaitez que les données de retour, vous êtes au mauvais endroit. Si vous voulez savoir quel est le problème avec le code et comment le faire mieux, alors vous êtes ici.
- il y a un lien de parenté trop, comprendre comment notre base de données a été détruit nous aide à récupérer les données.
- Je pense que cela a également dit: quelqu'un qui pense
//
introduit un commentaire dansbash
n'a pas à toucher un serveur de production.
Vous devez vous connecter pour publier un commentaire.
Question 1
Raison:
$OUT_DIR
a été suppriméeDans
bash
etsh
commentaires sont écrits comme# comment
, pas//comment
.La ligne suivante va avoir les effets suivants
someValue
variablesomeVariable
, mais seulement pour qu'une seule ligne. Après que la ligne de la variable de revenir à son ancienne valeur, qui est nul dans ce cas.//not a comment
, c'est le programme//
avec les paramètresnot
,a
, etcomment
. Depuis//
est simplement un répertoire (le même que/
) ce qui va provoquer un message d'erreur et rien de plus.Droit maintenant ce comportement peut sembler étrange, mais vous avez peut-être déjà utilisé dans bien connu des idiomes comme
IFS= read -r line
ouLC_ALL=C sort
.Regardant votre script les lignes suivantes probablement à l'origine du problème:
Je suis désolé pour cela à vous, mais vous avez exécuté
rm -rf /*
depuis$OUT_DIR
élargi à la chaîne vide.Risque Potentiel Sur D'Autres Systèmes
Même si
$OUT_DIR
n'était pas vide, l'effet pourrait ont été les mêmes depuis qu'il y a un//
"commentaire" aprèsrm
. Considérer la commandeCe qui est censé supprimer les trois fichiers/répertoires
some
,//
, etthing
. Comme l'a déjà souligné//
est le même répertoire que/
.Cependant, plus implémentations de
rm
sur Linux ont la garde de cette affaire et de ne pas supprimer/
si facilement. Sur Ubuntu, vous obtiendrez le message d'avertissement suivant (n'essayez pas ceci à la maison. Serait horrible si votrerm
diffère.)Question 2
C'est hors-sujet pour StackOverflow. Cependant, vous pouvez trouver de nombreux réponses pour cette question sur d'autres stackexchange sites.
Il y a des outils de récupération, vous pouvez essayer, mais il n'y a aucune garantie que vous pouvez restaurer vos données si vous n'avez pas une sauvegarde.
set -u -e
dans le script -- ce sera la caution dès qu'une erreur s'est produite, ou lorsqu'il n'est pas attribué variable... et peut-être utiliserbash -n my_script.sh
set -Eeuo pipefail
va le garder plus sûrsomeVariable=someValue echo "someVariable=$someVariable"
mais la sortie desomeVariable=
seulement. La réponse dit que l'affectation de variable est uniquement pour que l'on ligne:. Si c'est exact, pourquoi j'obtiens une valeur vide?$var
) est l'une des premières étapes, de l'attribution des valeursvar=...
vient plus tard, Si c'était l'inverse, vous ne pouviez pas écrire des choses commevar="...$var..."
.¶ Avecvar=test bash -c 'echo "$var"'
vous obtiendrez votre résultat attendu (note les guillemets simples).//
dans les arguments derm
, de sorte qu'il aurait été une catastrophe, même si$OUT_DIR
avait été réglé correctementBasculer entre les langues peut être difficile!
//
n'est pas un commentaire de démarreur dans le shell, c'est#
. Toutes les commandes avec ces "commentaires" ont été analysées à tort et a sauté:Par conséquent,
OUT_DIR=...
a été ignorée et$OUT_DIR
était vide. Il est facile de deviner ce quealors n'. Il a été essentiellement équivalent à
Utiliser vos sauvegardes pour restaurer la base de données.
Je peux lire le Chinois libellé dans le champ commentaire, à partir de la ligne 10, l'utilisateur veut créer un dossier temp mais utilisé
cd
, donc si/data/backup/mongodb/tmp
n'existe pas, en premier lieu, puis $OUT_DIR est vide ou null, après que la ligne 11 est devenurm -rf /*
.