MySQL Event Scheduler 類似 Linux cron,但運行在資料庫內核,適合定時清理、統計聚合、分區維護等資料庫內部任務。
-- 查看狀態
SHOW VARIABLES LIKE 'event_scheduler';
-- 啟用 (運行時生效,重啟失效)
SET GLOBAL event_scheduler = ON; -- 或 1
-- 永久生效:my.cnf [mysqld] 區段加 event_scheduler=ON
CREATE EVENT [IF NOT EXISTS] event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
[COMMENT 'comment']
DO sql_statement;
-- schedule 範例
AT '2023-12-31 23:59:59' -- 一次性
EVERY 1 DAY -- 週期
EVERY 30 MINUTE STARTS '2023-01-01 00:00:00' -- 週期+起始時間
CREATE EVENT updateInfoStatus
ON SCHEDULE EVERY 30 MINUTE
DO
UPDATE `jd_article` SET `status` = 0
WHERE `status` = 1 AND `date` <= NOW();
ALTER EVENT updateInfoStatus
ON SCHEDULE EVERY 1 HOUR
DO
UPDATE `jd_article` SET `status` = 0 WHERE `status` = 1 AND `date` <= NOW();
| 操作 | SQL |
|---|---|
| 臨時禁用 | ALTER EVENT updateInfoStatus DISABLE; |
| 啟用 | ALTER EVENT updateInfoStatus ENABLE; |
| 重命名 | ALTER EVENT old_name RENAME TO new_name; |
| 刪除 | DROP EVENT [IF EXISTS] updateInfoStatus; |
| 查看所有 | SHOW EVENTS; |
| 查看詳情 | SELECT * FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME='updateInfoStatus'; |
| 查看建立語句 | SHOW CREATE EVENT updateInfoStatus; |
DO 只能包含單條 SQL,複雜邏輯請封裝為存儲過程,事件中 CALL proc()。DEFINER(預設創建者),需確保其具備操作權限。