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
- 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
- Realiza la depuración en horarios de baja afluencia de usuarios para minimizar el impacto en la plataforma.
- 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:
- Inicia sesión en Moodle como administrador.
- Navega a Site administration > Plugins > Logging > Standard log.
- 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.
- 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:
- Accede a phpMyAdmin desde cPanel.
- Selecciona la base de datos de tu instalación Moodle.
- 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:
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));
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));
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;
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
- 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.
- 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.
- No olvides ejecutar
OPTIMIZE TABLE después de cada depuración masiva. Sin este paso, el espacio en disco no se libera realmente. - 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).
- 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.
- 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.