Ricerca…


Crea un evento

Mysql ha la sua funzionalità EVENT per evitare complicate interazioni di cron quando gran parte di ciò che si sta programmando è correlato a SQL e meno relativo ai file. Vedi la pagina del manuale qui . Pensa agli eventi come stored procedure pianificate per essere eseguite su intervalli ricorrenti.

Per risparmiare tempo nel debug dei problemi relativi agli eventi, tenere presente che il gestore eventi globale deve essere attivato per elaborare gli eventi.

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

Con esso OFF, non si innescherà nulla. Quindi accendilo:

SET GLOBAL event_scheduler = ON;

Schema per i test

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

Gli inserti di cui sopra sono forniti per mostrare un punto di partenza. Tieni presente che i 2 eventi creati di seguito eliminano le righe.

Crea 2 eventi, 1a corsa al giorno, 2a corsa ogni 10 minuti

Ignora ciò che stanno effettivamente facendo (giocando l'uno contro l'altro). Il punto è su INTERVAL e pianificazione.

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 ;

Mostra stati degli eventi (approcci diversi)

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)

Roba a caso da considerare

DROP EVENT someEventName; - Elimina l'evento e il suo codice

ON COMPLETION PRESERVE - Al termine dell'elaborazione dell'evento, conservarlo. Altrimenti, viene eliminato.

Gli eventi sono come trigger. Non sono chiamati dal programma di un utente. Piuttosto, sono programmati. In quanto tali, riescono o falliscono silenziosamente.

Il collegamento alla pagina di manuale mostra un po 'di flessibilità con le opzioni di intervallo, mostrate di seguito:

intervallo:

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

Gli eventi sono potenti meccanismi che gestiscono attività ricorrenti e pianificate per il tuo sistema. Possono contenere tante istruzioni, routine DDL e DML e join complicati come si potrebbe ragionevolmente desiderare. Si prega di consultare la pagina del manuale MySQL intitolata Restrizioni sui programmi memorizzati .



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow