MySQL Event Scheduler(5.1.6+)是數據庫內置的**定時任務引擎**,類似 Linux crontab 但運行在數據庫進程內。事件到達指定時間自動觸發執行預定義 SQL,**被動執行**(時間驅動),區別於觸發器的數據變更驅動。
-- 查看狀態
SHOW VARIABLES LIKE 'event_scheduler';
-- OFF/ON/DISABLED
-- 啟用(運行時生效,重啟失效)
SET GLOBAL event_scheduler = ON;
-- 永久生效:my.cnf [mysqld] 區塊添加
event_scheduler = ON
CREATE EVENT event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
DO sql_statement;
AT '2024-12-31 23:59:59'EVERY 1 MINUTE / EVERY 1 DAY / EVERY 3 MONTH 等EVERY 1 HOUR STARTS '2024-01-01 00:00:00' ENDS '2025-01-01 00:00:00'ON COMPLETION NOT PRESERVE(默認):執行完自動刪除(一次性事件適用)ON COMPLETION PRESERVE:保留事件定義,便於查看歷史/重啟CREATE TABLE `user` (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(200) NOT NULL,
address VARCHAR(500) NOT NULL,
addtime DATETIME NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
DELIMITER ;;
CREATE EVENT event_minute
ON SCHEDULE EVERY 1 MINUTE
STARTS '2024-01-01 00:00:00'
ON COMPLETION NOT PRESERVE
ENABLE
DO
BEGIN
INSERT INTO `user`(name, address, addtime) VALUES('test1','test1',NOW());
INSERT INTO `user`(name, address, addtime) VALUES('test2','test2',NOW());
END;;
DELIMITER ;
CREATE EVENT event_at
ON SCHEDULE AT '2024-01-01 12:00:00'
ON COMPLETION NOT PRESERVE
ENABLE
DO
INSERT INTO `user`(name, address, addtime) VALUES('AT','AT',NOW());
-- 查看所有事件
SHOW EVENTS;
-- 或
SELECT * FROM information_schema.EVENTS;
-- 修改事件
ALTER EVENT event_minute DISABLE; -- 暫停
ALTER EVENT event_minute ENABLE; -- 恢復
ALTER EVENT event_minute ON SCHEDULE EVERY 5 MINUTE; -- 改頻率
-- 刪除事件
DROP EVENT event_minute;
-- 查看事件執行狀態(需啟用 general_log 或監控 information_schema.PROCESSLIST)
| 優點 | 缺點 |
|---|---|
| 無外部依賴,隨數據庫遷移 | 精度僅至秒級,不支持毫秒/微秒 |
| 事務內執行,可回滾 | 高頻(<1分鐘)任務易產生鎖競爭 |
| 權限體系統一(DEFINER/INVOKER) | 無分布式協調,單點故障 |
| 適合數據清理、統計聚合、分區維護 | 複雜業務流程建議用應用層調度(xxl-job, Airflow) |
ON COMPLETION PRESERVE 並配合監控告警NOT PRESERVE 產生的歷史元數據event_scheduler 由應用層統一調度,僅在單機獨立場景使用MySQL Event 為「數據庫自維護」提供了輕量級選項,用好它,少寫一堆 crontab + shell 腳本。