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

MySQL 事件調度器:從開啟到定時任務創建的完整指南

     編輯:MySQL 綜合教學

事件 vs 觸發器

  • 觸發器:響應表操作(INSERT/UPDATE/DELETE)
  • 事件:按時間周期觸發(類 Linux crontab),MySQL 5.1+ 支持

啟用事件調度器(四種方式)

  1. 運行時動態:SET GLOBAL event_scheduler = ON;(或 =1)
  2. 配置文件永久:my.cnf [mysqld] 下加 event_scheduler = ON,重啟生效
  3. 啟動參數:mysqld --event_scheduler=ON
  4. 驗證:SHOW VARIABLES LIKE 'event_scheduler'; 或 SHOW PROCESSLIST; 看到 event_scheduler 線程

最佳實踐:配置文件 + 運行時雙保險,防重啟失效。

權限準備

  • 創建/查看事件需 EVENT 權限(mysql.user.Event_priv)
  • 事件內調用存儲過程需 CREATE ROUTINE、EXECUTE 權限
  • 授權示例:
    UPDATE mysql.user SET Event_priv = 'Y' WHERE User='bfsql' AND Host='%';
    FLUSH PRIVILEGES;
    

創建事件語法

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

schedule 支持:

  • AT timestamp [+ INTERVAL interval] — 一次性
  • EVERY interval [STARTS timestamp] [ENDS timestamp] — 循環

實戰示例庫

需求SQL
每秒插入時間戳 CREATE EVENT e_test_insert ON SCHEDULE EVERY 1 SECOND DO INSERT INTO test.aaa VALUES (CURRENT_TIMESTAMP);
5 天后清空表(一次性) CREATE EVENT e_test ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 DAY DO TRUNCATE TABLE test.aaa;
每天 01:00 清空表 CREATE EVENT e_test ON SCHEDULE EVERY 1 DAY STARTS DATE_ADD(DATE_SUB(CURDATE(), INTERVAL DAY(CURDATE())-1 DAY), INTERVAL 1 HOUR) DO TRUNCATE TABLE test.aaa;
每月 1 號 02:00 統計 CREATE EVENT e_month ON SCHEDULE EVERY 1 MONTH STARTS DATE_ADD(DATE_SUB(CURDATE(), INTERVAL DAY(CURDATE())-1 DAY), INTERVAL 2 HOUR) DO CALL STAT();
每季度 1 號 03:00 CREATE EVENT e_quarter ON SCHEDULE EVERY 1 QUARTER STARTS DATE_ADD(DATE(CONCAT(YEAR(CURDATE()),'-',ELT(QUARTER(CURDATE()),1,4,7,10),'-1')), INTERVAL 3 HOUR) DO CALL SEASON_STAT();
每年 1 月 1 日 04:00 CREATE EVENT e_year ON SCHEDULE EVERY 1 YEAR STARTS DATE_ADD(DATE(CONCAT(YEAR(CURDATE())+1,'-1-1')), INTERVAL 4 HOUR) DO CALL YEAR_STAT();

事件生命周期管理

  • 啟用/禁用:ALTER EVENT e_test ENABLE/DISABLE;
  • 修改周期:ALTER EVENT e_test ON SCHEDULE EVERY 5 DAY;
  • 刪除:DROP EVENT [IF EXISTS] e_test;

主從複製陷阱(必讀)

主庫開啟事件調度器,從庫關閉! 事件執行的 SQL 會寫 Binlog 同步到從庫;若從庫也開啟,同一邏輯雙重執行 → 數據衝突、卡庫。切主時記得翻轉開關。

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