MySQL 5.1.6+ 內建 Event Scheduler 替代外部 Cron,實現資料庫層面的定時任務。
# 檢查狀態
SHOW VARIABLES LIKE 'event_scheduler';
# OFF → 需啟用
# 臨時啟用 (重啟失效)
SET GLOBAL event_scheduler = ON;
# 永久啟用 (配置檔)
[mysqld]
event_scheduler = ON
DELIMITER //
CREATE PROCEDURE update_exam_endtime()
BEGIN
UPDATE examinfo SET endtime = NOW() WHERE id = 14;
END //
DELIMITER ;
# 每 30 秒執行一次,保留完成狀態
CREATE EVENT IF NOT EXISTS e_update_exam
ON SCHEDULE EVERY 30 SECOND
ON COMPLETION PRESERVE
DO CALL update_exam_endtime();
# 常見排程語法
ON SCHEDULE AT '2024-12-31 23:59:59' -- 單次執行
ON SCHEDULE EVERY 1 DAY STARTS '2024-01-01 00:00:00' -- 每日
ON SCHEDULE EVERY 1 WEEK -- 每週
ON SCHEDULE EVERY 1 MONTH -- 每月
ON SCHEDULE EVERY 1 HOUR -- 每小時
# 停用事件
ALTER EVENT e_update_exam DISABLE;
# 啟用事件
ALTER EVENT e_update_exam ENABLE;
# 修改排程
ALTER EVENT e_update_exam
ON SCHEDULE EVERY 1 MINUTE;
# 刪除事件
DROP EVENT IF EXISTS e_update_exam;
# 查看所有事件
SHOW EVENTS;
SHOW EVENTS FROM dbname;
# 查看特定事件詳情
SHOW CREATE EVENT e_update_exam;
# 檢查排程器執行緒狀態
SHOW PROCESSLIST;
# 會看到 "Daemon" 命令的 event_scheduler 執行緒
若重啟後事件消失,檢查 my.cnf:
[mysqld]
event_scheduler = ON
重啟服務後自動生效,無需手動 SET GLOBAL。
| 特性 | MySQL Event | System Cron |
|---|---|---|
| 管理範疇 | 資料庫內部 | 作業系統層 |
| 備份遷移 | 隨資料庫備份 (mysqldump --events) | 需額外備份 crontab |
| 權限模型 | MySQL 權限系統 (EVENT 權限) | OS 使用者權限 |
| 時區處理 | 使用 MySQL 時區 (time_zone) | 使用系統時區 |
| 精度 | 秒級 | 分鐘級 (標準 Cron) |
| 適用場景 | 資料維護、統計聚合、清理過期資料 | 系統維護、檔案處理、外部腳本 |
e_<業務域>_<動作>_<頻率> (如 e_order_cleanup_daily)ON COMPLETION NOT PRESERVE (預設),避免一次性事件自動刪除導致邏輯缺失information_schema.EVENTS 狀態,異常告警--events 參數:mysqldump --events --all-databases