Cómo depurar y optimizar la tabla de logs en Moodle

Cómo depurar y optimizar la tabla de logs en Moodle

Las instalaciones de Moodle con cientos o miles de usuarios activos generan una enorme cantidad de registros de actividad. La tabla principal donde se almacenan estos registros es mdl_logstore_standard_log, y con el tiempo puede crecer hasta ocupar varios gigabytes, afectando seriamente el rendimiento de la plataforma y el espacio en disco del servidor.

El problema se origina porque la configuración predeterminada de Moodle está establecida en "Never delete logs" (nunca eliminar registros), lo que significa que la tabla crece indefinidamente desde la primera instalación.

En este artículo aprenderás a diagnosticar el problema, depurar la tabla de forma segura y configurar Moodle para que mantenga los logs bajo control automáticamente. Los procedimientos son compatibles con Moodle 3.x y 4.x.

Diagnóstico: verificar el tamaño de las tablas

Antes de actuar, es importante confirmar cuáles tablas están ocupando más espacio. Ejecuta la siguiente consulta SQL desde phpMyAdmin o por línea de comandos:

SELECT table_name,
  ROUND(data_length / 1024 / 1024, 2) AS data_mb,
  ROUND(index_length / 1024 / 1024, 2) AS index_mb,
  ROUND((data_length + index_length) / 1024 / 1024, 2) AS total_mb,
  table_rows
FROM information_schema.tables
WHERE table_schema = 'nombre_base_datos'
ORDER BY (data_length + index_length) DESC
LIMIT 10;

Sustituye nombre_base_datos por el nombre real de tu base de datos de Moodle. Este resultado te mostrará las 10 tablas más grandes y te permitirá confirmar si mdl_logstore_standard_log es la que está causando el problema.

Para verificar rápidamente solo la cantidad de registros en la tabla de logs:

SELECT COUNT(*) FROM mdl_logstore_standard_log;

Antes de comenzar

  1. Realiza un respaldo de la base de datos antes de cualquier depuración. Puedes hacerlo desde phpMyAdmin (exportar) o por SSH:
mysqldump -u usuario -p nombre_base_datos mdl_logstore_standard_log > backup_logs_moodle.sql

  1. Realiza la depuración en horarios de baja afluencia de usuarios para minimizar el impacto en la plataforma.
  2. Si la tabla tiene más de 5 millones de registros, se recomienda usar el método por SSH en lugar de phpMyAdmin para evitar timeouts.

Configurar la auto-eliminación de registros

El primer paso (y el más importante a largo plazo) es configurar Moodle para que elimine los logs antiguos automáticamente:
  1. Inicia sesión en Moodle como administrador.
  2. Navega a Site administration > Plugins > Logging > Standard log.
  3. En la opción "Keep logs for", cambia el valor de "Never delete logs" a un periodo razonable. Se recomienda 365 días (1 año) como máximo.
  4. Guarda los cambios.

Moodle eliminará los registros antiguos automáticamente a través de su tarea programada de cron. Sin embargo, si la tabla ya tiene millones de registros acumulados, la tarea de cron puede no ser suficiente para reducirla rápidamente, por lo que será necesario realizar una depuración manual.

Depuración manual por phpMyAdmin

Si la tabla tiene un tamaño moderado (menos de 5 millones de registros), puedes ejecutar la depuración directamente desde phpMyAdmin:
  1. Accede a phpMyAdmin desde cPanel.
  2. Selecciona la base de datos de tu instalación Moodle.
  3. Ve a la pestaña SQL y ejecuta la siguiente consulta:
DELETE FROM mdl_logstore_standard_log WHERE timecreated < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 365 DAY));

Sustituye 365 por la cantidad de días de registros que deseas conservar.

Depuración manual por SSH (recomendado para tablas grandes)

Para tablas con millones de registros, phpMyAdmin puede dar timeout. Es más seguro y eficiente hacerlo directamente por SSH.

Eliminación directa

Conéctate a MySQL por SSH y ejecuta:

mysql -u usuario -p nombre_base_datos -e "DELETE FROM mdl_logstore_standard_log WHERE timecreated < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 365 DAY));"

Eliminación por lotes (tablas muy grandes)

Si la tabla tiene decenas de millones de registros, un solo DELETE puede bloquear la base de datos durante mucho tiempo. En estos casos, es mejor eliminar por lotes:

mysql -u usuario -p nombre_base_datos

Una vez dentro de la consola de MySQL, ejecuta el siguiente bloque repetidamente hasta que el resultado sea 0 rows affected:

DELETE FROM mdl_logstore_standard_log
WHERE timecreated < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 365 DAY))
LIMIT 100000;

Este método elimina 100,000 registros a la vez, reduciendo la carga en el servidor y evitando bloqueos prolongados. Puedes automatizarlo con un script en bash:

while true; do
  rows=$(mysql -u usuario -pCONTRASENA nombre_base_datos -se "DELETE FROM mdl_logstore_standard_log WHERE timecreated < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 365 DAY)) LIMIT 100000; SELECT ROW_COUNT();")
  echo "Eliminados: $rows"
  if [ "$rows" -eq 0 ]; then break; fi
  sleep 2
done

Nota: Sustituye usuario, CONTRASENA y nombre_base_datos por los valores reales. El sleep 2 agrega una pausa de 2 segundos entre cada lote para no saturar el servidor.

Optimizar la tabla después de la depuración

Eliminar registros no libera el espacio en disco automáticamente en tablas InnoDB. Para recuperar el espacio, ejecuta OPTIMIZE TABLE después de la depuración:

OPTIMIZE TABLE mdl_logstore_standard_log;

Importante: Este proceso puede tomar varios minutos dependiendo del tamaño de la tabla. Durante la optimización, la tabla se bloquea temporalmente. Ejecútalo en horarios de baja actividad.

Otras tablas que suelen crecer en exceso

Además de mdl_logstore_standard_log, las siguientes tablas también pueden crecer de forma descontrolada en Moodle:
  1. mdl_sessions — Almacena sesiones activas e inactivas. Puedes eliminar sesiones antiguas con:
DELETE FROM mdl_sessions WHERE timemodified < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 7 DAY));

  1. mdl_task_log — Registros de las tareas programadas de Moodle. Puede acumular millones de entradas:
DELETE FROM mdl_task_log WHERE timestart < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY));

  1. mdl_logstore_legacy_log — Tabla de logs del sistema legacy (versiones anteriores a Moodle 2.7). Si ya no la necesitas:
TRUNCATE TABLE mdl_logstore_legacy_log;

  1. mdl_config_log — Historial de cambios de configuración de Moodle. Puede depurarse conservando los últimos 90 días:
DELETE FROM mdl_config_log WHERE timemodified < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 90 DAY));

Recuerda ejecutar OPTIMIZE TABLE en cada tabla que hayas depurado.

Forzar la ejecución del cron de limpieza

Después de configurar la auto-eliminación en Moodle, puedes forzar la ejecución inmediata de la tarea programada de limpieza de logs por CLI:

php /home/usuario/public_html/admin/cli/scheduled_task.php --execute='\logstore_standard\task\cleanup_task'

Sustituye /home/usuario/public_html por la ruta real de tu instalación de Moodle.

Recomendaciones

  1. Configura siempre la auto-eliminación de logs desde la administración de Moodle. Esto previene que el problema vuelva a ocurrir. El valor recomendado es 365 días como máximo.
  2. Para tablas con más de 5 millones de registros, utiliza la eliminación por lotes en lugar de un solo DELETE para evitar bloqueos prolongados en la base de datos.
  3. No olvides ejecutar OPTIMIZE TABLE después de cada depuración masiva. Sin este paso, el espacio en disco no se libera realmente.
  4. Programa una revisión del tamaño de la base de datos al menos una vez al trimestre, especialmente en periodos de alta actividad (inscripciones, exámenes).
  5. Si tu instalación de Moodle tiene más de 3 años y nunca se han depurado los logs, es muy probable que esta sea la causa principal de lentitud en la plataforma.
  6. Asegúrate de que el cron de Moodle esté ejecutándose correctamente (php admin/cli/cron.php), ya que es el responsable de la limpieza automática.

    • Related Articles

    • Cómo aumentar el límite de memoria en WordPress desde cPanel

      En ocasiones, al instalar o usar temas y plugins en WordPress, puedes encontrarte con errores relacionados con el memory limit o límite de memoria asignado a PHP. Algunos mensajes comunes son: Allowed memory size of xxx bytes exhausted... Fatal ...
    • ¿Qué es y cómo configurar WP Accelerate?

      WP Accelerate es un plugin diseñado para WordPress, el cual cuenta con un conjunto de optimizaciones diseñadas para mejorar el rendimiento de los sitios WordPress alojados en entornos con cPanel y CloudLinux. Integra diversas técnicas y herramientas ...
    • Cómo bloquear xmlrpc.php en WordPress: Guía para reducir CPU y prevenir ataques

      El archivo xmlrpc.php ha sido parte del núcleo de WordPress desde sus primeras versiones y permite la comunicación remota con el sitio web, sin embargo, su uso indebido o no controlado puede generar problemas de rendimiento y seguridad en tu página. ...
    • Cómo modificar el archivo hosts en Windows, Linux y macOS

      El archivo hosts es un archivo de texto presente en todos los sistemas operativos que permite asociar nombres de dominio con direcciones IP de forma local, sin depender de los servidores DNS. Tu computadora consulta este archivo antes de realizar ...
    • Cómo cambiar los DNS en Windows y macOS – Guía paso a paso

      Los DNS (Domain Name System o Sistema de Nombres de Dominio) son los encargados de traducir los nombres de los sitios web (como www.webzi.mx) en direcciones IP que las computadoras pueden entender. Tu proveedor de internet asigna servidores DNS de ...