-- 查看狀態
SHOW VARIABLES LIKE '%sche%';
-- event_scheduler 值為 ON/1 表示啟用
-- 動態啟用(重啟失效)
SET GLOBAL event_scheduler = 1;
-- 永久生效:my.cnf [mysqld] 區塊添加
event_scheduler = ON
DELIMITER $$
DROP PROCEDURE IF EXISTS e_test $$
CREATE PROCEDURE e_test()
BEGIN
INSERT INTO t VALUES('1');
END $$
DELIMITER ;
-- 每秒執行一次
CREATE EVENT IF NOT EXISTS event_test
ON SCHEDULE EVERY 1 SECOND
ON COMPLETION PRESERVE
DO CALL e_test();
-- 啟用/禁用事件
ALTER EVENT event_test ON COMPLETION PRESERVE ENABLE;
ALTER EVENT event_test ON COMPLETION PRESERVE DISABLE;
CREATE EVENT EVENT1
ON SCHEDULE EVERY 9 DAY STARTS NOW()
ON COMPLETION PRESERVE ENABLE
DO CALL TOTAL();
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 CALL STAT();
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 CALL SEASON_STAT();
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 CALL YEAR_STAT();
| 子句 | 含義 |
|---|---|
| ON SCHEDULE | 定義執行時間規則 |
| EVERY n UNIT | 間隔執行(SECOND/MINUTE/HOUR/DAY/WEEK/MONTH/QUARTER/YEAR) |
| STARTS timestamp | 首次執行時間 |
| ENDS timestamp | 結束時間(可選) |
| ON COMPLETION PRESERVE | 執行完保留事件(默認 DROP) |
| ENABLE/DISABLE | 啟用/禁用事件 |
測試月/季/年排程時,可將系統時間調整為期間末尾(如 12-31 23:59:55)驗證觸發邏輯。
-- 查看所有事件
SHOW EVENTS;
-- 查看特定事件定義
SHOW CREATE EVENT event_test;
-- 刪除事件
DROP EVENT IF EXISTS event_test;