Recuperar una base de datos en MySQL sin fichero ibdata1

Posted by in Bases de datos, MariaDB, MySQL

Normalmente, cuando empiezas a trastear, a veces, ocurren los desastres. Y eso es lo que me he encontrado con la base de datos de mi tesis, que, de buenas a primeras, se ha corrompido, y me es imposible acceder a ella. O intento acceder y no veo nada, a pesar de que los ficheros tienen bastante tamaño (algunos).

NOTA: Este tutorial lo estoy escribiendo a la misma vez que lo voy ejecutando, sin ni siquiera saber si el resultado será el esperado. Haga siempre una copia de seguridad antes de cualquier acción, por lo que pueda pasar!

Al principio, me resultaba imposible incluso correr el servidor, pero después de varios cacharreos, me encuentro con que puedo arrancar el servidor, pero no veo ninguna tabla:

Servidor arrancado

Como puedes comprobar, hay un problema en la secuencia de números del log, que no cuadran, y …. al ver la base de datos completa en el administrador, tengo toda la estructura, pero ninguna tabla:

Estructura de la base de datos …. sin datos

Sin embargo, si accedemos a los ficheros, se puede comprobar de que están bastante llenos:

Contenido de la carpeta de datos de MySQL

Después de varias averiguaciones, y buscar en Internet diferentes soluciones, el problema sucede porque el fichero ibdata1 no está, o está mal.

Recuperando un backup

Menos mal, que disponía de un backup de hace un tiempo, y parte de las bases de datos las tenía disponibles, si bien no con lo último.

Así que, una de las soluciones que me han planteado es la que voy a probar aquí:

  • Migrar la estructura de la base de datos
  • Parar el servidor
  • Copiar el directorio de la base de datos a reparar
  • Volver a arrancar el servidor

Así que, cargamos el fichero sql con la copia del directorio, y … obtenemos un «bonito» error 1010:

Error 1010 en MySQL

Básicamente, la base de datos no puede borrar ese directorio, tal y cómo aprendí aquí. Así que, vamos al explorador de archivos, y borramos el directorio directamente:

Directorio eliminado

Volvemos al administrador heidiSQL (también puedes usar MySQL WorkBench) y volvemos a ejecutar el script de creación de la estructura de la base de datos a recuperar, y ahora se ejecuta correctamente:

Script de creación de base de datos ejecutado tras solventar error 1010

En la siguiente imagen tenemos la estructura de la base de datos que vamos a intentar recuperar:

Estructura de la base de datos

Ahora toca parar la base de datos. Cómo estamos con xampp, ejecutamos mysql_stop desde una línea de comandos:

Parada del servidor

Ahora es el momento de reemplazar el directorio que se ha creado, por el que en realidad contiene los datos, que hemos copiado previamente en otra ubicación.

Reemplazo de directorio

Por precaución, he decidido renombrar el directorio, en lugar de borrarlo directamente (siempre hay tiempo de borrar!!!). Y volvemos a arrancar el servidor:

Reiniciando el servidor

Lamentablemente, MySQL se da cuenta de nuestra «jugada», y protesta enérgicamente: detecta que el id no se corresponde con lo que debiera y nos envia la solución: https://dev.mysql.com/doc/refman/5.6/en/innodb-troubleshooting-datadict.html.

Así que, vuelta a ejecutar el script de recreación de la base de datos, tras nuevamente, borrar la base de datos. Ahora hay que escribir la siguiente instrucción: ALTER TABLE solar_comun._version DISCARD TABLESPACE;

Ahora, podemos copiar los ficheros de la tabla _version sin problema.

Y ejecutamos:

ALTER TABLE solar_comun._version IMPORT TABLESPACE;
SHOW WARNINGS;

Y el resultado es:

Recreando tablespace

Y probamos a ver qué ha sucedido con la tabla _version:

SELECT * FROM _version

Y tenemos nuestra tabla de vuelta. Ahora, podemos ejecutar lo mismo con el resto de tablas, y tendremos recuperada nuestra base de datos con la última versión.

Lecciones aprendidas de este episodio

Cómo de todo hay que sacar lo bueno, me quedo con que aun disponiendo de los ficheros .frm y .idb es posible recomponer la base de datos que se ha corrompido.

Es muy necesario conocer la versión concreta de la base de datos, en mi caso, era MySQL 5.6.24, ya que es vital para que la recomposición de la base de datos sea correcta.

Dado que el problema ya está ocasionado, es conveniente ir tabla a tabla, una a una, porque hay muchos pasos que dar, y no seguir el orden puede ocasionar que el resultado no sea el esperado.

Y por último, que las copias de seguridad están para algo, y si no, puedes leer esta entrada que ya escribí en 2013, o esperas a una nueva actualización de copias de seguridad que en breve publicaré también en el blog.

Al final, conseguí recuperar la base de datos al completo:

Base de datos recuperada

Espero que les haya resultado de utilidad, y os invito a que colaboréis con el blog con vuestra donación.