MySQL 5.1+ 內建 Event Scheduler (事件排程器),可替代作業系統 crontab 實現資料庫層面的定時任務。本文完整示範建立存儲過程、創建 Event、啟停控制、重啟持久化配置。
-- 查看狀態
SHOW VARIABLES LIKE 'event_scheduler';
-- OFF 表示關閉
-- 臨時啟用 (重啟失效)
SET GLOBAL event_scheduler = ON;
-- 永久啟用 (寫入配置文件 my.cnf)
[mysqld]
event_scheduler = ON
DELIMITER //
CREATE PROCEDURE update_exam_endtime()
BEGIN
UPDATE examinfo SET endtime = NOW() WHERE id = 14;
END //
DELIMITER ;
CREATE EVENT IF NOT EXISTS e_update_exam
ON SCHEDULE EVERY 30 SECOND
ON COMPLETION PRESERVE
DO CALL update_exam_endtime();
EVERY 30 SECOND:每 30 秒執行,支援 MINUTE, HOUR, DAY, WEEK, MONTH, YEARON COMPLETION PRESERVE:任務完成後保留 Event (預設 DROP)STARTS 'timestamp', ENDS 'timestamp' 限定時間範圍-- 禁用
ALTER EVENT e_update_exam DISABLE;
-- 啟用
ALTER EVENT e_update_exam ENABLE;
-- 修改排程
ALTER EVENT e_update_exam ON SCHEDULE EVERY 1 MINUTE;
SHOW EVENTS;
SHOW CREATE EVENT e_update_exam;
SELECT * FROM information_schema.EVENTS WHERE EVENT_NAME = 'e_update_exam';
MySQL 重啟後 Event Scheduler 預設關閉,必須在 my.cnf [mysqld] 區段加入:
event_scheduler = ON
重啟服務後自動生效,定時任務不中斷。
| 優點 | 缺點 |
|---|---|
| 資料庫內建、無外部依賴 | 精度受限於秒級 (無毫秒) |
| 備份/遷移資料庫連同 Event 一起 | 高頻任務 (秒級) 可能影響效能 |
| 權限管理整合在 MySQL 權限體系 | 無分散式協調能力 (單實例) |
| 適合資料維護、統計聚合、清理任務 | 複雜業務邏輯建議應用層排程 |
information_schema.EVENTS 確認執行狀態