2010-06-18 7 views

Répondre

22

Le documentation on CREATE EVENT est assez bon, mais il faut du temps pour le faire correctement.

Vous avez deux problèmes, d'abord, rendre l'événement se reproduise, en second lieu, faisant fonctionner à 13h00 tous les jours.

Cet exemple crée un événement récurrent.

CREATE EVENT e_hourly 
    ON SCHEDULE 
     EVERY 1 HOUR 
    COMMENT 'Clears out sessions table each hour.' 
    DO 
     DELETE FROM site_activity.sessions; 

Lorsque dans le client MySQL en ligne de commande, vous pouvez:

SHOW EVENTS; 

Cette liste chaque événement avec ses métadonnées, comme si elle doit fonctionner une seule fois, ou être récurrente.

Le deuxième problème: pointant l'événement récurrent vers un élément de planification spécifique.

en essayant différents types d'expression, nous pouvons arriver à quelque chose comme:

CREATE EVENT IF NOT EXISTS `session_cleaner_event` 
ON SCHEDULE 
    EVERY 13 DAY_HOUR 
    COMMENT 'Clean up sessions at 13:00 daily!' 
    DO 
    DELETE FROM site_activity.sessions; 
+5

Cela ne fonctionne pas pour moi!. J'ai essayé avec 10 DAY_HOUR et il a simplement exécuté immédiatement et programmé lui-même. Je ne vois pas non plus pourquoi. En lisant les documents MySQL, DAY_HOUR est un moyen de spécifier des jours et des heures à partir de maintenant - c'est toujours un intervalle. Ou ai-je complètement mal compris? – Adam

+0

D'accord avec @Adam. Cela ne semble pas répondre à l'exigence de courir tous les jours à 13 heures. Sur la base de quelques tests rapides, je pense qu'il finirait par exécuter toutes les 13 heures. 'select current_timestamp() , date_add (current_timestamp(), intervalle 13 day_hour);' – Phil

8

Essayez cette

CREATE EVENT event1 
ON SCHEDULE EVERY '1' DAY 
STARTS '2012-04-17 13:00:00' -- should be in the future 
DO 
-- your statements 
END 
13

Mon cas d'utilisation est similaire, sauf que je veux un événement de nettoyage du journal courir à 2h du matin tous les soirs. Comme je l'ai dit dans le commentaire ci-dessus, le DAY_HOUR ne fonctionne pas pour moi. Dans mon cas, je ne manque pas vraiment l'esprit potentiellement le premier jour (et, étant donné qu'il est de courir à 2h du matin alors demain 2 heures est presque toujours la prochaine 2 heures) donc je l'utilise:

CREATE EVENT applog_clean_event 
ON SCHEDULE 
    EVERY 1 DAY 
    STARTS str_to_date(date_format(now(), '%Y%m%d 0200'), '%Y%m%d %H%i') + INTERVAL 1 DAY 
COMMENT 'Test' 
DO 
+0

Impossible d'utiliser 'CURRENT_DATE()' au lieu de 'str_to_date (date_format (maintenant(), '% Y% m% d 0200'), '% Y% m% d% H% i') '? En tout cas merci. – Linus

+0

Oui - sauf que je veux être en mesure de spécifier qu'il fonctionne à 0200 chaque jour. Si vous utilisez current_date, il s'exécutera chaque jour à n'importe quel moment où vous avez exécuté le script pour le créer. – Adam

+1

Oh, je pensais que CURRENT_DATE retournait une date avec le format: aaaa-MM-jj, ce qui signifie que l'heure serait 00:00 mais peut-être que je n'avais pas raison. – Linus

22

Cela pourrait être trop tard pour votre travail, mais voici comment je l'ai fait. Je veux quelque chose courir tous les jours à 1h du matin - je crois que c'est semblable à ce que vous faites. Voici comment je l'ai fait:

CREATE EVENT event_name 
    ON SCHEDULE 
    EVERY 1 DAY 
    STARTS (TIMESTAMP(CURRENT_DATE) + INTERVAL 1 DAY + INTERVAL 1 HOUR) 
    DO 
    # Your awesome query 
+0

Est-ce que 'TIMESTAMP (CURRENT_DATE)' est nécessaire? Semble fonctionner avec juste 'CURRENT_DATE + Interval .. ' – Kaspars

9
DROP EVENT IF EXISTS xxxEVENTxxx; 
CREATE EVENT xxxEVENTxxx 
    ON SCHEDULE 
    EVERY 1 DAY 
    STARTS (TIMESTAMP(CURRENT_DATE) + INTERVAL 1 DAY + INTERVAL 1 HOUR) 
    DO 
    --process; 

¡IMPORTANT ->

SET GLOBAL event_scheduler = ON; 
+1

s'il vous plaît également ajouter une explication si c'est possible .. –

+1

SET GLOBAL event_scheduler = ON; -> utilisé pour activer les événements mysql, s'il n'est pas créé mais pas exécuté. http://dev.mysql.com/doc/refman/5.1/fr/events-configuration.html – mercu

1
CREATE EVENT test_event_03 
ON SCHEDULE EVERY 1 MINUTE 
STARTS CURRENT_TIMESTAMP 
ENDS CURRENT_TIMESTAMP + INTERVAL 1 HOUR 
DO 
    INSERT INTO messages(message,created_at) 
    VALUES('Test MySQL recurring Event',NOW()); 
Questions connexes