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

Navicat 定時事件調用 MySQL 存儲過程:游標批量統計與 Event Scheduler 啟用全流程

     編輯:MySQL 綜合教學

Navicat 定時事件調用 MySQL 存儲過程:游標批量統計與 Event Scheduler 啟用全流程

一、建立帶游標的存儲過程

需求:每日統計 real_time_online_statistics 表的最大/平均在線數,寫入 daily_max_avg_online_statistics。

CREATE PROCEDURE daily_max_avg_online()
BEGIN
    DECLARE max_online INT;
    DECLARE avg_online INT;
    DECLARE stat_time TIMESTAMP;
    DECLARE done INT DEFAULT 0;

    DECLARE cur CURSOR FOR
        SELECT MAX(online_num), ROUND(AVG(online_num)), DATE_FORMAT(statistical_time, '%y-%m-%d')
        FROM real_time_online_statistics
        GROUP BY DATE_FORMAT(statistical_time, '%y-%m-%d');

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    OPEN cur;

    read_loop: LOOP
        FETCH cur INTO max_online, avg_online, stat_time;
        IF done THEN
            LEAVE read_loop;
        END IF;

        INSERT INTO daily_max_avg_online_statistics (id, max_online_num, avg_online_num, statistical_time)
        VALUES (UUID(), max_online, avg_online, stat_time);
    END LOOP;

    CLOSE cur;
END

二、Navicat 圖形化建立步驟

  1. 左側對象面板 → 函數 → 右鍵 新建函數
  2. 名稱:daily_max_avg_online,類型選 PROCEDURE
  3. 在編輯器貼上上述 SQL,Ctrl+S 保存

三、建立定時事件

  1. 左側面板 → 事件 → 右鍵 新建事件
  2. 名稱:evt_daily_online_stat
  3. 定義:CALL daily_max_avg_online();
  4. 時間設定:每天一次,起始 2024-01-15 02:00:00
  5. 狀態:啟用

四、關鍵:啟用 Event Scheduler

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

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

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

五、驗證與管理

問題原因解決
事件不執行event_scheduler = OFFSET GLOBAL event_scheduler = ON
存儲過程報錯游標未關閉、HANDLER 未聲明檢查 DECLARE 順序:變數 → 游標 → HANDLER
時區不一致系統/會話時區不同存儲過程內 SET time_zone = '+08:00';
權限不足缺少 EVENT 權限GRANT EVENT ON db.* TO 'user'@'host';


七、生產環境建議

  • 大量數據統計優先用 INSERT ... SELECT 避免游標循環
  • 事件執行時間避開業務高峰(如凌晨 2-4 點)
  • 關鍵事件添加監控:LAST_EXECUTED、STATUS 異常告警
  • 長期運行的事件考慮拆分為多個分批事件,防止長事務阻塞
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved