Saltar al contenido

Base de datos eliminada accidentalmente por un script bash, rescate por favor

Buscamos en diferentes foros y así de esta manera mostrarte la respuesta a tu inquietud, si tienes dificultades puedes dejar la duda y contestaremos con mucho gusto, porque estamos para servirte.

Solución:

Pregunta 1

1) Simplemente no entendemos cómo bash podría destruir el disco, incluidos /data/;

Razón: $OUT_DIR estaba desarmado

En bash y sh los comentarios se escriben como # comment, no // comment.
La siguiente línea tendrá los siguientes efectos.

someVariable=someValue // not a comment
  • Asignar someValue a variable someVariable, pero solo para esa línea. Después de esa línea la variable volverá a su valor anterior, cual es null en este caso.
  • Ejecutar el “comando” // not a comment, ese es el programa // con los parametros not, a, y comment. Ya que // es solo un directorio (lo mismo que /) esto causará un mensaje de error y nada más.

En este momento, este comportamiento puede parecer extraño, pero es posible que ya lo hayas usado en modismos conocidos como IFS= read -r line o LC_ALL=C sort.

Mirando su secuencia de comandos, las siguientes líneas probablemente causaron el problema:

OUT_DIR=/data/backup/mongodb/tmp // ...
...
rm -rf $OUT_DIR/*

Lamento traerte esto, pero básicamente ejecutaste rm -rf /* ya que $OUT_DIR expandido al vacío string.

Riesgo potencial en otros sistemas

Incluso si $OUT_DIR no estaba vacío el efecto pudo han sido los mismos desde que hay un // “comentario” después rm. Considere el comando

rm -rf some // thing

Se supone que esto elimina los tres archivos/directorios some, //, y thing. Como ya se ha señalado // es el mismo directorio que /.

Sin embargo, más implementaciones de rm en Linux tiene un protector para este caso y no eliminará / Tan fácilmente. En Ubuntu obtendrá la siguiente advertencia (No intentes esto en casa. Apestaría si tu rm difiere)

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

Pregunta 2

2) Y por qué, ¿es posible recuperar /datos/?

Esto está fuera de tema para StackOverflow. Sin embargo, puede encontrar muchas respuestas a esta pregunta en otros sitios de stackexchange.

Hay herramientas de recuperación que puede probar, pero no hay garantía de que pueda restaurar sus datos si no tiene una copia de seguridad.

¡Cambiar entre idiomas puede ser complicado! // no es un iniciador de comentarios en shell, es #. Todos los comandos con estos “comentarios” se analizaron incorrectamente y se omitieron:

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

Por lo tanto, OUT_DIR=... fue ignorado y $OUT_DIR estaba vacio. Es fácil adivinar qué

rm -rf $OUT_DIR/*

entonces lo hizo. Básicamente era equivalente a

rm -rf /*

Utilice sus copias de seguridad para restaurar la base de datos.

Puedo leer las palabras en chino en el campo de comentarios, desde la línea 10, el usuario quiere crear una carpeta temporal pero usó cd, Así que si /data/backup/mongodb/tmp no existe en primer lugar, entonces $OUT_DIR está vacío o null, después de que la línea 11 se convirtió en rm -rf /*.

Si eres capaz, puedes dejar un artículo acerca de qué te ha gustado de esta división.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *