SHOW EVENTS

SHOW EVENTS muestra la lista de eventos programados en una base de datos de MySQL. Es la forma más rápida de consultar qué eventos existen, cuál es su estado (habilitado o deshabilitado), con qué frecuencia se ejecutan y cuándo está programada la próxima ejecución.

Cuando gestionas un servidor con decenas de eventos programados, necesitas una forma eficiente de saber qué se está ejecutando, qué está pausado y qué eventos han dejado de funcionar. SHOW EVENTS y la tabla information_schema.EVENTS son las dos herramientas que MySQL ofrece para esta tarea, cada una con un nivel de detalle diferente.

Sintaxis de SHOW EVENTS

La sintaxis básica muestra todos los eventos de la base de datos actual:

SHOW EVENTS;

Esta sentencia devuelve una tabla con información resumida de cada evento: el nombre, el usuario creador (definer), la zona horaria, el tipo de evento (puntual o recurrente), la programación, la fecha de última ejecución y el estado.

Para ver los eventos de una base de datos diferente a la actual, usa la cláusula FROM o IN:

SHOW EVENTS FROM tienda;
SHOW EVENTS IN mantenimiento;

Ambas formas son equivalentes. Necesitas el privilegio EVENT en la base de datos que consultas para poder ver sus eventos.

Columnas del resultado

El resultado de SHOW EVENTS incluye las siguientes columnas, y cada una proporciona información relevante para entender el estado de tus eventos.

La columna Db indica la base de datos a la que pertenece el evento. La columna Name muestra el nombre del evento tal como fue definido en CREATE EVENT. Definer es el usuario bajo cuyos privilegios se ejecuta el evento, en formato 'usuario'@'host'.

La columna Time zone muestra la zona horaria que estaba activa cuando se creó el evento. MySQL almacena las fechas de programación relativas a esta zona horaria, lo que es relevante si el servidor cambia de zona horaria o si diferentes eventos fueron creados con zonas horarias distintas.

Type indica si el evento es ONE TIME (puntual, creado con AT) o RECURRING (recurrente, creado con EVERY). Execute at muestra la fecha de ejecución para eventos puntuales, mientras que Interval value e Interval field muestran el intervalo para eventos recurrentes (por ejemplo, 1 y DAY para un evento que se ejecuta diariamente).

La columna Starts y Ends muestran las fechas de inicio y fin para eventos recurrentes con cláusula STARTS y ENDS. Status puede ser ENABLED, DISABLED o SLAVESIDE_DISABLED. Finalmente, Originator indica el ID del servidor que creó el evento, lo cual es relevante en entornos de replicación.

Filtrar con LIKE

Puedes filtrar los eventos mostrados usando un patrón LIKE que se aplica sobre el nombre del evento. Esto es muy útil cuando tienes muchos eventos y solo quieres ver los que siguen una convención de nombres determinada.

SHOW EVENTS LIKE 'purgar%';

Esta sentencia muestra solo los eventos cuyo nombre empieza por purgar. El patrón sigue las mismas reglas que el operador LIKE de SQL: % sustituye cualquier secuencia de caracteres y _ sustituye un solo carácter.

Otros ejemplos de filtrado habituales:

-- Eventos que contienen "estadisticas" en el nombre
SHOW EVENTS LIKE '%estadisticas%';
 
-- Eventos que empiezan por "evt_" (prefijo de convención)
SHOW EVENTS LIKE 'evt_%';
 
-- Eventos de una base de datos específica con filtro
SHOW EVENTS FROM tienda LIKE '%diario%';

El filtro LIKE solo se aplica al nombre del evento. Si necesitas filtrar por estado, tipo, frecuencia o cualquier otro criterio, deberás recurrir a information_schema.EVENTS, que permite usar toda la potencia de una consulta SELECT con WHERE.

Consultar information_schema.EVENTS

La tabla information_schema.EVENTS contiene información mucho más detallada que SHOW EVENTS. Mientras que SHOW EVENTS es una vista rápida, information_schema.EVENTS permite consultas complejas con filtros, ordenación y agrupación.

SELECT
    EVENT_NAME,
    EVENT_TYPE,
    STATUS,
    INTERVAL_VALUE,
    INTERVAL_FIELD,
    LAST_EXECUTED,
    STARTS,
    ENDS,
    EVENT_COMMENT
FROM information_schema.EVENTS
WHERE EVENT_SCHEMA = DATABASE()
ORDER BY EVENT_NAME;

Las columnas más importantes de esta tabla merecen una explicación detallada, ya que proporcionan información que no está disponible en SHOW EVENTS.

EVENT_NAME y EVENT_SCHEMA

Identifican unívocamente cada evento. EVENT_SCHEMA es la base de datos y EVENT_NAME es el nombre del evento dentro de esa base de datos. Puedes usar estas columnas para buscar eventos en todas las bases de datos del servidor:

SELECT EVENT_SCHEMA, EVENT_NAME, STATUS
FROM information_schema.EVENTS
ORDER BY EVENT_SCHEMA, EVENT_NAME;

EVENT_TYPE

Indica si el evento es ONE TIME (puntual) o RECURRING (recurrente). Es útil para separar eventos temporales de eventos de mantenimiento permanente:

-- Solo eventos recurrentes activos
SELECT EVENT_NAME, INTERVAL_VALUE, INTERVAL_FIELD, LAST_EXECUTED
FROM information_schema.EVENTS
WHERE EVENT_SCHEMA = DATABASE()
  AND EVENT_TYPE = 'RECURRING'
  AND STATUS = 'ENABLED'
ORDER BY LAST_EXECUTED DESC;

EXECUTE_AT

Para eventos puntuales, contiene la fecha y hora en la que se ejecutará (o se ejecutó). Para eventos recurrentes, esta columna es NULL. Es muy útil para verificar si un evento puntual ya se ejecutó o todavía está pendiente:

SELECT EVENT_NAME, EXECUTE_AT,
    CASE
        WHEN EXECUTE_AT > NOW() THEN 'Pendiente'
        ELSE 'Ejecutado'
    END AS estado_ejecucion
FROM information_schema.EVENTS
WHERE EVENT_SCHEMA = DATABASE()
  AND EVENT_TYPE = 'ONE TIME';

INTERVAL_VALUE e INTERVAL_FIELD

Para eventos recurrentes, estas columnas indican la frecuencia de ejecución. INTERVAL_VALUE es el número y INTERVAL_FIELD es la unidad (SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, etc.). Juntas, te dicen que un evento se ejecuta "cada 15 minutos" o "cada 1 día".

SELECT
    EVENT_NAME,
    CONCAT('Cada ', INTERVAL_VALUE, ' ',
        LOWER(INTERVAL_FIELD),
        CASE WHEN INTERVAL_VALUE > 1 THEN 's' ELSE '' END
    ) AS frecuencia
FROM information_schema.EVENTS
WHERE EVENT_SCHEMA = DATABASE()
  AND EVENT_TYPE = 'RECURRING'
  AND STATUS = 'ENABLED';

STATUS

Muestra el estado actual del evento: ENABLED, DISABLED o SLAVESIDE_DISABLED. Esta columna es esencial para diagnosticar eventos que no se están ejecutando.

-- Encontrar eventos deshabilitados que podrían haberse olvidado
SELECT EVENT_NAME, STATUS, EVENT_COMMENT, LAST_EXECUTED
FROM information_schema.EVENTS
WHERE EVENT_SCHEMA = DATABASE()
  AND STATUS != 'ENABLED';

LAST_EXECUTED

Contiene la fecha y hora de la última ejecución del evento. Es la columna más valiosa para monitorización: si un evento recurrente tiene una fecha de última ejecución muy antigua (o NULL), algo va mal. O el scheduler está desactivado, o el evento está deshabilitado, o tiene un error que impide su ejecución.

-- Eventos que no se han ejecutado en las últimas 24 horas (posible problema)
SELECT EVENT_NAME, STATUS, LAST_EXECUTED,
    TIMESTAMPDIFF(HOUR, LAST_EXECUTED, NOW()) AS horas_sin_ejecutar
FROM information_schema.EVENTS
WHERE EVENT_SCHEMA = DATABASE()
  AND EVENT_TYPE = 'RECURRING'
  AND STATUS = 'ENABLED'
  AND (LAST_EXECUTED IS NULL OR LAST_EXECUTED < NOW() - INTERVAL 24 HOUR)
ORDER BY LAST_EXECUTED;

EVENT_DEFINITION

Contiene el cuerpo completo del evento (la parte después de DO). Es útil para auditar qué hacen los eventos sin tener que ejecutar SHOW CREATE EVENT para cada uno:

SELECT EVENT_NAME, EVENT_DEFINITION
FROM information_schema.EVENTS
WHERE EVENT_SCHEMA = DATABASE()
  AND EVENT_NAME = 'purgar_logs_antiguos';

Verificar que el Event Scheduler está activo

Antes de diagnosticar problemas con eventos individuales, siempre verifica que el planificador global está funcionando. Un error muy común es perder tiempo investigando por qué un evento no se ejecuta cuando la causa es simplemente que el scheduler está apagado.

SHOW VARIABLES LIKE 'event_scheduler';

El resultado debe ser ON. Si es OFF, actívalo con:

SET GLOBAL event_scheduler = ON;

Para una verificación más completa, puedes comprobar también que el hilo del scheduler aparece en la lista de procesos:

SELECT * FROM information_schema.PROCESSLIST
WHERE USER = 'event_scheduler';

Si esta consulta no devuelve filas, el scheduler no está corriendo aunque la variable muestre ON. Esto puede ocurrir en situaciones excepcionales, como después de un error crítico del scheduler. En ese caso, prueba a desactivarlo y reactivarlo:

SET GLOBAL event_scheduler = OFF;
SET GLOBAL event_scheduler = ON;

Panel de monitorización de eventos

Combinando varias columnas de information_schema.EVENTS, puedes construir una consulta que funcione como un panel de monitorización rápido para todos tus eventos:

SELECT
    EVENT_NAME AS evento,
    CASE EVENT_TYPE
        WHEN 'RECURRING' THEN CONCAT('Cada ', INTERVAL_VALUE, ' ', LOWER(INTERVAL_FIELD))
        WHEN 'ONE TIME' THEN CONCAT('Puntual: ', DATE_FORMAT(EXECUTE_AT, '%d/%m/%Y %H:%i'))
    END AS programacion,
    STATUS AS estado,
    CASE
        WHEN LAST_EXECUTED IS NULL THEN 'Nunca'
        ELSE DATE_FORMAT(LAST_EXECUTED, '%d/%m/%Y %H:%i:%s')
    END AS ultima_ejecucion,
    CASE
        WHEN LAST_EXECUTED IS NULL THEN '---'
        WHEN EVENT_TYPE = 'RECURRING' THEN
            CONCAT(TIMESTAMPDIFF(MINUTE, LAST_EXECUTED, NOW()), ' min atrás')
        ELSE '---'
    END AS tiempo_desde_ultima,
    IFNULL(EVENT_COMMENT, '') AS comentario
FROM information_schema.EVENTS
WHERE EVENT_SCHEMA = DATABASE()
ORDER BY
    STATUS DESC,
    LAST_EXECUTED DESC;

Esta consulta muestra todos los eventos de la base de datos actual con su programación en formato legible, el estado, la última ejecución y cuánto tiempo ha pasado desde entonces. Los eventos habilitados aparecen primero (porque ENABLED ordena después de DISABLED en orden descendente), y dentro de cada grupo se ordenan por última ejecución, mostrando primero los ejecutados más recientemente.

Consultar eventos en todas las bases de datos

Si administras un servidor con múltiples bases de datos y cada una tiene sus propios eventos, necesitas una vista global. La tabla information_schema.EVENTS contiene los eventos de todas las bases de datos a las que tienes acceso:

SELECT
    EVENT_SCHEMA AS base_datos,
    EVENT_NAME AS evento,
    STATUS AS estado,
    EVENT_TYPE AS tipo,
    LAST_EXECUTED AS ultima_ejecucion
FROM information_schema.EVENTS
ORDER BY EVENT_SCHEMA, EVENT_NAME;

Esta consulta es especialmente útil para encontrar eventos deshabilitados que se olvidaron tras una migración, o para detectar eventos duplicados en diferentes bases de datos que hacen la misma tarea. Puedes compararla con la lista de bases de datos que muestra SHOW DATABASES para verificar la cobertura.

Diagnosticar eventos que no se ejecutan

Cuando un evento no se ejecuta como esperas, sigue estos pasos de diagnóstico en orden. Primero, verifica que el Event Scheduler está activo:

SHOW VARIABLES LIKE 'event_scheduler';

Segundo, verifica que el evento existe y está habilitado:

SELECT EVENT_NAME, STATUS, LAST_EXECUTED
FROM information_schema.EVENTS
WHERE EVENT_SCHEMA = DATABASE()
  AND EVENT_NAME = 'nombre_del_evento';

Tercero, comprueba si el evento tiene errores consultando su definición:

SHOW CREATE EVENT nombre_del_evento\G

Revisa la programación y el cuerpo. Los errores SQL dentro del cuerpo del evento no se muestran en ningún log por defecto. Si sospechas que hay un error en la lógica, prueba el cuerpo manualmente copiando las sentencias y ejecutándolas en una sesión normal.

Cuarto, verifica que el usuario DEFINER del evento todavía existe y tiene los privilegios necesarios:

SELECT DEFINER FROM information_schema.EVENTS
WHERE EVENT_SCHEMA = DATABASE()
  AND EVENT_NAME = 'nombre_del_evento';

Si el usuario que aparece como DEFINER fue eliminado del servidor, el evento fallará silenciosamente en cada ejecución. Recrea el usuario o modifica el DEFINER del evento con ALTER EVENT.

Errores comunes

El error más frecuente al consultar eventos es olvidar especificar la base de datos. SHOW EVENTS sin cláusula FROM solo muestra los eventos de la base de datos activa en la sesión. Si estás conectado a una base de datos diferente, no verás los eventos que buscas aunque existan. Siempre verifica cuál es tu base de datos actual con SELECT DATABASE() o especifica explícitamente la base de datos con SHOW EVENTS FROM nombre_bd.

Otro error habitual es interpretar incorrectamente la columna LAST_EXECUTED. Un valor NULL no siempre significa un problema: puede ser simplemente que el evento es nuevo y aún no ha llegado su primera ejecución programada. Compara LAST_EXECUTED con STARTS o EXECUTE_AT para determinar si el evento debería haberse ejecutado ya.

Un tercer problema es confiar exclusivamente en SHOW EVENTS para el diagnóstico. Esta sentencia muestra información limitada. Para un diagnóstico completo, necesitas consultar information_schema.EVENTS, ejecutar SHOW CREATE EVENT para ver la definición y verificar el estado del scheduler. Usa las tres herramientas juntas para obtener una imagen completa.

Cuándo usar SHOW EVENTS

Usa SHOW EVENTS para verificaciones rápidas: confirmar que un evento existe, comprobar su estado o revisar la lista completa de eventos de una base de datos. Es la herramienta ideal para el trabajo interactivo en la consola de MySQL.

Cuando necesites información más detallada, filtros complejos o integrar la consulta de eventos en scripts y herramientas de monitorización, recurre a information_schema.EVENTS. Su naturaleza de tabla SQL estándar te permite usar WHERE, JOIN, GROUP BY y cualquier otra funcionalidad de SQL para analizar los eventos de tu servidor con total flexibilidad.

Escrito por Eduardo Lázaro