Cómo reparar bases de datos y tablas MySQL

GuíasBases de datosLinuxMySQLProgramacionSistemasSQL

A medida que una base de datos crece y es modificada es posible que aparezcan ciertos errores de vez en cuando. MySQL dispone de diversos comandos o herramientas que puedes utilizar para reparar las tablas de una base de datos corrupta. Lo único que necesitarás es tener acceso root a MySQL. Para reparar una tabla te recomendamos que sigas los pasos de esta guía.

Crea una copia de seguridad de la base de datos

Antes de realizar las operaciones de esta guía es más que recomendable que crees una copia de seguridad de todas las bases de datos de tu sistema o de tu servidor por si ocurre algo inesperado. Para ello sigue estos pasos:

  1. Abre una ventana de terminal o conéctate a tu servidor mediante SSH.
  2. Para la ejecución del servidor MySQL con uno de estos comandos, dependiendo de tu distribución de Linux:
    • Para sistemas Ubuntu o Debian ejecuta el siguiente comando:
      service mysql stop
    • Para sistemas Fedora o CentOS ejecuta el siguiente comando:
      service mysqld stop
  3. Ahora utiliza el siguiente comando para copiar todos los archivos de todas las bases de datos existentes a un directorio cuyo nombre será la fecha actual. De este modo te asegurarás de que el directorio no existe y es único.
    cp -rfv /var/lib/mysql /var/lib/mysql$(date +%s)

    La fecha vendrá dada en la forma del número de segundos transcurridos desde el año 1970. Cuando finalice la copia, es recomendable que copies este directorio a otro sistema.

  4. Inicia el servidor MySQL con uno de estos comandos, dependiendo de tu distribución:
    • En sistemas Ubuntu o Debian ejecuta el siguiente comando:
      service mysql start
    • En sistemas Fedora o CentOS ejecuta el siguiente comando:
      service mysqld start

Una vez hayas copiado los backups a un lugar seguro, procede con la reparación de las tablas.

Repara la base de datos y las tablas

Para ello utilizaremos la herramienta de línea de comandos mysqlcheck, diseñada específicamente para comprobar y reparar las bases de datos. Para que funcione correctamente, es imprescindible que el proceso de MySQL se esté ejecutando. La aplicación mysqlcheck funciona tanto con tablas MyISAM como con tablas InnoDB. Debes seguir estos pasos:

  1. A través de la terminal o de un cliente SSH, sitúate en el directorio en el que está instalado mysqlcheck.
    cd /var/lib/mysql
  2. Ejecuta mysqlcheck según quieras comprobar los errores de toda una base de datos o solamente una tabla:
    • Si quieres comprobar todas las tablas de una base de datos, ejecuta mysqlcheck con el siguiente comando, reemplazando base_de_datos por el nombre de la base de datos que quieres reparar:
      mysqlcheck base_de_datos
    • Si quieres comprobar una sola tabla de una base de datos, ejecuta mysqlcheck con el siguiente comando, reemplazando base_de_datos por el nombre de la base de datos y tabla por el nombre de la tabla que quieres comprobar :
      mysqlcheck base_de_datos tabla
  3. Mysqlcheck comprobará la base de datos o tabla especificada y, si no encuentra ningún error, se mostrará un mensaje de OK al lado del nombre de la tabla. En caso de que se encuentre un error en alguna tabla, tendrás que ejecutar el siguiente comando para reparar la tabla cuando finalice la comprobación, reemplazando base_de_datos por el nombre de la base de datos y tabla por el nombre de la tabla que quieres reparar:
    mysqlcheck -r base_de_datos tabla

En caso de que no consigas reparar las tablas por este método, prueba los siguientes métodos específicos para el motor que utiliza la base de datos.

Reparación avanzada de tablas

Si no has conseguido reparar la base de datos mediante el método anterior, prueba con uno de los siguientes métodos específicos para cada uno de los dos motores de almacenamiento más utilizados. Para identificar el motor de almacenamiento de una tabla, conéctate a MySQL y ejecuta la siguiente consulta, reemplazando base_de_datos por el nombre de la base de datos:

SELECT TABLE_NAME, ENGINE FROM information_schema.TABLES where TABLE_SCHEMA = 'base_de_datos';

Se mostrará una lista con todas las tablas de la base de datos seleccionada, junto con el motor de almacenamiento que utiliza cada una. Ahora sigue uno de los dos siguientes métodos específicos.

Cómo reparar una tabla MyISAM

Si la tabla utiliza el motor de almacenamiento MyISAM, puedes utilizar la herramienta myisamchk para repararla, diseñada específicamente para estas tablas, por lo que no funcionará con otros motores como InnoDB. En los siguientes pasos se muestra cómo hacerlo:

  1. Abre una ventana de terminal o conéctate a tu servidor por SSH.
  2. Para la ejecución del servidor MySQL con uno de estos dos comandos:
    • Si tu distribución es Ubuntu o Debian ejecuta este comando:
      service mysql stop
    • Si tu distribución es Fedora o CentOS ejecuta esta comando:
      service mysqld stop
  3. Sitúate en el directorio en el que está instalado MySQL:
    cd /var/lib/mysql
  4. Ejecuta la utilidad myisamchk, reemplazando tabla por el archivo de la tabla que quieres comprobar:
    myisamchk tabla

    El comando myisamchk funciona con archivos, por lo que tendrás que especificar la ruta del mismo. Las bases de datos suelen estar también en el directorio /var/lib/mysql. Verás diferentes directorio representativos de cada base de datos y, en su interior, podrás encontrar varios archivos, que son las tablas en sí mismas.

    Si quieres comprobar todas las tablas de una base de datos, ejecuta el siguiente comando:

    myisamchk *.MYI

    Si el comando anterior falla, prueba a borrar los archivos temporales de MySQL, ya que en algunos casos impiden que herramienta myisamchk funcione como debería. Para hacerlo, sitúate en el directorio /var/lib/mysql y ejecuta este comando para ver los archivos temporales, que en MySQL tienen extensión .TMD:

    ls */*.TMD

    Si el comando anterior muestra archivos, elimínalos con el siguiente comando y, seguidamente, ejecuta myisamchk de nuevo:

    rm */*.TMD
  5. Si myisamchk encuentra alguna tabla en mal estado ejecuta el siguiente comando para repararla, reemplazando tabla por la ruta del archivo de la tabla MySQL:
    myisamchk --recover tabla
  6. Una vez hayas reparado todas las tablas, debes iniciar MySQL con uno de estos dos comandos, dependiendo de la distribución que utilices:
    • Si tu distribución es Ubuntu o Debian ejecuta este comando:
      service mysql start
    • Si tu distribución es Fedora o CentOS ejecuta esta comando:
      service mysqld start

Y esto debería ser todo lo que necesites para reparar tablas MyISAM. En este enlace podrás encontrar más información acerca del comando myisamchk.

Cómo reparar una tabla InnoDB

Si la tabla utiliza el motor de almacenamiento InnoDB, puedes ejecutar el proceso de recuperación o recovery de InnoDB siguiendo estos pasos:

  1. Abre una ventana de terminal o conéctate a tu servidor por SSH.
  2. Edita el archivo my.cnf con tu editor de textos preferido. El archivo puede estar localizado en diferentes lugares dependiendo de tu distribución de Linux:
    • Si tu distribución es Ubuntu o Debian el archivo estará en el directorio /etc/mysql:
    • Si tu distribución es Fedora o CentOS el archivo estará en el directorio /etc.

    Si te sitúas en el directorio especificado, puedes editar el archivo con nano u otro editor de texto.

    nano my.cnf
  3. Dentro del archivo my.cnf, localiza la sección [mysqld] y agrega la siguiente línea en dicha sección:
    innodb_force_recovery=4
  4. Guarda los cambios del archivo y sal del editor. Si usas nano puedes hacerlo pulsando CTRL + X y confirmando los cambios con y.
  5. Reinicia MySQL con uno de estos comandos:
    • Si tu distribución es Ubuntu o Debian ejecuta este comando:
      service mysql restart
    • Si tu distribución es Fedora o CentOS ejecuta esta comando:
      service mysqld restart
  6. Ejecuta el siguiente comando para exportar todas las bases de datos a un archivo llamado bases_de_datos.sql:
    mysqldump --all-databases --add-drop-database --add-drop-table > bases_de_datos.sql
  7. Conéctate a MySQL e intenta eliminar las tablas o las bases de datos problemáticas con la sentencia DROP, reemplazando base_de_datos por el nombre de la base de datos y tabla por el nombre de la tabla:
    • Para eliminar una base de datos:
      DROP DATABASE base_de_datos;
    • Para eliminar una tabla:
      USE base_de_datos;
      DROP TABLE tabla

    Si tienes problemas para eliminar una base de datos, prueba a seguir esta guía acerca de cómo eliminar una base de datos MySQL. Si aún así tienes problemas, para la ejecución de MySQL con el comando service mysqld stop (CentOS, Fedora) o el comando service mysql stop (Ubuntu, Debian) y borra el archivo de la base de datos manualmente, que seguramente esté en el directorio /var/lib/mysql. Puedes hacerlo con este comando, reemplazando base_de_datos por el nombre de la base de datos:

    cd /var/lib/mysql
    rm -rf base_de_datos
  8. Para la ejecución de MySQL con uno de estos dos comandos, dependiendo de la distribución que utilices:
    • Si tu distribución es Ubuntu o Debian ejecuta este comando:
      service mysql stop
    • Si tu distribución es Fedora o CentOS ejecuta esta comando:
      service mysqld stop
  9. Abre de nuevo el archivo my.cnf y elimina o comenta (#) la siguiente línea de modo que quede como puedes ver aquí para así deshabilitar el modo recovery de InnoDB:
    #innodb_force_recovery=4
  10. Guarda los cambios del archivo my.cnf y reinicia el servidor MySQL con uno de estos dos comandos:
    • Si tu distribución es Ubuntu o Debian ejecuta este comando:
      service mysql start
    • Si tu distribución es Fedora o CentOS ejecuta esta comando:
      service mysqld start
  11. Utiliza el siguiente comando para restaurar las bases de datos de la copia de seguridad que has hecho anteriormente, archivo al que hemos llamado bases_de_datos.sql:
    mysql < bases_de_datos.sql

    Con esto ya debería estar todo en orden. Si quieres, también puedes consultar más información acerca del recovery de InnoDB.

Ya solo te falta probar la base de datos, que ya debería estar reparada.