MySQL 事件調度器(Event Scheduler)相當於 Linux cron 或 Windows 工作排程器,但精度可達秒級,適合即時性資料處理。
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;
schema.eventAT timestamp [+ INTERVAL interval]:單次執行EVERY interval [STARTS timestamp] [ENDS timestamp]:週期執行BEGIN ... END 區塊每小時自增欄位值
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;
複合 SQL 區塊(每 5 秒)
DELIMITER //
CREATE EVENT e
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 ;
-- 查看所有事件
SHOW EVENTS;
-- 查看特定事件詳細資訊
SHOW CREATE EVENT event_name;
-- 修改事件(重新排程、重命名、啟停)
ALTER EVENT event_name
[ON SCHEDULE ...]
[RENAME TO new_name]
[ENABLE | DISABLE]
[COMMENT '...']
[DO ...];
ALTER EVENT e_test ENABLE; -- 啟用 ALTER EVENT e_test DISABLE; -- 停用
-- 查看狀態(三種方式皆可) SHOW VARIABLES LIKE 'event_scheduler'; SELECT @@event_scheduler; SHOW PROCESSLIST; -- 可見 event_scheduler 執行緒 -- 啟用調度器 SET GLOBAL event_scheduler = ON; -- 或 SET GLOBAL event_scheduler = 1; -- 停用調度器 SET GLOBAL event_scheduler = OFF;
SELECT EVENT_NAME, LAST_EXECUTED, STATUS FROM information_schema.EVENTS WHERE EVENT_SCHEMA = 'your_db';
DECLARE CONTINUE HANDLER 捕捉異常防止中斷ON COMPLETION PRESERVE 保留定義供稽核DISABLE ON SLAVE 避免雙重執行