Zoeken…


Maak een evenement aan

Mysql heeft EVENT-functionaliteit voor het vermijden van gecompliceerde cron-interacties wanneer veel van wat u plant SQL gerelateerd is, en minder bestandgerelateerd. Zie de Gebruikershandleiding pagina hier . Beschouw gebeurtenissen als opgeslagen procedures die volgens planning moeten worden uitgevoerd.

Om tijd te besparen bij het debuggen van gebeurtenisgerelateerde problemen, moet u er rekening mee houden dat de globale gebeurtenishandler moet zijn ingeschakeld om gebeurtenissen te verwerken.

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

Als deze UIT staat, wordt er niets geactiveerd. Dus zet het aan:

SET GLOBAL event_scheduler = ON;

Schema voor testen

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

De bovenstaande inzetstukken worden gegeven om een startpunt te tonen. Merk op dat de 2 hieronder gemaakte evenementen rijen zullen opschonen.

Maak 2 evenementen, 1e keer dagelijks, 2e keer om de 10 minuten

Negeer wat ze eigenlijk doen (tegen elkaar spelen). Het punt ligt op INTERVAL en planning.

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 ;

Toon evenementstatussen (verschillende benaderingen)

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)

Willekeurige dingen om te overwegen

DROP EVENT someEventName; - Verwijdert het evenement en de code

ON COMPLETION PRESERVE - Wanneer de gebeurtenis is verwerkt, bewaar deze. Anders wordt het verwijderd.

Evenementen zijn als triggers. Ze worden niet aangeroepen door een gebruikersprogramma. Ze zijn eerder gepland. Als zodanig slagen of falen ze stilzwijgend.

De link naar de Manual-pagina toont nogal wat flexibiliteit met intervalkeuzes, hieronder weergegeven:

interval:

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

Evenementen zijn krachtige mechanismen die terugkerende en geplande taken voor uw systeem afhandelen. Ze kunnen zoveel statements, DDL- en DML-routines en gecompliceerde joins bevatten als u redelijkerwijs wenst. Raadpleeg de MySQL-handleidingpagina getiteld Beperkingen voor opgeslagen programma's .



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow