[MySQL] Bases de la création d’un événement

Vincent Lecomte

Le programmateur d’événements a été introduit dans MySQL à partir de la version 5.1 du système de gestion de bases de données.

Il est donc possible de créer des tâches qui se déclenchent à une heure et une date donnée, un peu à la manière de triggers (ou en français, des déclencheurs) sauf que ces derniers sont lancés par des mises à jour de tables ou de simples lignes, par exemple.

Dans le cas du programmateur, on peut déclencher une même tache plusieurs fois par jours, voire par semaine… Il y a plusieurs utilités à ça, dont :

  • Un nettoyage d’une table,
  • Une optimisation après un ajout massif de tuples (ou enregistrements),
  • Un calcul quelconque,
  • Etc…

Activation de l’Event Scheduler

Il vous faudra éditer le fichier “my.ini” du répertoire MySQL. Dans le cas d’EasyPHP 5.3.3., si l’installation a été effectuée dans le dossier par défaut, vous devez vous rendre dans C:\Program Files\EasyPHP-5.3.3\mysql pour trouver le fichier de configuration en question. Ajoutez la ligne event-scheduler=VALEUR si elle n’existe pas et définissez la valeur à :

  • 0, pour que le service de programmation d’événements ne démarre jamais ou ne puisse être démarré.
  • 1, pour que le service soit lancé mais qu’il puisse être mis en pause (suspendu) par requête.
  • 2, pour qu’il soit démarré mais directement en mode “suspendu”. Une requête peut le réactiver.

Bien sûr, MySQL doit être redémarré. EasyPHP permet le redémarrage automatique de ses services lorsque l’un des fichiers de configuration est modifié. Pour vérifier que le service est actif, utilisez la requête suivante, soit en interface de ligne de commandes, soit grâce à PHPMyAdmin :

SHOW GLOBAL VARIABLES LIKE 'event_scheduler'

Il est aussi possible d’activer ou désactiver le programmateur d’événements en ligne de commande en rajoutant, aux paramètres de lancement du processus “mysqld”, –event-scheduler=VALEUR, où la valeur est égale à 0, 1, ou 2. Une dernière méthode a été prévue: l’utilisation de la requête SET GLOBAL, permettant d’éditer des variables d’environnement.

Créer l’événement

La syntaxe est la suivante :

CREATE
	[DEFINER = { user | CURRENT_USER }]
	EVENT
	[IF NOT EXISTS]
	nom_evenement
	ON SCHEDULE schedule
	[ON COMPLETION [NOT] PRESERVE]
	[ENABLE | DISABLE | DISABLE ON SLAVE]
	[COMMENT 'comment']
	DO corps_evenement;

schedule:
	AT timestamp [+ INTERVAL interval] ...
	| EVERY interval
	[STARTS timestamp [+ INTERVAL interval] ...]
	[ENDS timestamp [+ INTERVAL interval] ...]

interval:
	quantité {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
	WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
	DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

L’événement ne peut être créé que si on en a l’autorisation. Pour travailler en local sur votre projet, l’utilisateur ‘root’ devrait déjà disposer de l’autorisation de création et d’exécution (Commandes GRANT et REVOKE). La permission doit être donnée pour une base donnée et éventuellement pour une table donnée, sinon toutes (.*).

Destruction de sessions

CREATE EVENT IF NOT EXISTS delete_sessions 
ON SCHEDULE EVERY 180 MINUTE 
DO DELETE FROM WEB_SESSIONS 
WHERE lastdate < (NOW() - INTERVAL 3600 SECOND);

Cet événement se déclenchera toutes les 180 minutes pour supprimer les sessions qui ont expiré, celles-ci étant stockées dans une table appelée WEB_SESSIONS. Dans celle-ci le champ ‘lastdate’ est en fait au format TIMESTAMP (MySQL, et non Unix). Les 3600 secondes correspondent au temps de session défini, et donc, vous pouvez librement modifier cette valeur, puisque ici c’est vous le boss !

Notez que vous pouvez aussi utiliser la fonction TIMESTAMPDIFF() qui permet de calculer la différence entre deux TIMESTAMP et de retourner le résultat sous forme de minutes ou de secondes par exemple (voir la documentation sur les fonctions de date et heure). La requête suivante est aussi valable :

DELETE FROM WEB_SESSIONS 
WHERE (TIMESTAMPDIFF(SECOND,lastdate,NOW()) > 3600);

Maintenant, il faut activer l’événement (le programmateur doit être actif pour que l’événement s’exécute, sinon son activation n’aura aucun impact) :

ALTER EVENT nom_evenement ENABLE;

Si vous voulez le désactiver :

ALTER EVENT nom_evenement DISABLE;

Connaitre l’état

Il est possible de connaître l’état d’un événement en consultant le schéma d’information de votre base de données, grâce à la requête suivante :

SELECT EVENT_NAME, STATUS 
FROM INFORMATION_SCHEMA.EVENTS 
WHERE EVENT_NAME = 'nom_evenement' 
AND EVENT_SCHEMA = 'nom_schema';

Vous pouvez aussi consulter la table “mysql.event” qui contient toutes les informations à propos de votre événement (qui en est le créateur, etc). Exécutez par exemple la requête suivante pour afficher tous les événements créés :

SELECT * FROM mysql.event;

Pour l’instant, ce sera tout à propos des événements. Il est également possible de voir plus loin, par exemple créer un événement qui exécute une fonction. Pour l’instant n’hésitez pas à consulter les deux sources afin d’en apprendre un peu plus à ce sujet.

Sources

Developpez
Documentation MySQL 5.1

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Copy link