首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 定時事件排程器 建立與管理完整教學

     編輯:MySQL 資料庫相關知識

一、事件排程器啟用與檢查

1. 檢查狀態(三種方法)

SHOW VARIABLES LIKE 'event_scheduler';
SELECT @@event_scheduler;
SHOW PROCESSLIST;

2. 啟用/關閉(四種方法)

SET GLOBAL event_scheduler = 1;     -- 或 ON
SET @@global.event_scheduler = 1;
SET GLOBAL event_scheduler = ON;
SET @@global.event_scheduler = ON;
-- 關閉用 0 或 OFF

二、權限控制

  • 單獨 EVENT:建立/檢視需 EVENT 權限,執行需對應 SQL 權限。權限儲存於 mysql.user 和 mysql.db 的 Event_priv 欄位。
  • EVENT + Stored Procedure:建立需 CREATE ROUTINE,呼叫需 EXECUTE,內部 SQL 需對應權限。
-- 授權範例
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

排程類型範例

-- 每 30 秒執行一次
CREATE EVENT IF NOT EXISTS e_blog
ON SCHEDULE EVERY 30 SECOND
ON COMPLETION PRESERVE
DO BEGIN CALL MoveBlogData(); END;

-- 立即開始,每 9 天執行
CREATE EVENT EVENT1
ON SCHEDULE EVERY 9 DAY STARTS NOW()
ON COMPLETION PRESERVE ENABLE
DO BEGIN CALL TOTAL(); END;

-- 每月 1 號凌晨 1 點
CREATE EVENT EVENT2
ON SCHEDULE EVERY 1 MONTH
STARTS DATE_ADD(DATE_ADD(DATE_SUB(CURDATE(), INTERVAL DAY(CURDATE())-1 DAY), INTERVAL 1 MONTH), INTERVAL 1 HOUR)
ON COMPLETION PRESERVE ENABLE
DO BEGIN CALL STAT(); END;

-- 每季首日凌2點
CREATE EVENT TOTAL_SEASON_EVENT
ON SCHEDULE EVERY 1 QUARTER
STARTS DATE_ADD(DATE_ADD(DATE(CONCAT(YEAR(CURDATE()),'-',ELT(QUARTER(CURDATE()),1,4,7,10),'-',1)), INTERVAL 1 QUARTER), INTERVAL 2 HOUR)
ON COMPLETION PRESERVE ENABLE
DO BEGIN CALL SEASON_STAT(); END;

-- 每年 1/1 凌晨 4 點
CREATE EVENT TOTAL_YEAR_EVENT
ON SCHEDULE EVERY 1 YEAR
STARTS DATE_ADD(DATE(CONCAT(YEAR(CURDATE())+1,'-',1,'-',1)), INTERVAL 4 HOUR)
ON COMPLETION PRESERVE ENABLE
DO BEGIN CALL YEAR_STAT(); END

四、事件啟用/停用

ALTER EVENT e_test ON COMPLETION PRESERVE ENABLE;   -- 啟用
ALTER EVENT e_test ON COMPLETION PRESERVE DISABLE;  -- 停用

五、實戰範例

-- 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;  -- 每秒新增一筆
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved