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

MySQL 事件調度器完整指南:建立、管理、監控與最佳實踐

     編輯:MySQL 資料庫相關知識

MySQL 5.1+ 內建事件調度器,可替代作業系統的 cron 執行資料庫內部週期性任務(清理歷史資料、統計彙總、分區維護等)。本文涵蓋啟用、語法詳解、實戰範例、權限控管與監控排錯。

一、啟用事件調度器

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

-- 永久啟用:在 my.cnf [mysqld] 區段加入
event_scheduler = ON

-- 驗證狀態
SHOW VARIABLES LIKE 'event_scheduler';
SELECT @@event_scheduler;

二、建立事件語法詳解

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:
    quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK | SECOND | YEAR_MONTH | DAY_HOUR | ...}

關鍵子句說明

  • ON COMPLETION PRESERVE:執行完成後保留事件定義(預設 NOT PRESERVE,一次性事件執行完即刪除)。
  • ENABLE/DISABLE:建立時即指定是否啟用。
  • STARTS/ENDS:指定週期任務的生效時間窗。

三、實戰範例

1. 每天凌晨 2 點清理 30 天前的日誌

CREATE EVENT `ev_cleanup_old_logs`
ON SCHEDULE EVERY 1 DAY
STARTS CURRENT_DATE + INTERVAL 2 HOUR
ON COMPLETION PRESERVE
ENABLE
DO
    DELETE FROM `access_log` WHERE `created_at` < DATE_SUB(NOW(), INTERVAL 30 DAY);

2. 每月 1 號 00:00 建立下個月分區(需配合存儲過程)

CREATE EVENT `ev_add_monthly_partition`
ON SCHEDULE EVERY 1 MONTH
STARTS '2024-01-01 00:00:00'
ON COMPLETION PRESERVE
ENABLE
DO
    CALL `sp_add_next_month_partition`();

3. 單次執行:5 分鐘後發送通知

CREATE EVENT `ev_one_time_notify`
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 MINUTE
ON COMPLETION PRESERVE
DO
    INSERT INTO `notifications` (`msg`, `created_at`) VALUES ('Task started', NOW());

四、事件管理操作

-- 修改事件
ALTER EVENT `ev_cleanup_old_logs`
    DISABLE;  -- 或 ENABLE, RENAME TO new_name, ON SCHEDULE ...

-- 刪除事件
DROP EVENT [IF EXISTS] `ev_cleanup_old_logs`;

-- 查看所有事件
SHOW EVENTS;
-- 或查詢 information_schema
SELECT * FROM information_schema.EVENTS WHERE EVENT_SCHEMA = 'mydb';

五、權限與監控

  • 需要 EVENT 權限才能建立/修改/刪除事件。
  • 事件執行時以 DEFINER 權限運行(預設建立者),需確保 DEFINER 具備執行 SQL 的權限。
  • 監控事件執行狀態:SHOW EVENTS 中的 LAST_EXECUTED、STATUS 欄位;錯誤會寫入錯誤日誌。
  • 查看正在運行的事件執行緒:SHOW PROCESSLIST 中 Command = 'Daemon'、State = 'Waiting for next activation'。

六、最佳實踐與避坑

  1. 避免長時間運行的 SQL:事件執行緒是單線程序列執行,長 SQL 會阻塞後續事件。拆分為小批次或用存儲過程控制。
  2. 時區一致性:確保 system_time_zone、time_zone、應用層時區一致,否則 STARTS 時間會偏移。
  3. 冪等性設計:事件可能重複執行(如重啟後補跑),SQL 需冪等(如 INSERT IGNORE、DELETE WHERE 条件)。
  4. 備份與遷移:mysqldump --events 導出事件定義;遷移時注意 DEFINER 帳號是否存在。
  5. 不用事件做高頻任務:秒級調度請用應用層排程器,事件調度器精度約秒級,且單線程易堵塞。

善用事件調度器,能將資料庫維護邏輯內聚於資料庫層,減少外部依賴,提升系統自治能力。

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