Mysql Eventos

De MediaWiki
Ir a la navegación Ir a la búsqueda

Introducción

  • Los eventos son tareas que se ejecutan en base a un horario definido previamente.
  • Antes de la versión 5.7, los eventos eran 'simulados' haciendo uso de la función cron del sistema operativo LINUX o con el programador de tareas de Windows.
  • Un evento se identifica por su nombre. Cada evento está asociado a un esquema (base de datos) y se ejecuta en un intervalo de tiempo determinado.
Un evento ejecuta un conjunto de instrucciones SQL formando un bloque dentro de un BEGIN - END.


  • Los eventos se pueden programar para que se ejecuten una única vez o periódicamente.
  • Si vale OFF: El thread que se encarga de ejecutar los eventos está desactivado y por lo tanto no se ejecutará ningún evento. La tarea 'event_sheduler' no se muestra con la orden SHOW PROCESSLIST. Es el valor por defecto. En este estado, para activar el planificador de eventos debemos darle el valor ON a esta variable.
  • Si vale ON: El 'Event Scheduler' (planificador de eventos) es iniciado. En este caso aparecerá como un proceso más al ejecutar la orden SQL: SHOW PROCESSLIST. Para desactivarlo tendremos que cambiar su valor a OFF.
  • Si vale DISABLED: En este caso el planificador de eventos no podría ser activado dinámicamente cambiando el valor de la variable global a ON.
Nota: Recordar que ya vimos en esta wiki como cambiar el valor de una variable global.



Creación de eventos


  • Entre las diferentes opciones tenemos:
  • ON SCHEDULE: Indicamos el momento en que se va a ejecutar el evento y su frecuencia (una vez, una vez cada cierto tiempo, entre dos intervalos de tiempo,....)
  • DEFINER: Al igual que en el caso de las vistas y procedimientos, indicamos el usuario con el que se va a ejecutar el evento y por lo tanto se ejecutará con los permisos que tenga asociados dicho usuario.
  • event_body: Es el contenido del evento.
  • ON COMPLETION PRESERVE indica que el evento, cuando se termina de ejecutar (y si ya no va a ejecutarse posteriormente) no se elimine (que es el comportamiento por defecto y se indica con la opción ON COMPLETION NOT PRESERVE).
  • DISABLE indica que el evento está creado pero no se va a ejecutar. Para activarlo (normalmente con la orden SQL ALTER EVENT) pondremos ENABLE. La opción DISABLE ON SLAVE se utiliza en entornos de replicación con Mysql instalado en varios equipos. Lo que indicaría esta opción es que el evento sólo debe ejecutarse en el MASTER y no debe replicarse a los SLAVES.


  • Al igual que los procedimientos, podemos tener varias órdenes en el cuerpo del evento.
En ese caso deberemos poner después del DO BEGIN Código del evento END
Deberemos establecer un delimitador diferente antes del CREATE para separar el fin del CREATE con el fin de cada instrucción SQL que conforma el evento (al igual que pasaba en los procedimientos).


  • Una función que nos puede ser útil
  • CURRENT_TIMESTAMP que nos devuelve el día y hora actual del sistema y que se suele utilizar para establecer los intervalos de ejecución del evento de la forma: EVERY 12 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS CURRENT_TIMESTAMP + INTERVAL 4 WEEK (es un ejemplo)
  • Funciones para el manejo de tiempos y fechas.


  • Veamos un ejemplo sobre la base de datos employees (recordar cambiar el valor de la variable del sistema event_scheduler).
Vamos a crear un evento que se ejecute el día uno de cada mes y que obtenga los nombres de los empleados que hayan sido contratados durante el mes anterior.
Dichos nombres de guardarán en una tabla de nombre empleados_mes.
 1 delimiter \\
 2 
 3 CREATE EVENT empleados_del_mes
 4 	ON SCHEDULE 
 5 		EVERY 1 MONTH
 6 	COMMENT 'Guarda los empleados contratados en el mes anterior'
 7 	DO
 8 	BEGIN
 9 		DECLARE nombre varchar(30);
10     
11 		SELECT concat(first_name,' ',last_name) as nombre
12         INTO nombre
13         FROM employees.employees
14 		WHERE hire_date >= DATE_SUB(NOW(), INTERVAL 1 MONTH);
15         
16         INSERT INTO empleados_mes (nombre)
17         VALUES (nombre);
18         
19     
20 	END\\
21     
22 delimiter ;
Veremos después consultando los datos del evento, que éste no comenzará hasta el mes que viene.



Modificación de eventos


  • Veamos un ejemplo.
Sobre el evento creado en el paso anterior, haz una modificación para que comience en el mes actual:
1 ALTER EVENT empleados_del_mes
2 ON SCHEDULE 
3 	EVERY 1 MONTH STARTS NOW();



Borrado de eventos


  • Si intentamos borrar un evento que no existe sin utilizar la opción DROP EVENT IF EXISTS el gestor Mysql lanzará una excepción con el mensaje: ERROR 1517 (HY000): Unknown event 'event_name'
  • Veamos un ejemplo:



Consulta de eventos

Dicha orden muestra información sobre quien creó el evento, cuando comienza a ejecutarse y su intervalo de ejecución, cuando finaliza, si está habilitado y sobre qué base de datos actúa.
  • Si queremos obtener el código del evento, debemos de ejecutar la orden SQL SHOW CREATE EVENT.
También podemos consultar directamente el diccionario de datos, concretamente la tabla EVENTS de la base de datos INFORMATION_SCHEMA.


  • Veamos un ejemplo:



Ejercicios propuestos

  • Queremos registrar, cada 1 minuto el día de hoy y durante una 10 minutos desde el momento de creación del evento, qué usuarios están accediendo a la base de datos employees. Estos usuarios (sus nombres y equipos) deberán quedar registrados en una tabla de nombre 'historico_usuarios_hora' en la que se guardará el nombre del usuario así como el día-hora-minuto en el que se produjo el registro de actividad.
Haz que el evento no desaparezca cuando termine el intervalo de ejecución.
Crea dos usuarios y conéctate a la base de de datos. Después desconéctate de la base de datos.
Modifica el evento para que se vuelva a ejecutar en el minuto siguiente al actual y comprueba que registra nuevamente a uno de los usuarios anteriores (que se vuelva a conectar)





-- Ángel D. Fernández González -- (2017).