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

MySQL 事件調度器 Event Scheduler 詳解:秒級定時任務、Slave 監控實戰

     編輯:MySQL 綜合教學

MySQL 5.1 引入的 Event Scheduler (事件調度器) 是資料庫原生的定時任務引擎,精度達**秒級**,可替代 OS 層面的 cron (最小分鐘級),在「資料庫內部周期性維護、Replication 監控自愈、統計資料更新」等場景極具優勢。

核心概念

  • Event:定義「何時執行、執行什麼 SQL」的資料庫物件。
  • Event Scheduler Thread:背景守護線程 (Command=Daemon, User=event_scheduler),負責時間觸發與調度。
  • 全域開關:event_scheduler 系統變數 (ON/OFF/DISABLED)。

啟用與狀態檢視

-- 動態啟用 (重啟失效)
SET GLOBAL event_scheduler = ON;

-- 永久生效 (my.cnf)
[mysqld]
event_scheduler = ON

-- 檢視調度器線程
SHOW PROCESSLIST;
-- Id: 46147, User: event_scheduler, Command: Daemon, State: Waiting on empty queue

語法速查

CREATE EVENT [IF NOT EXISTS] event_name
  ON SCHEDULE schedule
  [ON COMPLETION [NOT] PRESERVE]
  [ENABLE | DISABLE]
  [COMMENT 'comment']
  DO sql_statement;

-- schedule 範例
AT '2024-12-31 23:59:59'                    -- 單次
EVERY 1 SECOND                               -- 每秒
EVERY 5 MINUTE                               -- 每 5 分鐘
EVERY 1 DAY STARTS '2024-01-01 00:00:00'     -- 每天固定時間
EVERY 1 WEEK ENDS '2025-12-31'               -- 截止日期

-- 管理
ALTER EVENT event_name DISABLE/ENABLE;
DROP EVENT [IF EXISTS] event_name;
SHOW EVENTS [FROM db_name] [LIKE 'pattern'];

實戰案例一:Replication Slave 自愈監控 (每 5 秒檢查)

1. 建立儲存過程

DELIMITER //
CREATE PROCEDURE `sp_slave_monitor`()
BEGIN
  DECLARE v_slave_running VARCHAR(3);
  SELECT VARIABLE_VALUE INTO v_slave_running
  FROM performance_schema.global_status
  WHERE VARIABLE_NAME = 'SLAVE_RUNNING';  -- 5.7+ 用 performance_schema

  IF v_slave_running != 'ON' THEN
    -- 發現 Slave 停止,嘗試跳過 0 個錯誤並重啟
    SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 0;
    START SLAVE;
    -- 可擴充:寫入告警表、發送郵件/企業微信
    INSERT INTO monitor.alert_log (event, msg, created_at)
    VALUES ('SLAVE_AUTO_RESTART', CONCAT('Slave restarted at ', NOW()), NOW());
  END IF;
END//
DELIMITER ;

2. 建立事件

CREATE EVENT `ev_slave_monitor`
  ON SCHEDULE EVERY 5 SECOND
  ON COMPLETION PRESERVE
  ENABLE
  DO CALL sp_slave_monitor();

3. 臨時暫停/恢復

ALTER EVENT ev_slave_monitor DISABLE;
ALTER EVENT ev_slave_monitor ENABLE;

實戰案例二:分區表自動管理 (每天凌晨建立下月分區、歸檔舊分區)

CREATE EVENT `ev_partition_maintenance`
  ON SCHEDULE EVERY 1 DAY
  STARTS '2024-01-01 02:00:00'
  ON COMPLETION PRESERVE
  DO
  BEGIN
    -- 動態建立下個月分區 (範例: RANGE BY MONTH)
    SET @next_month = DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 1 MONTH), '%Y%m');
    SET @sql = CONCAT('ALTER TABLE logs ADD PARTITION (PARTITION p', @next_month,
                      ' VALUES LESS THAN (', UNIX_TIMESTAMP(DATE_ADD(DATE_FORMAT(NOW(), '%Y-%m-01'), INTERVAL 2 MONTH)), '))');
    PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

    -- 歸檔 12 個月前分區 (EXCHANGE PARTITION 到歷史表)
    SET @old_month = DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 12 MONTH), '%Y%m');
    SET @sql2 = CONCAT('ALTER TABLE logs EXCHANGE PARTITION p', @old_month, ' WITH TABLE logs_archive');
    PREPARE stmt2 FROM @sql2; EXECUTE stmt2; DEALLOCATE PREPARE stmt2;
  END;

權限模型

  • 建立事件需 EVENT 權限 (GRANT EVENT ON db.* TO user;)。
  • 事件執行時以 **建立者 (DEFINER)** 的權限執行 (類似 Stored Routine 的 DEFINER / SQL SECURITY)。
  • 若建立者被刪除,事件仍存在但執行會報錯,需 ALTER EVENT ... DEFINER=new_user@host 修正。

限制與注意事項

限制說明替代方案
無法在事件中直接執行 SHOW SLAVE STATUS預備語句不支援查 performance_schema.replication_connection_status / replication_applier_status
秒級調度精度受長查詢阻塞影響單線程串行執行任務邏輯極簡、耗時 < 100ms;複雜任務改用外部調度 (Airflow/xxl-job)
不支援分散式協調單實例內部多實例需外部分散式調度器
DDL (ALTER TABLE) 可能導致事件執行失敗元資料鎖衝突避開 DDL 維護窗口、使用 gh-ost/pt-osc

監控與除錯

-- 查看事件執行狀態
SELECT * FROM information_schema.EVENTS WHERE EVENT_SCHEMA='mydb'\G
-- LAST_EXECUTED, LAST_FAILED, STATUS (ENABLED/DISABLED/SLAVESIDE_DISABLED)

-- 查看事件執行錯誤日誌 (需啟用 log_error_verbosity=3)
SHOW ERRORS;
-- 或查詢 mysql.general_log (若啟用)

總結

Event Scheduler 是「資料庫原生、秒級精度、無外部依賴」的輕量級調度器,極適合 **Slave 自愈、分區維護、統計快照、緩存預熱、臨時表清理** 等資料庫內部週期性任務。複雜業務流程、跨系統編排、高可用調度仍建議使用專業調度平台 (Airflow, DolphinScheduler, xxl-job)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved