Cómo recuperar una base de datos desde los archivos

Situación inicial

La situación inicial es que no se puede acceder a ningún gestor de bases de datos para poder extraer la información mediante la exportación. Es decir, no está disponible ni PHPMyAdmin, ni el comando mysql del sistema, ni funciona la conexión desde un programa externo como por ejemplo MySQL Workbench.

En el caso concreto que yo me encontré, un servidor Debian se había caído y no había forma de volver a levantarlo. La única solución fue reiniciar en modo rescate, que significa que el disco duro del servidor lo conectan a otra máquina para poder extraer los archivos y poder restaurarlos finalmente en una tercera máquina.

Recuperar los archivos de la base de datos

En primer lugar hay que acceder al sistema de archivos del servidor caído, y dirigirse a la ruta en la que MySQL almacena las bases de datos. Por lo general esta ruta es /var/lib/mysql. Vamos a encontrar un listado de archivos similar a este:

Listado de archivos MySQL

Una breve explicación de lo que vemos:

  • Los directorios como dgr2893o brot1331son bases de datos.
  • Los archivos ib_logfile0, ib_logfile1 y ibdata1 vamos a tener que copiarlos a una nueva instalación.
  • El archivo mysql_upgrade_infonos va a decir la versión de MySQL o MariaDB que teníamos instalada.

Guardamos esta ubicación, ya que más adelante vamos a tener que descargar algunos de estos archivos.

Obtener la versión de MySQL o MariaDB que necesitamos

La operación que vamos a hacer es la siguiente: instalaremos en otro servidor la misma versión del gestor de bases de datos utilizado para poder recuperar los datos copiando los archivos que hemos visto antes en esta nueva instancia.

Así que para poder conocer la versión de MySQL ejecutamos este comando cat mysql_upgrade_info, que nos indicará la versión que necesitamos.

En mi caso, la versión que me indicó fue MariaDB 10.0.38.

Montar la misma versión en otro servidor

Esta operación la hice utilizando Docker. Utilicé un contenedor porque iba a ser una operación temporal, que una vez realizada tendría que eliminar.

El archivo docker-compose.yml que utilicé es el siguiente:

Como vemos, he utilizado un volumen que estará en la carpeta datos para guardar los archivos de MySQL/MariaDB, y el puerto de conexión local 3310 para que no «choque» con el puerto por defecto de la máquina actual.

Si hubiera necesitado otra versión de MySQL/MariaDB hubiera tenido que ir a DockerHub para encontrar la versión que necesito, sustituyendo el nombre de la imagen en el archivo docker-compose.yml (en las dos apariciones que tiene).

Ahora lanzamos el docker-compose con el comando docker-compose up.

Dejamos que se inicie correctamente el conjunto de contenedores, y cuando lo haya hecho salimos mediante la combinación de teclas CTRL+C. Comprobamos que en la carpeta datos ha generado una estructura de archivos similar a la de la instalación que queremos recuperar.

Restaurar los datos

Ahora copiamos de nuestro servidor dañado los directorios de las bases de datos que queremos recuperar. Por ejemplo, el directorio brot1331 si queremos recuperar la base de datos del mismo nombre.

También necesitamos los archivos ib_logfile0, ib_logfile1 y ibdata1.

La copia debe ser desde el directorio /var/lib/mysql de nuestro servidor dañado al directorio datos del docker que acabamos de montar.

En este punto volvemos a levantar nuestros contenedores con el comando docker-compose up, que ahora va a usar nuestros antiguos archivos de base de datos.

Recuperar los datos

Tenemos que conectarnos a la base de datos del docker para comprobar que funciona bien, así que ejecutamos el comando mysql -u root -p -h 127.0.0.1 -P 3310 (siempre manteniendo el Docker Compose funcionando, tendremos que abrir otra consola para hacerlo). Nos pedirá la contraseña (que según nuestro archivo docker-compose.yml es ‘test_pass‘) y podremos acceder a MySQL.

Para que reconstruya el entorno de las bases de datos que queremos recuperar tendremos que acceder a ellas, así que en el caso de la base de datos brot1331 escribimos USE brot1331;. Le diremos que nos muestre las tablas para comprobar que accedemos sin problemas: SHOW TABLES;.

Ahora salimos de MySQL una vez que hemos comprobado que podemos acceder, y extraemos la base de datos a un archivo SQL con el siguiente comando:

Detenemos los contenedores, y ya tendremos nuestra base de datos exportada en el archivo brot1331.sql lista para ser importada en otro gestor de bases de datos.

Experto en la Gestión de Proyectos Web basados en Drupal con más de 8 años de experiencia. Desarrollo Full Stack (Front-end, Back-end, Site-Builder).

No Replies to "Cómo recuperar una base de datos desde los archivos"