☎ +34 976 234 144

Verificación y recuperación de tablas corrompidas en MySQL

FoxPress n.º 141 · julio-agosto de 2006 · Por la Redacción de FoxPress

Artículo publicado en la revista FoxPress en julio-agosto de 2006. Algunos datos, versiones y funciones citados (MySQL, PHP, Visual FoxPro, Windows) pueden haber quedado desfasados.

Es difícil que se corrompan las tablas de MySQL pero no es imposible. Pero en algunos casos es algo que puede suceder. Los principales factores que pueden llevar a esta situación son la parada inesperada de un SGBD (Sistema Administrador de la Base de Datos), en el caso de que en ese momento MySQL estuviera escribiendo alguna información al disco, esta operación se podría corromper antes de que terminara acarreando inconsistencia. Otra posibilidad sería una fallo de hardware.

La instrucción CHECK TABLE es la forma más simple de realizar la verificación de datos, ya que se aplica a cualquier tipo de tabla, y por ser una instrucción de MySQL se realiza de forma atómica, inhibiendo cualquier tentativa de alteración de la tabla durante el proceso de verificación. Este comando se puede usar con las siguientes opciones:

- QUICK:
Verifica unicamente la integridad de los índices de la tablas;

- FAST:
Sólo verifica tablas que no se hayan cerrado apropiadamente;

- CHANGED:
Verifica unicamente las tablas que hayan sido alteradas desde la última verificación;

- MEDIUM:
Recorre las filas para verificar que los enlaces borrados son correctos. Esto también calcula el checksum de clave para las filas y lo compara con un checksum calculado para las claves.

- EXTENDED:
Realiza una comprobación completa de los índices para todas las claves de cada fila. Esto asegura que la tabla es consistente al 100%, pero puede requerir mucho tiempo.

Observese que a medida que avanzamos en las opciones las complejidades de la verificación aumentan siendo la detección de problemas más estricta. Por otro lado, cuanto mayor es el nivel de verificación, mayor será el tiempo de ejecución de la tarea. De un modo general, los problemas con las tablas están asociados a sus índices:

Resultado de CHECK TABLE CHANGED sobre las tablas Cidade, Pais y Lingua, con un error en Lingua

En el ejemplo vemos que una tabla llamada Cidade está OK, esto es, no tiene ninguna anomalía. Una segunda tabla (Pais) devuelve un mensaje "Table is already up to date" que significa que esa tabla tenía alguna problema pero que ya ha sido actualizado por el propio comando de verificación. Y por último vemos que la tabla Lingua está corrompida, portanto tenemos que corregirla.

El mismo procedimiento se puede ejecutar mediante la utilidad myisamchk, caso de que la tabla sea de tipo MyISAM. myisamchk presenta vários parámetros de ejecución y se puede usar para verificar, corregur y optimizar tablas.

mysql>LOCK TABLES Cidade READ, Pais READ, Lingua READ;
 ....
 mysql>UNLOCK TABLES;

La ejecución de myisamchk para el mismo problema nos ilustra los caminos a seguir, siendo la opción -C la más utilizada que significa CHANGED. Para obter una lista completa de parámetros utilice la opción --help.

shell> cd DATADIR
 shell>myisamchk -C Cidade, Pais, Lingua

Una vez detectado el problema en la tabla, como es el ejemplo de la tabla Lingua del ejemplo anterior, es necesario corregir la estructura de esta tabla. Para la corrección de las tablas usamos el comando REPAIR TABLE, que se puede ejecutar de dos modos:

- QUICK: Corrige los índices, no manipula los datos de las tablas;

- EXTENDED: Serán recreados todos los indices de la tabla línea a línea, rehaciendo las marcas que estos indices toman de los datos.

myisamchk puede ser utilizado para la corrección de las tablas con las opciones -r o -o. A continuación vamos a hacer una corrección de la tabla Lingua a través de REPAIR TABLE o de myisamchk:

Resultados de CHECK TABLE, REPAIR TABLE y CHECK TABLE EXTENDED sobre la tabla Lingua, ya reparada

shell>cd DATADIR
 shell>myisamchk -r Lingua

En el ejemplo vemos que la tabla Lingua fue corregida con éxito por el comando REPAIR TABLE, como muestra el comando CHECK TABLE EXTENDED ejecutado en la tabla. Portanto, es bueno verificar las tablas periódicamente, como ejemplo, podriamos crear un script y tratar de hacer una verificación de todas las tablas una vez por semana. Esto se podría hacer mediante el cron en el caso de Linux, o mediante cualquier scheduler del sistema operativo.

¿Quieres llevar la IA a los datos de tu empresa?

En una auditoría gratuita de 30 minutos vemos qué caso concreto te ahorraría más trabajo.

Reservar mi auditoría →