MySQL
Événements
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 .