Buscar..


Crear un evento

Mysql tiene su funcionalidad EVENTO para evitar interacciones cron complicadas cuando gran parte de lo que está programando está relacionado con SQL y menos con archivos. Vea la página del Manual aquí . Piense en los eventos como procedimientos almacenados que están programados para ejecutarse en intervalos recurrentes.

Para ahorrar tiempo en la depuración de problemas relacionados con eventos, tenga en cuenta que el controlador de eventos global debe estar activado para procesar eventos.

SHOW VARIABLES WHERE variable_name='event_scheduler';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | OFF   |
+-----------------+-------+

Con el apagado, nada disparará. Así que enciéndelo:

SET GLOBAL event_scheduler = ON;

Esquema para la prueba

create table theMessages
(   id INT AUTO_INCREMENT PRIMARY KEY,
    userId INT NOT NULL,
    message VARCHAR(255) NOT NULL,
    updateDt DATETIME NOT NULL,
    KEY(updateDt)
);
 
INSERT theMessages(userId,message,updateDt) VALUES (1,'message 123','2015-08-24 11:10:09');
INSERT theMessages(userId,message,updateDt) VALUES (7,'message 124','2015-08-29');
INSERT theMessages(userId,message,updateDt) VALUES (1,'message 125','2015-09-03 12:00:00');
INSERT theMessages(userId,message,updateDt) VALUES (1,'message 126','2015-09-03 14:00:00');

Las inserciones anteriores se proporcionan para mostrar un punto de partida. Tenga en cuenta que los 2 eventos creados a continuación limpiarán las filas.

Cree 2 eventos, 1º se ejecuta diariamente, 2º se ejecuta cada 10 minutos

Ignora lo que realmente están haciendo (jugando uno contra el otro). El punto está en el INTERVALO y la programación.

DROP EVENT IF EXISTS `delete7DayOldMessages`;
DELIMITER $$
CREATE EVENT `delete7DayOldMessages`
  ON SCHEDULE EVERY 1 DAY STARTS '2015-09-01 00:00:00'
  ON COMPLETION PRESERVE
DO BEGIN
   DELETE FROM theMessages 
   WHERE datediff(now(),updateDt)>6; -- not terribly exact, yesterday but <24hrs is still 1 day
   
  -- Other code here

END$$
DELIMITER ;

...

DROP EVENT IF EXISTS `Every_10_Minutes_Cleanup`;
DELIMITER $$
CREATE EVENT `Every_10_Minutes_Cleanup`
  ON SCHEDULE EVERY 10 MINUTE STARTS '2015-09-01 00:00:00'
  ON COMPLETION PRESERVE
DO BEGIN
   DELETE FROM theMessages 
   WHERE TIMESTAMPDIFF(HOUR, updateDt, now())>168; -- messages over 1 week old (168 hours)

   -- Other code here
END$$
DELIMITER ;

Mostrar estados de eventos (diferentes enfoques)

SHOW EVENTS FROM my_db_name; -- List all events by schema name (db name)
SHOW EVENTS; 
SHOW EVENTS\G; -- <--------- I like this one from mysql> prompt

*************************** 1. row ***************************
                  Db: my_db_name
                Name: delete7DayOldMessages
             Definer: root@localhost
           Time zone: SYSTEM
                Type: RECURRING
          Execute at: NULL
      Interval value: 1
      Interval field: DAY
              Starts: 2015-09-01 00:00:00
                Ends: NULL
              Status: ENABLED
          Originator: 1
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
*************************** 2. row ***************************
                  Db: my_db_name
                Name: Every_10_Minutes_Cleanup
             Definer: root@localhost
           Time zone: SYSTEM
                Type: RECURRING
          Execute at: NULL
      Interval value: 10
      Interval field: MINUTE
              Starts: 2015-09-01 00:00:00
                Ends: NULL
              Status: ENABLED
          Originator: 1
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
2 rows in set (0.06 sec)

Cosas al azar a considerar

DROP EVENT someEventName; - Borra el evento y su código.

ON COMPLETION PRESERVE : cuando el evento haya terminado de procesarse, consérvelo. De lo contrario, se elimina.

Los eventos son como disparadores. No son llamados por el programa de un usuario. Más bien, están programados. Como tales, tienen éxito o fallan en silencio.

El enlace a la página del manual muestra bastante flexibilidad con las opciones de intervalo, que se muestran a continuación:

intervalo:

quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
          WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
          DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

Los eventos son mecanismos poderosos que manejan tareas recurrentes y programadas para su sistema. Pueden contener tantas declaraciones, rutinas DDL y DML y uniones complicadas como usted desee razonablemente. Consulte la página del manual de MySQL titulada Restricciones en programas almacenados .



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow