Recherche…


Créer un événement

Mysql a sa fonctionnalité EVENT pour éviter les interactions cron compliquées quand une grande partie de ce que vous planifiez est liée à SQL et moins liée au fichier. Voir la page de manuel ici . Considérez les événements comme des procédures stockées planifiées pour s'exécuter à intervalles réguliers.

Pour gagner du temps dans le débogage des problèmes liés aux événements, gardez à l'esprit que le gestionnaire d'événements global doit être activé pour traiter les événements.

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

Avec OFF, rien ne se déclenche. Alors allumez-le:

SET GLOBAL event_scheduler = ON;

Schéma pour tester

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');

Les insertions ci-dessus sont fournies pour montrer un point de départ. Notez que les 2 événements créés ci-dessous nettoient les lignes.

Créer 2 événements, 1ère course tous les jours, 2ème parcours toutes les 10 minutes

Ignorer ce qu'ils font réellement (jouer les uns contre les autres). Le point est sur l'INTERVALLE et la planification.

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 ;

Afficher les statuts d'événement (différentes approches)

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)

Des choses aléatoires à considérer

DROP EVENT someEventName; - Supprime l'événement et son code

ON COMPLETION PRESERVE - Lorsque l'événement est terminé, conservez-le. Sinon, il est supprimé.

Les événements sont comme des déclencheurs. Ils ne sont pas appelés par le programme d'un utilisateur. Ils sont plutôt programmés. En tant que tels, ils réussissent ou échouent silencieusement.

Le lien vers la page de manuel montre un certain degré de flexibilité avec les choix d'intervalles, présentés ci-dessous:

intervalle:

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

Les événements sont des mécanismes puissants qui gèrent les tâches récurrentes et planifiées pour votre système. Ils peuvent contenir autant d'énoncés, de routines DDL et DML, et de jointures compliquées que vous pouvez raisonnablement souhaiter. Veuillez consulter la page du manuel MySQL intitulée Restrictions sur les programmes stockés .



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow