2011-07-03 5 views
35

J'ai cette procédure stockée. Comment puis-je l'exécuter par exemple avec des intervalles de 5 secondes? Comme une routine pour éliminer les données avec un horodatage plus d'un jour?Comment planifier une procédure stockée dans MySQL

DROP PROCEDURE IF EXISTS `delete_rows_links` 
GO 

CREATE PROCEDURE delete_rows_links 
BEGIN 

    DELETE activation_link 
    FROM activation_link_password_reset 
    WHERE TIMESTAMPDIFF(DAY, `time`, NOW()) < 1 ; 

END 

GO 
+2

Est-ce que vous avez vraiment besoin de l'exécuter ** chaque 5 secondes **? – zerkms

+7

nop, avec un intervalle de 6 heures est très bien. Mais pour tester est plus facile avec des secondes :) – user455318

+1

Courir n'importe quoi automatiquement toutes les 5 secondes est probablement une très mauvaise idée. Essayez de l'exécuter une fois par jour, ou une fois par heure, afin de ne pas complètement tuer votre performance. – Flimzy

Répondre

54

Vous pouvez utiliser mysql scheduler pour l'exécuter toutes les 5 secondes. Vous pouvez trouver des échantillons à http://dev.mysql.com/doc/refman/5.1/en/create-event.html

Jamais utilisé, mais j'espère que cela fonctionnerait:

CREATE EVENT myevent 
    ON SCHEDULE EVERY 5 SECOND 
    DO 
     CALL delete_rows_links(); 
+0

je remplace seulement delete_rows_links avec ceci, mais apparemment ne fonctionne pas. SUPPRIMER DE 'database_charts'.'activation_link_password_reset' WHERE TIMESTAMPDIFF (DAY,' time', NOW()) <1; – user455318

+1

@ user455318: "ne fonctionne pas" --- n'est pas une explication.Quelle version de mysql utilisez-vous? Quelle erreur avez-vous obtenu? – zerkms

+0

je ne peux pas activer le SET GLOBAL event_scheduler = ON; donnez-moi une erreur de connexion – user773961

3

Si vous êtes ouvert à hors la DB solution: Vous pouvez configurer une tâche cron qui exécute un script qui appellera lui-même la procédure.

+1

Cron ne peut pas exécuter la commande toutes les 5 secondes. Il est bon avec 6 heures d'intervalle cependant. – zerkms

+0

Oui, j'ai répondu avec le commentaire de l'OP à l'esprit, j'aurais dû le spécifier! – Vache

+0

Malheureusement, avant MySQL 5.1 cela semble être la seule option, car les événements ont été introduits avec cette version. – Gruber

10

J'utilisé cette requête et cela a fonctionné pour moi:

CREATE EVENT `exec` 
    ON SCHEDULE EVERY 5 SECOND 
    STARTS '2013-02-10 00:00:00' 
    ENDS '2015-02-28 00:00:00' 
    ON COMPLETION NOT PRESERVE ENABLE 
DO 
    call delete_rows_links(); 
6

Afin de créer une tâche cron, procédez comme suit:

  1. exécuter cette commande: SET GLOBAL event_scheduler = ON;

  2. ERROR 1229 (HY000): Variable 'event_scheduler' est une variable globale et doit être réglé avec SET GLOBAL: mportant

Il est possible de définir le planificateur d'événement pour handicapés à démarrage du serveur. Si event_scheduler est activé ou désactivé, vous ne pouvez pas le définir sur DISABLED lors de l'exécution. En outre, si le planificateur d'événements est défini sur DISABLED au démarrage, vous ne pouvez pas modifier la valeur de event_scheduler lors de l'exécution.

Pour désactiver le programmateur d'événement, appliquez une des deux méthodes suivantes:

  1. Comme option de ligne de commande lors du démarrage du serveur:

    --event-scheduler=DISABLED 
    
  2. Dans le fichier de configuration de serveur (my.cnf, ou my.ini sur les systèmes Windows): inclure la ligne où il sera lu par le serveur (par exemple, dans une section [mysqld]):

    event_scheduler=DISABLED 
    

    Lisez MySQL documentation pour plus d'informations.

    DROP EVENT IF EXISTS EVENT_NAME; 
        CREATE EVENT EVENT_NAME 
    ON SCHEDULE EVERY 10 SECOND/minute/hour 
    DO 
    CALL PROCEDURE_NAME(); 
    
Questions connexes