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

MySQL 事件調度器實現定時執行存儲過程

     編輯:MySQL 綜合教學

前置檢查與啟用


-- 查看事件調度器狀態
SHOW VARIABLES LIKE 'event_scheduler';
-- OFF 需啟用
SET GLOBAL event_scheduler = ON;
-- 永久生效需寫入 my.cnf
[mysqld]
event_scheduler=ON

創建存儲過程示例


DELIMITER //
CREATE PROCEDURE sp_cleanup_old_logs()
BEGIN
    DECLARE rows_deleted INT DEFAULT 0;
    DELETE FROM operation_logs 
    WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY);
    SET rows_deleted = ROW_COUNT();
    INSERT INTO maintenance_log(task_name, affected_rows, exec_time)
    VALUES ('cleanup_old_logs', rows_deleted, NOW());
END//
DELIMITER ;

創建定時事件


-- 每天凌晨 2:00 執行
CREATE EVENT ev_daily_cleanup
ON SCHEDULE EVERY 1 DAY
STARTS '2024-01-01 02:00:00'
DO CALL sp_cleanup_old_logs();

-- 每小時執行一次
CREATE EVENT ev_hourly_sync
ON SCHEDULE EVERY 1 HOUR
STARTS CURRENT_TIMESTAMP
DO CALL sp_sync_data();

-- 單次執行 (指定時間點)
CREATE EVENT ev_one_time
ON SCHEDULE AT '2024-12-31 23:59:59'
DO CALL sp_year_end_process();

事件管理操作

操作SQL
查看事件SHOW EVENTS FROM db_name;
啟用/禁用ALTER EVENT ev_name ENABLE/DISABLE;
修改排程ALTER EVENT ev_name ON SCHEDULE EVERY 6 HOUR;
刪除事件DROP EVENT IF EXISTS ev_name;
查看定義SHOW CREATE EVENT ev_name;

權限要求

  • 創建事件:EVENT 權限
  • 調用存儲過程:EXECUTE 權限
  • 超級權限:SUPER (修改全局 event_scheduler)

最佳實踐與避坑

  1. 時區一致性: 服務器、MySQL、應用統一使用 UTC,避免夏令時導致執行時間偏移
  2. 防止重複執行: 存儲過程內使用 GET_LOCK('event_name', 0) 互斥鎖
  3. 異常捕獲: 過程中用 DECLARE CONTINUE HANDLER FOR SQLEXCEPTION 記錄錯誤不中斷事件
  4. 長任務拆分: 單次執行超過 30 秒拆分為多個事件或改用外部調度 (Airflow/cron)
  5. 監控告警: 定期檢查 LAST_EXECUTED、STATUS,結合監控系統告警失效事件

替代方案對比

方案優點缺點適用場景
MySQL Event無外部依賴、事務一致、權限可控單實例單點、無分布式協調、調試困難單庫內維護任務
cron + mysql client靈活、成熟、日誌豐富需管理密碼、網絡依賴、無事務上下文跨庫/跨實例任務
應用層定時任務業務邏輯集中、易測試、分布式鎖部署複雜、需應用常駐複雜業務流程
分布式調度器高可用、可視化、重試補償運維成本高企業級核心任務
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved