Búsqueda de sitios web

Cómo arreglar tablas corruptas en MySQL


Introducción

Ocasionalmente, las tablas de MySQL pueden corromperse, lo que significa que se ha producido un error y los datos contenidos en ellas no se pueden leer. Los intentos de leer de una tabla dañada generalmente provocarán que el servidor se bloquee.

Algunas causas comunes de tablas corruptas son:

  • El servidor MySQL se detiene en medio de una escritura.
  • Un programa externo modifica una tabla que el servidor está modificando simultáneamente.
  • La máquina se apaga inesperadamente.
  • El hardware de la computadora falla.
  • Hay un error de software en alguna parte del código MySQL.

Si sospecha que una de sus tablas se ha dañado, debe hacer una copia de seguridad de su directorio de datos antes de solucionar el problema o intentar arreglar la tabla. Esto ayudará a minimizar el riesgo de pérdida de datos.

Primero, detenga el servicio MySQL:

  1. sudo systemctl stop mysql

Nota: En algunas plataformas como Rocky Linux, el servicio MySQL puede llamarse mysqld en su lugar.

Luego copie todos sus datos en un nuevo directorio de respaldo. En los sistemas Ubuntu, el directorio de datos predeterminado es /var/lib/mysql/:

  1. cp -r /var/lib/mysql /var/lib/mysql_bkp

Después de hacer la copia de seguridad, está listo para comenzar a investigar si la tabla está realmente dañada. Si la tabla usa el motor de almacenamiento MyISAM, puede verificar si está dañada reiniciando MySQL y ejecutando una instrucción CHECK TABLE desde el indicador de MySQL:

  1. sudo systemctl start mysql
  1. CHECK TABLE table_name;

Aparecerá un mensaje en la salida de esta declaración que le permitirá saber si está dañado o no. Si la tabla MyISAM está realmente dañada, generalmente se puede reparar emitiendo una instrucción REPAIR TABLE:

  1. REPAIR TABLE table_name;

Suponiendo que la reparación fue exitosa, verá un mensaje como este en su salida:

Output
+--------------------------+--------+----------+----------+ | Table | Op | Msg_type | Msg_text | +--------------------------+--------+----------+----------+ | database_name.table_name | repair | status | OK | +--------------------------+--------+----------+----------+

Sin embargo, si la tabla aún está dañada, la documentación de MySQL sugiere algunos métodos alternativos para reparar las tablas dañadas.

Por otro lado, si la tabla dañada usa el motor de almacenamiento InnoDB, entonces el proceso para repararlo será diferente. InnoDB es el motor de almacenamiento predeterminado en MySQL a partir de la versión 8.0 y presenta operaciones automatizadas de verificación y reparación de daños. InnoDB busca páginas corruptas realizando sumas de verificación en cada página que lee, y si encuentra una discrepancia en la suma de verificación, detendrá automáticamente el servidor MySQL.

Rara vez es necesario reparar las tablas de InnoDB, ya que InnoDB cuenta con un mecanismo de recuperación de fallas que puede resolver la mayoría de los problemas cuando se reinicia el servidor. Sin embargo, si se encuentra con una situación en la que necesita reconstruir una tabla InnoDB dañada, la documentación de MySQL recomienda usar la copia de seguridad de la tabla, que conservará la estructura de la tabla y los datos que contiene, y luego volver a cargar la tabla en la base de datos.

Con eso en mente, intente reiniciar el servicio MySQL para ver si hacerlo le permitirá acceder al servidor:

  1. sudo systemctl restart mysql

Si el servidor sigue colapsado o inaccesible, entonces puede ser útil habilitar la opción force_recovery de InnoDB. Puede hacerlo editando el archivo mysqld.cnf. En los sistemas Ubuntu y Debian, este archivo suele estar en etc/mysql. En los sistemas Red Hat y Rocky, este archivo suele estar en /etc/my.cnf.d.

  1. sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

En la sección [mysqld], agregue la siguiente línea:

. . .
[mysqld]
. . .
innodb_force_recovery=1

Guarde y cierre el archivo, y luego intente reiniciar el servicio MySQL nuevamente. Si puede acceder con éxito a la tabla dañada, utilice la utilidad mysqldump para volcar los datos de la tabla en un nuevo archivo. Puedes nombrar este archivo como quieras, pero aquí lo llamaremos out.sql:

  1. mysqldump database_name table_name > out.sql

Luego suelte la tabla de la base de datos. Para evitar tener que volver a abrir el indicador de MySQL, puede usar la siguiente sintaxis:

  1. mysql -u user -p --execute="DROP TABLE database_name.table_name"

A continuación, restaure la tabla con el archivo de volcado que acaba de crear:

  1. mysql -u user -p < out.sql

Tenga en cuenta que el motor de almacenamiento InnoDB generalmente es más tolerante a fallas que el antiguo motor MyISAM. Las tablas que usan InnoDB pueden corromperse, pero debido a sus características de recuperación automática, el riesgo de corrupción de tablas y fallas es notablemente menor.