-- 查看狀態 (OFF/ON/DISABLED)
SHOW VARIABLES LIKE 'event_scheduler';
-- 運行時動態啟用 (重啟失效)
SET GLOBAL event_scheduler = ON;
-- 永久生效:my.cnf [mysqld] 區段
event_scheduler = ON
DELIMITER //
CREATE PROCEDURE `update_project_time`()
BEGIN
UPDATE `project` SET `create_time` = NOW();
END //
DELIMITER ;
CREATE EVENT `e_update_project_time`
ON SCHEDULE EVERY 30 SECOND
ON COMPLETION PRESERVE
DO CALL `update_project_time`();
關鍵子句:
ON SCHEDULE:AT timestamp (一次性) / EVERY interval (循環)。interval: SECOND/MINUTE/HOUR/DAY/WEEK/MONTH/QUARTER/YEAR。ON COMPLETION PRESERVE:完成後保留事件 (默認 DROP),循環事件必加。ENABLE/DISABLE:創建時指定啟用狀態。-- 啟用/禁用
ALTER EVENT `e_update_project_time` ENABLE;
ALTER EVENT `e_update_project_time` DISABLE;
-- 修改調度
ALTER EVENT `e_update_project_time` ON SCHEDULE EVERY 1 MINUTE;
-- 刪除
DROP EVENT `e_update_project_time`;
-- 查看事件
SHOW EVENTS FROM `db_name`;
SHOW CREATE EVENT `e_update_project_time`;
| 模式 | SQL 範例 | 說明 |
|---|---|---|
| 單次執行 | ON SCHEDULE AT '2024-12-31 23:59:59' | 定時備份、報表生成 |
| 固定間隔 | ON SCHEDULE EVERY 1 DAY STARTS '2024-01-01 02:00:00' | 每日清理、統計 |
| 複雜 cron 式 | 不支援原生,需存儲過程內判斷 DAYOFWEEK() 等 | 如「每月最後一天」、「工作日」 |
EVENT 權限 (5.1.6+)。event_scheduler 系統線程運行,**權限為 DEFINER 賬號權限**,非調用者權限。'event_user'@'localhost',僅授予所需表 INSERT/UPDATE/DELETE。system_time_zone / time_zone 執行,跨時區部署需統一設定 SET time_zone = '+08:00';。DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN ... END; 記錄錯誤日志,防止事件靜默失敗。mysqldump --events 導出事件,還原時需 event_scheduler=ON 自動恢復調度。-- 事件執行狀態
SELECT * FROM information_schema.EVENTS WHERE EVENT_SCHEMA='db_name'\G
-- 最近執行時間
SELECT EVENT_NAME, LAST_EXECUTED, STATUS FROM information_schema.EVENTS;
-- 錯誤日志
-- 事件報錯寫入 mysqld error log,關注 [ERROR] Event Scheduler: ...
MySQL Event Scheduler 是資料庫層面的輕量級定時任務引擎,**適合「數據庫內部」周期性維護 (清理、統計、分區、同步)**。複雜業務調度 (依賴外部 API、多步驟編排、失敗重試) 應遷移至應用層調度器 (xxl-job, Airflow, Celery Beat)。啟用 event_scheduler=ON、善用 ON COMPLETION PRESERVE、嚴格權限控制、完善異常日志,是生產可用的關鍵。