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:

Una breve explicación de lo que vemos:
- Los directorios como
dgr2893
obrot1331
son bases de datos. - Los archivos
ib_logfile0
,ib_logfile1
yibdata1
vamos a tener que copiarlos a una nueva instalación. - El archivo
mysql_upgrade_info
nos 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
version: '2' services: data: container_name: flask_data image: mariadb:10.0.38 volumes: - ./datos:/var/lib/mysql command: "true" mysql: container_name: flask_mysql image: mariadb:10.0.38 environment: MYSQL_ROOT_PASSWORD: 'test_pass' # TODO: Change this MYSQL_USER: 'test' MYSQL_PASS: 'pass' volumes_from: - data ports: - "3310:3306" |
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:
1 |
mysqldump -u root -p -h 127.0.0.1 -P 3310 brot1331 > brot1331.sql |
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.