萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL Event Scheduler 定時任務實戰:從開啟調度器到創建/禁用/啟用 Event 完整範例

Event Scheduler 核心概念

MySQL 5.1.6+ 內置事件調度器,替代外部 Cron,實現數據庫層面的定時任務 (定期清理、統計聚合、分區維護等)。

完整操作流程

1. 檢查並啟用調度器


-- 查看狀態
SHOW VARIABLES LIKE 'event_scheduler';
-- OFF 表示關閉

-- 臨時啟用 (重啟失效)
SET GLOBAL event_scheduler = ON;

-- 永久啟用:編輯 my.cnf [mysqld] 區塊
event_scheduler = ON

2. 創建存儲過程 (業務邏輯封裝)


DELIMITER //
CREATE PROCEDURE `update_exam_endtime`()
BEGIN
    UPDATE `examinfo` SET `endtime` = NOW() WHERE `id` = 14;
END //
DELIMITER ;

3. 創建 Event (每 30 秒執行一次)


CREATE EVENT IF NOT EXISTS `e_update_exam_endtime`
ON SCHEDULE EVERY 30 SECOND
ON COMPLETION PRESERVE
DO CALL `update_exam_endtime`();
  • ON COMPLETION PRESERVE:執行完成後保留 Event (不自動刪除)。
  • EVERY 30 SECOND:支持 SECOND/MINUTE/HOUR/DAY/WEEK/MONTH/YEAR。
  • 可指定時間窗口:STARTS '2024-01-01 00:00:00' ENDS '2025-01-01 00:00:00'。

4. 控制 Event 狀態


-- 禁用
ALTER EVENT `e_update_exam_endtime` ON COMPLETION PRESERVE DISABLE;

-- 啟用
ALTER EVENT `e_update_exam_endtime` ON COMPLETION PRESERVE ENABLE;

-- 刪除
DROP EVENT IF EXISTS `e_update_exam_endtime`;

5. 查看 Event 狀態


SHOW EVENTS FROM `dbname`\G
-- 關鍵字段:Status (ENABLED/DISABLED/SLAVESIDE_DISABLED), Last_executed, Next_execution

重啟後 Event 消失?

確認 my.cnf 已設置 event_scheduler=ON 並重啟服務。若仍失效,檢查錯誤日誌是否有權限/初始化報錯。

最佳實踐建議

  1. 業務邏輯封裝在存儲過程,Event 僅負責調度,便於單元測試與復用。
  2. 避免長時間運行的 Event 阻塞調度器線程池 (默認 1 線程,event_scheduler=ON 時單線程串行執行)。
  3. 大批量操作分批提交,防止長事務鎖表、Binlog 膨脹。
  4. 監控 INFORMATION_SCHEMA.EVENTS 與 mysql.event 表,結合 Prometheus/Grafana 告警。
  5. 從庫默認不執行 Event (event_scheduler=DISABLED),主庫故障切換後需手動啟用或配置啟動腳本自動開啟。
copyright © 萬盛學電腦網 all rights reserved