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

MySQL 事件調度器:定時任務的原生實現與實戰指南

     編輯:MySQL 綜合教學

什麼是事件

MySQL Event Scheduler(5.1.6+)是數據庫內置的**定時任務引擎**,類似 Linux crontab 但運行在數據庫進程內。事件到達指定時間自動觸發執行預定義 SQL,**被動執行**(時間驅動),區別於觸發器的數據變更驅動。

啟用調度器

-- 查看狀態
SHOW VARIABLES LIKE 'event_scheduler';
-- OFF/ON/DISABLED

-- 啟用(運行時生效,重啟失效)
SET GLOBAL event_scheduler = ON;

-- 永久生效:my.cnf [mysqld] 區塊添加
event_scheduler = ON

創建事件語法核心

CREATE EVENT event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
DO sql_statement;

調度類型

  • 一次性:AT '2024-12-31 23:59:59'
  • 循環:EVERY 1 MINUTE / EVERY 1 DAY / EVERY 3 MONTH 等
  • 帶啟動時間:EVERY 1 HOUR STARTS '2024-01-01 00:00:00' ENDS '2025-01-01 00:00:00'

完成策略

  • ON COMPLETION NOT PRESERVE(默認):執行完自動刪除(一次性事件適用)
  • ON COMPLETION PRESERVE:保留事件定義,便於查看歷史/重啟

實戰示例

準備表

CREATE TABLE `user` (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(200) NOT NULL,
  address VARCHAR(500) NOT NULL,
  addtime DATETIME NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

每分鐘插入兩條測試數據

DELIMITER ;;
CREATE EVENT event_minute
ON SCHEDULE EVERY 1 MINUTE
STARTS '2024-01-01 00:00:00'
ON COMPLETION NOT PRESERVE
ENABLE
DO
BEGIN
  INSERT INTO `user`(name, address, addtime) VALUES('test1','test1',NOW());
  INSERT INTO `user`(name, address, addtime) VALUES('test2','test2',NOW());
END;;
DELIMITER ;

指定時間單次執行

CREATE EVENT event_at
ON SCHEDULE AT '2024-01-01 12:00:00'
ON COMPLETION NOT PRESERVE
ENABLE
DO
  INSERT INTO `user`(name, address, addtime) VALUES('AT','AT',NOW());

管理與監控

-- 查看所有事件
SHOW EVENTS;
-- 或
SELECT * FROM information_schema.EVENTS;

-- 修改事件
ALTER EVENT event_minute DISABLE;  -- 暫停
ALTER EVENT event_minute ENABLE;   -- 恢復
ALTER EVENT event_minute ON SCHEDULE EVERY 5 MINUTE;  -- 改頻率

-- 刪除事件
DROP EVENT event_minute;

-- 查看事件執行狀態(需啟用 general_log 或監控 information_schema.PROCESSLIST)

優缺點與適用場景

優點缺點
無外部依賴,隨數據庫遷移精度僅至秒級,不支持毫秒/微秒
事務內執行,可回滾高頻(<1分鐘)任務易產生鎖競爭
權限體系統一(DEFINER/INVOKER)無分布式協調,單點故障
適合數據清理、統計聚合、分區維護複雜業務流程建議用應用層調度(xxl-job, Airflow)

最佳實踐

  1. 事件體保持**極簡、快速**;複雜邏輯調用存儲過程
  2. 長運行任務拆分為批次,避免長事務阻塞
  3. 關鍵事件設置 ON COMPLETION PRESERVE 並配合監控告警
  4. 定期清理 NOT PRESERVE 產生的歷史元數據
  5. 生產環境**禁用** event_scheduler 由應用層統一調度,僅在單機獨立場景使用

MySQL Event 為「數據庫自維護」提供了輕量級選項,用好它,少寫一堆 crontab + shell 腳本。

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