🌷 古之立大事者,不惟有超世之才,亦必有堅忍不拔之志
🎐 個人CSND主頁——Micro麥可樂的博客
🐥《Docker實操教程》專欄以最新的Centos版本為基礎進行Docker實操教程,入門到實戰
🌺《RabbitMQ》專欄19年編寫主要介紹使用JAVA開發RabbitMQ的系列教程,從基礎知識到項目實戰
🌸《設計模式》專欄以實際的生活場景為案例進行講解,讓大家對設計模式有一個更清晰的理解
🌛《開源項目》本專欄主要介紹目前熱門的開源項目,帶大家快速了解并輕松上手使用
🍎 《前端技術》專欄以實戰為主介紹日常開發中前端應用的一些功能以及技巧,均附有完整的代碼示例
?《開發技巧》本專欄包含了各種系統的設計原理以及注意事項,并分享一些日常開發的功能小技巧
💕《Jenkins實戰》專欄主要介紹Jenkins+Docker的實戰教程,讓你快速掌握項目CI/CD,是2024年最新的實戰教程
🌞《Spring Boot》專欄主要介紹我們日常工作項目中經常應用到的功能以及技巧,代碼樣例完整
👍《Spring Security》專欄中我們將逐步深入Spring Security的各個技術細節,帶你從入門到精通,全面掌握這一安全技術
如果文章能夠給大家帶來一定的幫助!歡迎關注、評論互動~
MySQL定時任務詳解 - 事件調度器從基礎到實戰
- 1. 前言
- 2. 為什么使用 MySQL 定時任務?
- 3. MySQL 定時任務的基本語法
- 時間調度表達式
- 修改與刪除
- 查看任務
- 4. MySQL 定時任務 vs Quartz、Cron
- 5. 實戰:使用 MySQL 定時任務清理過期日志
- 5.1 創建示例表
- 5.2 插入測試數據
- 5.3 創建定時任務
- 5.4 驗證執行效果
- 6 實戰:每日訂單數據歸檔
- 6.1 創建歸檔表
- 6.2 創建事件
- 6.3 驗證事件狀態
- 6.4 手動測試事件
- 7. 總結
1. 前言
在日常開發中,我們經常會遇到“定時執行任務”的需求,比如每天凌晨清理歷史數據、定時歸檔日志、定期統計報表匯總等。
通常情況下,我們會選擇 任務調度器 來實現,例如 Quartz、xxl-job、Crontab。但其實,MySQL
自身也內置了定時任務(Event Scheduler
)功能,可以直接在數據庫層面實現調度。
雖然MySQL
自身也內置了定時任務非項目中常用,但是了解掌握這門技術還是有必要的,在一些極簡功能項目,或許你會用到它,本文博主將帶小伙伴了解 MySQL 定時任務
的使用方法,通過一個完整的示例來實踐。
2. 為什么使用 MySQL 定時任務?
MySQL從5.1.6版本開始內置了事件調度器(Event Scheduler),允許在數據庫內部創建定時執行的任務,無需外部應用介入
典型場景:
- 定時清理過期數據(如用戶臨時表、日志表)
- 定時生成統計報表并寫入匯總表
- 定時歸檔數據(冷數據轉存)
優點:
無需額外依賴第三方任務調度框架;
與數據庫耦合,執行效率較高;
任務存儲在 MySQL 內部,跨服務部署也能保證執行;
缺點:
靈活性不如 Quartz 等專業任務調度框架;
任務執行依賴 MySQL 的穩定性(數據庫掛了,任務也無法執行);
缺乏復雜的任務管理與監控(需要手工實現日志);
3. MySQL 定時任務的基本語法
在使用前,需要確認事件調度器是否開啟:
-- 查看事件調度器是否開啟
SHOW VARIABLES LIKE 'event_scheduler';-- 如果為 OFF,可執行以下命令開啟(臨時生效)
SET GLOBAL event_scheduler = ON;-- 永久生效(修改 my.cnf 配置)
[mysqld]
event_scheduler=ON
核心語法
CREATE EVENT [IF NOT EXISTS] 事件名稱
ON SCHEDULEschedule_expression -- 調度時間設置
[ON COMPLETION [NOT] PRESERVE] -- 執行后是否保留
[ENABLE | DISABLE | DISABLE ON SLAVE] -- 狀態
DOevent_body; -- 執行的SQL或存儲過程
時間調度表達式
一次性任務:
ON SCHEDULE AT TIMESTAMP '2025-08-18 10:00:00'
重復執行任務:
ON SCHEDULE EVERY 1 DAY
STARTS TIMESTAMP '2025-08-18 00:00:00'
ENDS TIMESTAMP '2025-08-31 23:59:59'
修改與刪除
ON SCHEDULE EVERY 1 DAY
STARTS TIMESTAMP '2025-08-18 00:00:00'
ENDS TIMESTAMP '2025-08-31 23:59:59'
查看任務
SHOW EVENTS;
4. MySQL 定時任務 vs Quartz、Cron
特性 | MySQL Event Scheduler | Quartz | Cron |
---|---|---|---|
部署方式 | 內置數據庫,無需額外安裝 | Java庫,需要集成到項目中 | 系統級任務調度器 |
表達式靈活度 | 支持簡單的 EVERY /AT | 支持復雜的 Cron 表達式 | 標準 Cron 表達式 |
可靠性 | 依賴數據庫 | 依賴應用服務 | 依賴操作系統 |
可監控性 | 無內置監控,需手工記錄 | 提供 Listener/日志 | 可通過日志查看 |
適用場景 | 數據清理、歸檔、統計 | 企業級復雜任務調度 | 系統任務,如腳本執行 |
使用建議:
如果只是做 數據庫內部的小型定時操作,用
MySQL
定時任務即可。
如果需要 分布式、復雜調度、監控告警,Quartz、xxl-job
更合適。
如果是 系統層面的腳本,可以交給Cron
。
5. 實戰:使用 MySQL 定時任務清理過期日志
假設有一個日志表 user_logs
,我們希望每天凌晨自動清理 30 天前的日志
5.1 創建示例表
CREATE TABLE user_logs (id INT AUTO_INCREMENT PRIMARY KEY,user_id INT NOT NULL,action VARCHAR(100),create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
5.2 插入測試數據
INSERT INTO user_logs (user_id, action, create_time)
VALUES (1, 'login', NOW() - INTERVAL 40 DAY),(2, 'logout', NOW() - INTERVAL 10 DAY),(3, 'update_profile', NOW() - INTERVAL 35 DAY);
5.3 創建定時任務
CREATE EVENT IF NOT EXISTS clean_user_logs
ON SCHEDULE EVERY 1 DAY
STARTS TIMESTAMP(CURRENT_DATE + INTERVAL 1 DAY) -- 從明天凌晨開始
DODELETE FROM user_logs WHERE create_time < NOW() - INTERVAL 30 DAY;
5.4 驗證執行效果
手動執行一次刪除邏輯來測試:
DELETE FROM user_logs WHERE create_time < NOW() - INTERVAL 30 DAY;
然后觀察表中是否只保留近 30 天的記錄
6 實戰:每日訂單數據歸檔
每天凌晨3點將超過30天的訂單數據歸檔到 orders_archive
表,并刪除原表數據。
6.1 創建歸檔表
CREATE TABLE orders_archive LIKE orders;
ALTER TABLE orders_archive ADD COLUMN archive_time DATETIME;
6.2 創建事件
DELIMITER $$CREATE EVENT daily_orders_cleanup
ON SCHEDULEEVERY 1 DAY STARTS CURRENT_DATE + INTERVAL 1 DAY + INTERVAL 3 HOUR -- 次日凌晨3點
ON COMPLETION PRESERVE
ENABLE
DO
BEGIN-- 歸檔舊數據INSERT INTO orders_archive SELECT *, NOW() FROM orders WHERE order_date < CURDATE() - INTERVAL 30 DAY;-- 刪除已歸檔數據DELETE FROM orders WHERE order_date < CURDATE() - INTERVAL 30 DAY;
END$$DELIMITER ;
6.3 驗證事件狀態
-- 查看所有事件
SHOW EVENTS;-- 檢查事件最后執行時間
SELECT * FROM information_schema.events
WHERE event_name = 'daily_orders_cleanup';
6.4 手動測試事件
-- 立即測試事件
ALTER EVENT daily_orders_cleanup ENABLE;
CALL mysql.rds_run_event('daily_orders_cleanup');-- 查看執行日志(需開啟通用日志)
SHOW VARIABLES LIKE 'general_log';
7. 總結
MySQL
定時任務 提供了一種快速、輕量化的調度方式,特別適合 數據清理、歸檔、統計 等數據庫內部操作。
它可以減少對外部任務調度框架的依賴,在一些中小型項目中非常實用。
但在復雜調度、分布式任務、可視化監控等方面,它不如 Quartz、xxl-job
等專業工具。
建議使用場景:
輕量級任務:定時刪除、歸檔、統計。
單機數據庫:對高可用和任務監控要求不高的項目。
臨時需求:快速上線一個定時任務時。
通過本文相信小伙伴們已掌握MySQL
事件的核心用法及其適用場景。對于簡單的數據庫維護任務,原生事件是高效的選擇;而涉及業務邏輯的復雜調度,Quartz等專業框架仍是首選。根據實際場景合理選擇技術方案,才能最大化系統效能。
如果你在實踐過程中有任何疑問或更好的擴展思路,歡迎在評論區留言,最后希望大家 一鍵三連 給博主一點點鼓勵!
專欄回顧:
【01】阿里巴巴開源異構數據源離線/全量/增量同步工具 - DataX
【02 】MySQL中的六種日志你都懂么?不懂!那就必須看看
【03】MySQL數據庫數據恢復方案應對沒有where誤操作導致的大量數據更新或刪除
【04】你還在手寫數據庫文檔?推薦一款數據庫文檔生成工具screw
【05】分詞搜索必須上Elasticsearch?試試MySQL分詞查詢,輕松滿足大多數搜索場景的需求