啟用事件排程器
-- 檢查狀態
SHOW VARIABLES LIKE 'event_scheduler';
-- OFF / ON / DISABLED
-- 立即啟用 (運行時生效,重啟失效)
SET GLOBAL event_scheduler = ON;
-- 或
SET @@global.event_scheduler = 1;
-- 永久生效 (my.cnf)
[mysqld]
event_scheduler = ON
建立事件語法詳解
CREATE EVENT [IF NOT EXISTS] `event_name`
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
[COMMENT 'comment']
DO sql_statement;
schedule:
AT timestamp [+ INTERVAL interval] -- 一次性
| EVERY interval
[STARTS timestamp] [ENDS timestamp] -- 週期性
interval:
YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | SECOND
實戰範例
1. 一次性任務:指定時間執行一次
CREATE EVENT `e_new_year_greeting`
ON SCHEDULE AT '2025-01-01 00:00:00'
DO
INSERT INTO `messages` (`from`,`to`,`content`,`created_at`)
VALUES ('system','all','Happy New Year!',NOW());
2. 週期性任務:每小時清理舊日誌
CREATE EVENT `e_hourly_cleanup`
ON SCHEDULE EVERY 1 HOUR
STARTS '2024-01-01 00:00:00'
ENDS '2025-12-31 23:59:59'
ON COMPLETION PRESERVE -- 結束後保留事件定義
ENABLE
COMMENT '每小時刪除 30 天前的操作日誌'
DO
DELETE FROM `operation_log` WHERE `created_at` < DATE_SUB(NOW(), INTERVAL 30 DAY);
3. 複雜排程:每天凌晨 2:30 備份統計表
CREATE EVENT `e_daily_stats`
ON SCHEDULE EVERY 1 DAY
STARTS TIMESTAMP(CURDATE() + INTERVAL 1 DAY, '02:30:00')
DO
CALL `sp_generate_daily_stats`();
事件管理指令
| 操作 | SQL |
| 查看所有事件 | SHOW EVENTS; 或 SELECT * FROM information_schema.EVENTS; |
| 查看特定事件 | SHOW CREATE EVENT `e_name`; |
| 啟用/停用 | ALTER EVENT `e_name` ENABLE / DISABLE; |
| 修改排程 | ALTER EVENT `e_name` ON SCHEDULE EVERY 30 MINUTE; |
| 刪除事件 | DROP EVENT [IF EXISTS] `e_name`; |
監控與除錯
SHOW PROCESSLIST; 可見 event_scheduler 執行緒與正在執行的事件。
SELECT * FROM information_schema.EVENTS WHERE LAST_EXECUTED IS NOT NULL; 檢查最後執行時間。
- 事件內發生錯誤不會中斷排程器,但會寫入錯誤日誌 (
log_error),建議事件體包裹 DECLARE CONTINUE HANDLER FOR SQLEXCEPTION 記錄自定義日誌表。
限制與注意事項
- 需 MySQL 5.1.6+,預設關閉。
- 事件執行權限 =
DEFINER 權限 (類似預存程序 SQL SECURITY DEFINER),建立專用低權限帳號。
- 不支援秒級以下精度 (最小 1 秒),高頻需求請用應用層排程 (cron、Quartz、Celery)。
DISABLED 狀態下無法透過 SET GLOBAL 開啟,必須修改 my.cnf 重啟。
- 備份/遷移時:
mysqldump --events 包含事件定義。
最佳實踐清單
- [ ] 生產庫啟用
event_scheduler=ON 並寫入 my.cnf。
- [ ] 事件命名規範:
e_<頻率>_<業務> (如 e_daily_backup)。
- [ ] 複雜邏輯封裝為
存儲過程,事件僅 CALL sp_xxx()。
- [ ] 關鍵事件加
ON COMPLETION PRESERVE 避免自動刪除。
- [ ] 監控
LAST_EXECUTED 與錯誤日誌,設定告警。