需求:每日統計 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
daily_max_avg_online,類型選 PROCEDUREevt_daily_online_statCALL daily_max_avg_online();2024-01-15 02:00:00-- 查看狀態 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 = OFF SET GLOBAL event_scheduler = ON 存儲過程報錯 游標未關閉、HANDLER 未聲明 檢查 DECLARE 順序:變數 → 游標 → HANDLER 時區不一致 系統/會話時區不同 存儲過程內 SET time_zone = '+08:00';權限不足 缺少 EVENT 權限 GRANT EVENT ON db.* TO 'user'@'host';七、生產環境建議
INSERT ... SELECT 避免游標循環LAST_EXECUTED、STATUS 異常告警