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

MySQL 5.1 事件調度器完整指南:啟用配置、排程語法、秒級精度任務、維護操作與衝突避坑

     編輯:MySQL 綜合教學

MySQL 5.1.6+ 引入事件調度器,可替代 OS 排程實現秒級精度的定時任務(清理、統計、監控)。本文完整覆蓋啟用方式、CREATE EVENT 語法詳解、8 類排程範例、ALTER/DROP/SHOW 維護指令、INFORMATION_SCHEMA.EVENTS 查詢與多事件衝突避坑。

啟用事件調度器

-- 臨時生效
SET GLOBAL event_scheduler = ON;  -- 或 1

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

-- 啟動參數
mysqld --event_scheduler=1

-- 驗證
SHOW VARIABLES LIKE 'event_scheduler';
SELECT @@event_scheduler;
SHOW PROCESSLIST;  -- 可見 event_scheduler 線程

CREATE EVENT 語法結構

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|SECOND|...}

8 類排程實戰範例

需求SQL 範例
每秒插入一筆CREATE EVENT e_ins ON SCHEDULE EVERY 1 SECOND DO INSERT INTO t(ts) VALUES (NOW());
5 秒後清空表(單次)CREATE EVENT e_trunc ON SCHEDULE AT NOW() + INTERVAL 5 SECOND DO TRUNCATE TABLE t;
指定時間點執行CREATE EVENT e_fix ON SCHEDULE AT '2025-12-31 23:59:59' DO TRUNCATE TABLE t;
每天固定時間CREATE EVENT e_daily ON SCHEDULE EVERY 1 DAY STARTS '2025-01-01 02:00:00' DO TRUNCATE TABLE t;
5 天後開始每天執行CREATE EVENT e_delay ON SCHEDULE EVERY 1 DAY STARTS NOW() + INTERVAL 5 DAY DO TRUNCATE TABLE t;
每天執行,5 天後停止CREATE EVENT e_end ON SCHEDULE EVERY 1 DAY ENDS NOW() + INTERVAL 5 DAY DO TRUNCATE TABLE t;
5 天後啟動,1 月後停止CREATE EVENT e_win ON SCHEDULE EVERY 1 DAY STARTS NOW() + INTERVAL 5 DAY ENDS NOW() + INTERVAL 1 MONTH DO TRUNCATE TABLE t;
單次執行後自動銷毀CREATE EVENT e_once ON SCHEDULE EVERY 1 DAY ON COMPLETION NOT PRESERVE DO TRUNCATE TABLE t;

日常維護指令

-- 修改排程
ALTER EVENT e_daily ON SCHEDULE EVERY 5 DAY;

-- 禁用/啟用
ALTER EVENT e_daily DISABLE;
ALTER EVENT e_daily ENABLE;

-- 重命名 + 註釋
ALTER EVENT e_daily RENAME TO e_daily_v2 COMMENT 'v2';

-- 刪除
DROP EVENT IF EXISTS e_daily;

-- 查看所有事件
SHOW EVENTS;
SHOW EVENTS FROM db_name;

-- 查看建立語句
SHOW CREATE EVENT e_daily\G

-- 詳細資訊
SELECT * FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME='e_ins' AND EVENT_SCHEMA='test'\G

衝突與避坑

  • 同一表並發 DML:如「每秒 INSERT」與「每天 TRUNCATE」同時作用同表,可能導致鎖等待或資料不一致,建議錯開時間窗或用分區表。
  • 事件內調用存儲程序:DO CALL proc_name(); 可封裝複雜邏輯。
  • 時區一致性:確保 system_time_zone、time_zone 與業務預期一致。
  • 權限:建立需 EVENT 權限,SUPER 可查看所有事件。

結論

事件調度器提供秒級精度、資料庫內建、無外部依賴的定時能力,極適合股票、賠率、即時統計等高實時性場景。善用 ON COMPLETION PRESERVE 控制生命週期,配合監控告警,可構建穩健的資料庫級排程體系。

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