啟用事件調度器
# my.cnf
[mysqld]
event_scheduler=ON
# 運行時動態啟用(重啟失效)
SET GLOBAL event_scheduler=ON;
# 驗證
SHOW VARIABLES LIKE 'event_scheduler'; -- ON
創建事件語法
CREATE
[DEFINER = { user | CURRENT_USER }]
EVENT [IF NOT EXISTS] event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'comment']
DO event_body;
schedule:
AT timestamp [+ INTERVAL interval] ... -- 一次性
| EVERY interval
[STARTS timestamp [+ INTERVAL ...]]
[ENDS timestamp [+ INTERVAL ...]] -- 週期性
interval:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | SECOND
| YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND
| HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
實戰案例全集
1. 一次性任務:5 秒後創建表
CREATE EVENT IF NOT EXISTS ev_create_t
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 SECOND
DO CREATE TABLE t (a INT, b CHAR(10), c TIMESTAMP);
2. 週期性任務:每 5 秒插入一行
CREATE EVENT IF NOT EXISTS ev_ins_t
ON SCHEDULE EVERY 5 SECOND
DO INSERT INTO t VALUES (1, 1, NOW());
3. 定時清理:每 10 秒清空表
CREATE EVENT IF NOT EXISTS ev_trunc_t
ON SCHEDULE EVERY 10 SECOND
DO TRUNCATE TABLE t;
4. 指定時間點執行
CREATE EVENT IF NOT EXISTS ev_at_time
ON SCHEDULE AT TIMESTAMP '2024-12-31 23:59:00'
DO TRUNCATE TABLE t;
5. 每天固定時間執行
CREATE EVENT IF NOT EXISTS ev_daily
ON SCHEDULE EVERY 1 DAY
STARTS '2024-01-01 02:00:00'
DO TRUNCATE TABLE t;
6. 延遲啟動、限時結束:5 天后開始,每天執行,1 個月後停止
CREATE EVENT IF NOT EXISTS ev_window
ON SCHEDULE EVERY 1 DAY
STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY
ENDS CURRENT_TIMESTAMP + INTERVAL 1 MONTH
DO TRUNCATE TABLE t;
事件管理操作
| 操作 | SQL |
| 查看所有事件 | SHOW EVENTS; / SHOW EVENTS FROM db_name; |
| 查看特定事件詳情 | SHOW EVENTS LIKE 'ev_name'\G |
| 查看創建語句 | SHOW CREATE EVENT ev_name\G |
| 禁用事件 | ALTER EVENT ev_name DISABLE; |
| 啟用事件 | ALTER EVENT ev_name ENABLE; |
| 修改排程 | ALTER EVENT ev_name ON SCHEDULE EVERY 10 DAY; |
| 重命名 | ALTER EVENT ev_name RENAME TO new_name; |
| 刪除事件 | DROP EVENT [IF EXISTS] ev_name; |
權限要求
- 創建/修改/刪除:
EVENT 權限。
- 執行體內的 SQL:需
DEFINER 擁有相應權限(默認創建者)。
Event vs Cron 對比
| 維度 | MySQL Event | Linux Cron |
| 管理位置 | 數據庫內部 | 操作系統層面 |
| 備份遷移 | 隨數據庫備份自動遷移 | 需單獨備份 crontab |
| 事務支持 | 原生支持(DO 內可用事務) | 需腳本自行控制 |
| 精度 | 秒級 | 分鐘級(標準 cron) |
| 調試查看 | SHOW EVENTS、INFORMATION_SCHEMA.EVENTS | crontab -l、系統日誌 |
| 適用場景 | 數據庫內部維護(清理、統計、分區管理) | 系統級任務、調用外部程序、跨庫操作 |
避坑指南
- event_scheduler=OFF 時事件不執行:監控告警必須包含此變量。
- DO 語句報錯不會停止事件:但會寫入錯誤日誌,建議 DO 內包裝
BEGIN ... END 並聲明 DECLARE CONTINUE HANDLER。
- 主從複製:
DISABLE ON SLAVE 防止從庫重複執行;GTID 模式下事件創建語句會同步,需注意 DEFINER 主機一致性。
- 時區:事件按
time_zone 系統變量執行,確保 Master/Slave 時區一致。