MySQL Event Scheduler(事件調度器)類似 Linux crontab,可在資料庫內部定期執行 SQL 或預存過程。本文詳解啟用、權限、語法、實戰案例。
SHOW VARIABLES LIKE 'event_scheduler'; SELECT @@event_scheduler; SHOW PROCESSLIST; -- 若顯示 "event_scheduler" 進程則已啟用
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 權限(查看/創建),執行 SQL 時需該 SQL 權限。權限存於 mysql.user 和 mysql.db 的 Event_priv。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; -- 查看定義
CREATE TABLE mytable ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL DEFAULT '', introduce TEXT NOT NULL, createtime TIMESTAMP NOT NULL );
CREATE PROCEDURE mypro()
BEGIN
INSERT INTO mytable (name, introduce, createtime)
VALUES ('1111', 'inner mongolia', NOW());
END;CREATE EVENT IF NOT EXISTS eventJob ON SCHEDULE EVERY 1 SECOND ON COMPLETION PRESERVE DO CALL mypro();
SET GLOBAL event_scheduler = 1; ALTER EVENT eventJob ON COMPLETION PRESERVE ENABLE;
SELECT * FROM mytable; -- 每秒增加一行
DEFINER 權限為準(默認創建者),確保 Definer 有執行 SQL 的權限。ALTER EVENT ... RENAME TO new_name 重命名。