首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 5.1 Event Scheduler 事件排程器:定時任務建立、管理與最佳實踐

     編輯:MySQL 綜合教學

啟用事件排程器

-- 檢查狀態
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 記錄自定義日誌表。

限制與注意事項

  1. 需 MySQL 5.1.6+,預設關閉。
  2. 事件執行權限 = DEFINER 權限 (類似預存程序 SQL SECURITY DEFINER),建立專用低權限帳號。
  3. 不支援秒級以下精度 (最小 1 秒),高頻需求請用應用層排程 (cron、Quartz、Celery)。
  4. DISABLED 狀態下無法透過 SET GLOBAL 開啟,必須修改 my.cnf 重啟。
  5. 備份/遷移時:mysqldump --events 包含事件定義。

最佳實踐清單

  • [ ] 生產庫啟用 event_scheduler=ON 並寫入 my.cnf。
  • [ ] 事件命名規範:e_<頻率>_<業務> (如 e_daily_backup)。
  • [ ] 複雜邏輯封裝為 存儲過程,事件僅 CALL sp_xxx()。
  • [ ] 關鍵事件加 ON COMPLETION PRESERVE 避免自動刪除。
  • [ ] 監控 LAST_EXECUTED 與錯誤日誌,設定告警。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved