相較 OS 級 cron(分鐘粒度),MySQL 事件調度器支援秒級排程,適合即時性資料處理(如每秒聚合、定時清理過期資料)。
CREATE [DEFINER = { user | CURRENT_USER }] EVENT [IF NOT EXISTS] event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'comment']
DO event_body;
schedule 兩大模式AT timestamp [+ INTERVAL interval]EVERY interval [STARTS timestamp] [ENDS timestamp]interval 單位支援:SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR 及複合單位(如 DAY_HOUR)。
CREATE EVENT myevent ON SCHEDULE EVERY 1 HOUR STARTS CURRENT_TIMESTAMP DO UPDATE myschema.mytable SET mycol = mycol + 1;
CREATE EVENT myevent ON SCHEDULE EVERY 1 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 1 DAY DO UPDATE myschema.mytable SET mycol = mycol + 1;
DELIMITER //
CREATE EVENT e_batch
ON SCHEDULE EVERY 5 SECOND
DO BEGIN
DECLARE v INT DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;
WHILE v < 5 DO
INSERT INTO t1 VALUES (0);
UPDATE t2 SET s1 = s1 + 1;
SET v = v + 1;
END WHILE;
END //
DELIMITER ;
| 操作 | SQL |
|---|---|
| 查看所有事件 | SHOW EVENTS; |
| 啟用事件 | ALTER EVENT e_name ON COMPLETION PRESERVE ENABLE; |
| 停用事件 | ALTER EVENT e_name ON COMPLETION PRESERVE DISABLE; |
| 修改排程/主體 | ALTER EVENT e_name ON SCHEDULE ... DO ... |
| 查看最後執行時間 | SELECT EVENT_NAME, LAST_EXECUTED FROM information_schema.EVENTS; |
-- 啟用(四種等價寫法) SET GLOBAL event_scheduler = ON; SET @@global.event_scheduler = 1; -- 關閉 SET GLOBAL event_scheduler = OFF;
查看狀態:SHOW VARIABLES LIKE 'event_scheduler'; 或 SHOW PROCESSLIST; 觀察 event_scheduler 執行緒。
schema.tableDISABLE ON SLAVE,需主動 ENABLE 才會在從庫執行