MySQL 內建事件調度器:替代 Cron 的資料庫級定時任務
MySQL 5.1+ 內建 Event Scheduler,無需外部腳本即可實現秒級、分級、天級循環任務。
啟用檢查與開啟
SHOW VARIABLES LIKE 'event_scheduler';
-- OFF 則執行:
SET GLOBAL event_scheduler = ON;
-- 永久生效:my.cnf [mysqld] 區段添加 event_scheduler=ON
CREATE EVENT 語法核心
CREATE EVENT [IF NOT EXISTS] event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
[COMMENT 'comment']
DO sql_statement;
schedule:
AT timestamp [+ INTERVAL interval] -- 單次執行
| EVERY interval [STARTS timestamp] [ENDS timestamp] -- 循環執行
interval:
YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | SECOND
| YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND
| HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND
經典範例集
| 場景 | SQL |
| 每秒插入時間戳 | CREATE EVENT e_test ON SCHEDULE EVERY 1 SECOND DO INSERT INTO test.aaa VALUES (NOW()); |
| 5 天后單次清空表 | CREATE EVENT e_test ON SCHEDULE AT NOW() + INTERVAL 5 DAY DO TRUNCATE TABLE test.aaa; |
| 指定時間單次執行 | CREATE EVENT e_test ON SCHEDULE AT '2023-12-31 23:59:59' DO TRUNCATE TABLE test.aaa; |
| 每天定時清空 | CREATE EVENT e_test ON SCHEDULE EVERY 1 DAY DO TRUNCATE TABLE test.aaa; |
| 5 天后啟動每天任務 | CREATE EVENT e_test ON SCHEDULE EVERY 1 DAY STARTS NOW() + INTERVAL 5 DAY DO TRUNCATE TABLE test.aaa; |
| 每天任務,5 天后停止 | CREATE EVENT e_test ON SCHEDULE EVERY 1 DAY ENDS NOW() + INTERVAL 5 DAY DO TRUNCATE TABLE test.aaa; |
| 5 天後啟動,1 月後停止 | CREATE EVENT e_test ON SCHEDULE EVERY 1 DAY STARTS NOW() + INTERVAL 5 DAY ENDS NOW() + INTERVAL 1 MONTH DO TRUNCATE TABLE test.aaa; |
| 單次執行後自動銷毀 | CREATE EVENT e_test ON SCHEDULE EVERY 1 DAY ON COMPLETION NOT PRESERVE DO TRUNCATE TABLE test.aaa; |
管理指令
-- 修改
ALTER EVENT e_test ON SCHEDULE EVERY 5 DAY;
ALTER EVENT e_test DISABLE; -- 暫停
ALTER EVENT e_test ENABLE; -- 恢復
ALTER EVENT e_test RENAME TO new_name;
-- 刪除
DROP EVENT [IF EXISTS] e_test;
-- 查看
SHOW EVENTS;
SHOW CREATE EVENT e_test;
關鍵參數說明
ON COMPLETION PRESERVE:任務結束後保留事件(預設 NOT PRESERVE,單次任務執行完自動刪除)
ENABLE/DISABLE:創建後是否立即生效(預設 ENABLE)
- 事件體
DO 只能包含**單條 SQL**,複雜邏輯請封裝為存儲過程再 CALL
- 時區以服務器
time_zone 為準
優缺點對比 Cron
| 維度 | Event Scheduler | Cron + 腳本 |
| 部署 | 純 SQL,隨庫遷移 | 需服務器部署腳本 |
| 精度 | 秒級 | 分鐘級(標準 cron) |
| 事務支援 | 原生 | 需腳本控制 |
| 監控 | SHOW EVENTS / information_schema.EVENTS | 系統日誌 |
| 遷移 | 隨 mysqldump 導出 | 單獨遷移 crontab |