Sök…


Skapa en händelse

Mysql har sin EVENT-funktion för att undvika komplicerade cron-interaktioner när mycket av det du planerar är SQL-relaterat och mindre filrelaterat. Se sidan Manuell här . Tänk på händelser som lagrade procedurer som är planerade att köras med återkommande intervaller.

För att spara tid i felsökning av händelsrelaterade problem, kom ihåg att den globala händelsehanteraren måste vara aktiverad för att bearbeta händelser.

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

Med den AV, kommer ingenting att trigga. Så slå på det:

SET GLOBAL event_scheduler = ON;

Schema för testning

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

Ovanstående bilagor tillhandahålls för att visa en utgångspunkt. Observera att de två händelserna som skapas nedan kommer att rensa raderna.

Skapa 2 evenemang, 1: a körning dagligen, 2: a körning var tionde minut

Ignorera vad de faktiskt gör (spelar mot varandra). Poängen är på INTERVAL och schemaläggning.

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 ;

Visa händelsestatus (olika tillvägagångssätt)

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)

Slumpmässiga saker att tänka på

DROP EVENT someEventName; - Raderar händelsen och dess kod

ON COMPLETION PRESERVE - När händelsen är klar bearbetning, behåll den. Annars raderas den.

Händelser är som triggers. De kallas inte av en användares program. Snarare är de planerade. Som sådan lyckas de eller misslyckas tyst.

Länken till den manuella sidan visar en hel del flexibilitet med intervallval, som visas nedan:

intervall:

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

Händelser är kraftfulla mekanismer som hanterar återkommande och schemalagda uppgifter för ditt system. De kan innehålla så många uttalanden, DDL- och DML-rutiner och komplicerade sammanfogningar som du rimligen kanske önskar. Se MySQL Manual-sidan med titeln Begränsningar för lagrade program .



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow