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

MySQL Event Scheduler 事件調度器全攻略:定時任務替代 Cron、動態管理與實戰案例

     編輯:MySQL 綜合教學

啟用事件調度器

# my.cnf
[mysqld]
event_scheduler=ON

# 運行時動態啟用(重啟失效)
SET GLOBAL event_scheduler=ON;

# 驗證
SHOW VARIABLES LIKE 'event_scheduler';  -- ON

創建事件語法

CREATE
  [DEFINER = { user | CURRENT_USER }]
  EVENT [IF NOT EXISTS] event_name
  ON SCHEDULE schedule
  [ON COMPLETION [NOT] PRESERVE]
  [ENABLE | DISABLE | DISABLE ON SLAVE]
  [COMMENT 'comment']
  DO event_body;

schedule:
  AT timestamp [+ INTERVAL interval] ...          -- 一次性
  | EVERY interval
      [STARTS timestamp [+ INTERVAL ...]]
      [ENDS timestamp [+ INTERVAL ...]]           -- 週期性

interval:
  quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | SECOND
           | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND
           | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

實戰案例全集

1. 一次性任務:5 秒後創建表

CREATE EVENT IF NOT EXISTS ev_create_t
  ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 SECOND
  DO CREATE TABLE t (a INT, b CHAR(10), c TIMESTAMP);

2. 週期性任務:每 5 秒插入一行

CREATE EVENT IF NOT EXISTS ev_ins_t
  ON SCHEDULE EVERY 5 SECOND
  DO INSERT INTO t VALUES (1, 1, NOW());

3. 定時清理:每 10 秒清空表

CREATE EVENT IF NOT EXISTS ev_trunc_t
  ON SCHEDULE EVERY 10 SECOND
  DO TRUNCATE TABLE t;

4. 指定時間點執行

CREATE EVENT IF NOT EXISTS ev_at_time
  ON SCHEDULE AT TIMESTAMP '2024-12-31 23:59:00'
  DO TRUNCATE TABLE t;

5. 每天固定時間執行

CREATE EVENT IF NOT EXISTS ev_daily
  ON SCHEDULE EVERY 1 DAY
  STARTS '2024-01-01 02:00:00'
  DO TRUNCATE TABLE t;

6. 延遲啟動、限時結束:5 天后開始,每天執行,1 個月後停止

CREATE EVENT IF NOT EXISTS ev_window
  ON SCHEDULE EVERY 1 DAY
  STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY
  ENDS CURRENT_TIMESTAMP + INTERVAL 1 MONTH
  DO TRUNCATE TABLE t;

事件管理操作

操作SQL
查看所有事件SHOW EVENTS; / SHOW EVENTS FROM db_name;
查看特定事件詳情SHOW EVENTS LIKE 'ev_name'\G
查看創建語句SHOW CREATE EVENT ev_name\G
禁用事件ALTER EVENT ev_name DISABLE;
啟用事件ALTER EVENT ev_name ENABLE;
修改排程ALTER EVENT ev_name ON SCHEDULE EVERY 10 DAY;
重命名ALTER EVENT ev_name RENAME TO new_name;
刪除事件DROP EVENT [IF EXISTS] ev_name;

權限要求

  • 創建/修改/刪除:EVENT 權限。
  • 執行體內的 SQL:需 DEFINER 擁有相應權限(默認創建者)。

Event vs Cron 對比

維度MySQL EventLinux Cron
管理位置數據庫內部操作系統層面
備份遷移隨數據庫備份自動遷移需單獨備份 crontab
事務支持原生支持(DO 內可用事務)需腳本自行控制
精度秒級分鐘級(標準 cron)
調試查看SHOW EVENTS、INFORMATION_SCHEMA.EVENTScrontab -l、系統日誌
適用場景數據庫內部維護(清理、統計、分區管理)系統級任務、調用外部程序、跨庫操作

避坑指南

  1. event_scheduler=OFF 時事件不執行:監控告警必須包含此變量。
  2. DO 語句報錯不會停止事件:但會寫入錯誤日誌,建議 DO 內包裝 BEGIN ... END 並聲明 DECLARE CONTINUE HANDLER。
  3. 主從複製:DISABLE ON SLAVE 防止從庫重複執行;GTID 模式下事件創建語句會同步,需注意 DEFINER 主機一致性。
  4. 時區:事件按 time_zone 系統變量執行,確保 Master/Slave 時區一致。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved