MySQL
evenemang
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 .