martes, 23 de agosto de 2011

MySQL: Base de Datos con Tabla(s) Corrupta/Inconsistente

Las tres etapas que seguí para hallar el problema de una tabla corrupta, son los siguientes:
  1. Síntomas
  2. Detección
  3. Resolución
La siguiente figura[4] muestra todo el proceso:


Síntomas
  • uso intensivo de la(s) CPU(s),
  • no es posible realizar un backup de una base de datos mediante el comando mysqldump.
  • ningún usuario se puede logear en Moodle, y se muestra el mensaje: "Could not create guest user record !!!"
  • mensaje de error por email:
" Insert into log table failed at Tuesday 06th of September 2011 06:19:40 PM.
It is possible that your disk is full.

The failed SQL is:

INSERT INTO mdl_log (time, userid, course, ip, module, cmid, action, url, info)
VALUES ('1315343980', '31', '0', '190.173.227.212', 'login', '0', 'error', 'index.php', 'usuario') "

En caso de estar corrupta la tabla mdl_users, los síntomas son varios y en alguno cursos puede suceder:
  • Muestra que "no hay Usuarios en línea" ya sea en la portada de Moodle o dentro de los cursos que tengan tal bloque html
  • En el listado de Participantes, no se muestra ninguno (con el filtro de rol: todos).
  • A la hora de agregar manualmente un estudiante, bloque administración del curso -> Asignar roles, no es posible ya que no se puede buscar ni si quiera en los usuarios potenciales.
  • Desaparecen las respuestas en los foros [8].


Resolución
Antes de comenzar con la etapa de Resolución
Ingresar como administrador en Moodle y en el bloque de Administración habilitar el "Modo de mantenimiento" (Servidor -> Modo de mantenimiento).


Opción1: Línea de comandos
El comando "mysqlcheck"[1] trabaja con el motor de base de datos MySql en ejecución. Es decir, NO es necesario detener el servicio de MySql, de hecho debe estar ejecutándose.

Otro modo de resolver este inconveniente
Es utilizar el comando "myisamchk"[2, 3], sin embargo, en esta ocación se requiere detener el servicio de MySql.


Opción2: MySQL Admin/PHPMyAdmin [6, 7]
En la sección de la base de datos, seleccionar la BD de Moodle.
Click el tab SQL, y en "Run SQL query/queries on database moodle" escribir REPAIR TABLE mdl_tablename
Click en el botón Go.
Por ejemplo, para reparar la tabla de logs, escribir REPAIR TABLE mdl_log

De manera similar, para verificar la tabla de logs de Moodle, escribir CHECK TABLE mdl_log.
Ésto nos indicará su estado OK o si algo está mal, por ejemplo, podría decir "Table marked as crashed".



Adicionalmente, si tenemos replicada nuestra base de datos[5], este problema de tabla corrupta detendrá el proceso de sincronización, y requerirá volver a poner a punto la sincronización entre servidores manulamente.