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

MySQL 事件調度器完整指南:從啟用到定時任務實戰

     編輯:MySQL 綜合教學

MySQL 事件調度器完整指南:從啟用到定時任務實戰

MySQL Event Scheduler(事件調度器)類似 Linux crontab,可在資料庫內部定期執行 SQL 或預存過程。本文詳解啟用、權限、語法、實戰案例。

一、查看與啟用事件調度器

1. 查看狀態(三種方式)

SHOW VARIABLES LIKE 'event_scheduler';
SELECT @@event_scheduler;
SHOW PROCESSLIST;  -- 若顯示 "event_scheduler" 進程則已啟用

2. 啟用方式(四種等效)

SET GLOBAL event_scheduler = 1;
SET @@global.event_scheduler = 1;
SET GLOBAL event_scheduler = ON;
SET @@global.event_scheduler = ON;

1/ON 開啟,0/OFF 關閉。重啟後失效,需加入 my.cnf [mysqld] 區段:event_scheduler=ON。

二、事件權限控制

  • 單獨使用 EVENT: 需 EVENT 權限(查看/創建),執行 SQL 時需該 SQL 權限。權限存於 mysql.user 和 mysql.db 的 Event_priv。
  • 搭配 Stored Procedure: 需 CREATE ROUTINE(創建)、EXECUTE(調用)、以及 SQL 本身權限。

授權範例

-- 查看用戶 EVENT 權限
SELECT HOST, USER, Event_priv FROM mysql.user;

-- 授權
UPDATE mysql.user SET Event_priv = 'Y' WHERE HOST='%' AND USER='bfsql';
FLUSH PRIVILEGES;

-- 驗證
SHOW GRANTS FOR 'bfsql'@'%';

三、創建事件語法詳解

CREATE EVENT [IF NOT EXISTS] event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
[COMMENT 'comment']
DO sql_statement
  • schedule:AT timestamp (一次性) 或 EVERY interval STARTS timestamp [ENDS timestamp] (循環)。
  • ON COMPLETION PRESERVE:任務完成後保留事件定義,否則自動刪除。
  • ENABLE/DISABLE:創建即啟用/禁用。
  • DO:可為單條 SQL 或 BEGIN ... END 複合語句(需 DELIMITER)。

常用排程範例

ALTER EVENT e_test ON COMPLETION PRESERVE ENABLE;   -- 啟用
ALTER EVENT e_test ON COMPLETION PRESERVE DISABLE;  -- 禁用
SHOW EVENTS;                                        -- 列出所有事件
SHOW CREATE EVENT e_test;                           -- 查看定義

五、完整實戰案例:每秒寫入一條記錄

  1. 建表
    CREATE TABLE mytable (
      id INT AUTO_INCREMENT PRIMARY KEY,
      name VARCHAR(100) NOT NULL DEFAULT '',
      introduce TEXT NOT NULL,
      createtime TIMESTAMP NOT NULL
    );
  2. 建預存過程
    CREATE PROCEDURE mypro()
    BEGIN
      INSERT INTO mytable (name, introduce, createtime)
      VALUES ('1111', 'inner mongolia', NOW());
    END;
  3. 建事件
    CREATE EVENT IF NOT EXISTS eventJob
    ON SCHEDULE EVERY 1 SECOND
    ON COMPLETION PRESERVE
    DO CALL mypro();
  4. 啟用調度器與事件
    SET GLOBAL event_scheduler = 1;
    ALTER EVENT eventJob ON COMPLETION PRESERVE ENABLE;
  5. 驗證
    SELECT * FROM mytable;  -- 每秒增加一行

六、注意事項

  • 事件執行權限以 DEFINER 權限為準(默認創建者),確保 Definer 有執行 SQL 的權限。
  • 長時間運行的事件可能阻塞調度器線程,避免在事件中執行耗時操作。
  • 5.7+ 版本支援 ALTER EVENT ... RENAME TO new_name 重命名。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved