首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 事件調度器:秒級定時任務、替代 Cron、監控從庫狀態實戰

     編輯:MySQL 資料庫相關知識

簡介

  • MySQL 5.1 引入,**Server 內建** 定時任務引擎。
  • 精度達 **秒級** (Cron 僅分鐘級)。
  • 本質是「時間觸發器」,由專屬執行緒 event_scheduler 管理。
  • 動態開關:SET GLOBAL event_scheduler = ON|OFF;

啟用與驗證

SET GLOBAL event_scheduler = ON;
SHOW PROCESSLIST;
-- 可見 Id: xxx, User: event_scheduler, Command: Daemon, State: Waiting on empty queue

實戰案例:每 5 秒檢查從庫運行狀態,自動跳過錯誤重啟

1. 建立預存程序

DELIMITER //
CREATE PROCEDURE `Slave_Monitor`()
BEGIN
    DECLARE slave_status VARCHAR(10);
    SELECT VARIABLE_VALUE INTO slave_status
    FROM information_schema.GLOBAL_STATUS
    WHERE VARIABLE_NAME = 'SLAVE_RUNNING';

    IF slave_status != 'ON' THEN
        SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 0; -- 或根據實際錯誤碼設定
        START SLAVE;
    END IF;
END //
DELIMITER ;

限制:預存程序中無法直接執行 SHOW SLAVE STATUS,故無法獲取具體錯誤碼 (Last_SQL_Errno) 精準處理,僅能粗略重啟。

2. 建立事件

CREATE EVENT IF NOT EXISTS `Slave_Monitor`
ON SCHEDULE EVERY 5 SECOND
ON COMPLETION PRESERVE
DO
    CALL Slave_Monitor();
  • EVERY 5 SECOND:每 5 秒觸發。
  • ON COMPLETION PRESERVE:執行完保留事件 (預設 DROP),適合週期性任務。

3. 運行時動態控制

-- 暫停事件
ALTER EVENT `Slave_Monitor` ON COMPLETION PRESERVE DISABLE;

-- 恢復事件
ALTER EVENT `Slave_Monitor` ON COMPLETION PRESERVE ENABLE;

事件調度器 vs Cron vs 應用層排程

維度MySQL Event SchedulerLinux Cron應用層
精度秒級分鐘級任意 (視框架)
管理介面SQL (CREATE/ALTER/DROP EVENT)crontab -e程式碼/配置檔
事務整合原生支援、同連線上下文需自行連線管理原生
高可用隨 MySQL 主從切換需手動同步事件定義獨立於 DB隨應用部署
適用場景資料庫內部維護 (分區輪轉、統計更新、從庫監控)系統級備份、日誌清理、外部腳本業務邏輯排程、跨服務編排

最佳實踐建議

  1. 事件定義 **納入版本控管** (SQL 檔),主從切換時同步部署。
  2. 避免長時間運行的事件阻塞調度器執行緒,複雜邏輯放入預存程序並注意執行時間。
  3. 監控 event_scheduler 執行緒狀態,異常時告警。
  4. MySQL 5.7+ 可用 information_schema.EVENTS 查詢所有事件狀態。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved