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

MySQL 事件排程器 完整實戰指南:啟用、建立週期任務、每日定時執行、預存程序/函數整合範例

     編輯:MySQL 資料庫相關知識

MySQL 5.1+ 內建 **Event Scheduler (事件排程器)**,可替代作業系統 crontab / Windows 排程器,直接在資料庫層執行週期性 SQL 任務。本文完整涵蓋啟用設定、語法詳解、週期/定點觸發範例、與預存程序/函數整合,打造零外部依賴的資料庫自動化作業。

啟用事件排程器

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

-- 永久啟用 (需修改 my.cnf/my.ini)
[mysqld]
event_scheduler = ON

驗證:SHOW VARIABLES LIKE 'event_scheduler'; → ON

基礎語法結構

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

常用排程模式

需求ON SCHEDULE 子句
每分鐘執行一次EVERY 1 MINUTE
每小時執行一次EVERY 1 HOUR
每天固定時間 (02:58)EVERY 1 DAY STARTS TIMESTAMP '2024-01-15 02:58:00'
每週一 03:00EVERY 1 WEEK STARTS '2024-01-15 03:00:00'
特定時間點一次性執行AT TIMESTAMP '2024-12-31 23:59:59'
複雜間隔 (每 3 天 5 小時)EVERY 3 DAY 5 HOUR

實戰範例

範例 1:每分鐘同步資料 (簡單 INSERT ... SELECT)

CREATE EVENT evt_SyncListTest
ON SCHEDULE EVERY 1 MINUTE
DO
  INSERT INTO list_test (col1, col2, col3, col4, col5)
  SELECT col1, col2, col3, col4, col5 FROM table2 WHERE id = 510;

範例 2:每日固定時間執行複雜邏輯 (呼叫預存程序)

CREATE EVENT evt_DailyComplexJob
ON SCHEDULE EVERY 1 DAY
STARTS TIMESTAMP '2024-01-15 02:58:00'
DO
  CALL sp_ComplexDailyJob();  -- 預先建立的預存程序

範例 3:整合預存程序與動態 SQL (股票選股邏輯)

DELIMITER $$
CREATE PROCEDURE `mystock`.`TEST_KKK`()
BEGIN
  DECLARE NUM INT DEFAULT 0;
  DECLARE A INT;
  SELECT (20 - COUNT(STOCK_CODE)) INTO NUM 
  FROM get_stock_list WHERE FLAG = 0 AND STIME = CURDATE();
  
  IF NUM > 0 THEN
    PREPARE STMT FROM 
      'INSERT INTO get_stock_list (stock_code,stock_name,close,raises,stime) 
       SELECT stock_code,stock_name,close,result1,selectd 
       FROM choice_stock 
       WHERE stock_code NOT IN (SELECT stock_code FROM get_stock_list WHERE stime = CURDATE() AND flag = 0) 
         AND selectd = CURDATE() 
       ORDER BY id LIMIT ?';
    SET @A = NUM;
    EXECUTE STMT USING @A;
    DEALLOCATE PREPARE STMT;
  END IF;
END$$
DELIMITER ;

範例 4:建立函數回傳處理筆數 (供事件呼叫)

DELIMITER $$
CREATE FUNCTION `FUNCTION_ADD_STOCK_FOR20`() RETURNS INT
BEGIN
  DECLARE NUM, ANOTHER INT;
  SELECT COUNT(STOCK_CODE) INTO NUM FROM get_stock_list WHERE FLAG = 0 AND STIME = CURDATE();
  IF NUM < 20 THEN
    SET ANOTHER = 20 - NUM;
    INSERT INTO get_stock_list (stock_code,stock_name,close,raises,stime)
    SELECT stock_code,stock_name,close,result1,selectd 
    FROM choice_stock 
    WHERE stock_code NOT IN (SELECT stock_code FROM get_stock_list WHERE stime = CURDATE() AND flag = 0)
    ORDER BY id LIMIT 10;
  END IF;
  RETURN NUM;
END$$
DELIMITER ;

管理與監控指令

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

-- 啟用/停用特定事件
ALTER EVENT evt_SyncListTest ENABLE;
ALTER EVENT evt_SyncListTest DISABLE;

-- 刪除事件
DROP EVENT IF EXISTS evt_SyncListTest;

-- 查看事件排程器狀態與執行緒
SHOW PROCESSLIST;  -- 可見 event_scheduler 執行緒

時區陷阱與最佳實務

關鍵: MySQL 事件排程器使用 **伺服器系統時區** (或 time_zone 系統變數)。
  • 確認 SELECT @@global.time_zone, @@session.time_zone; 為 SYSTEM 或明確時區 (如 +08:00)。
  • STARTS TIMESTAMP 字面值**不含時區資訊**,依伺服器時區解析。
  • 跨時區部署建議統一儲存 UTC,應用層轉換顯示。

優缺點對比

維度MySQL EventOS Crontab / Windows Task
部署耦合度低 (隨資料庫遷移)高 (需同步排程設定)
權限控管資料庫帳號權限作業系統帳號權限
失敗重試/警報需自行實作 (錯誤表 + 事件)內建/第三方工具豐富
長時間執行阻塞佔用資料庫連線/執行緒獨立進程不影響 DB
版本需求MySQL 5.1+無

建議適用場景

  • 資料庫內部維護:分區管理、統計更新、歸檔清理、快照重建。
  • 輕量級業務同步:單表同步、彙總表重算、快取刷新。
  • **不建議**:耗時超過排程間隔、需外部 API 呼叫、複雜錯誤處理流程的任務。

善用 MySQL 事件排程器,將週期性資料庫作業內建化,簡化部署架構,提升運維自動化程度。

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