MySQL 5.1 引入的 Event Scheduler (事件調度器) 是資料庫原生的定時任務引擎,精度達**秒級**,可替代 OS 層面的 cron (最小分鐘級),在「資料庫內部周期性維護、Replication 監控自愈、統計資料更新」等場景極具優勢。
Command=Daemon, User=event_scheduler),負責時間觸發與調度。event_scheduler 系統變數 (ON/OFF/DISABLED)。-- 動態啟用 (重啟失效)
SET GLOBAL event_scheduler = ON;
-- 永久生效 (my.cnf)
[mysqld]
event_scheduler = ON
-- 檢視調度器線程
SHOW PROCESSLIST;
-- Id: 46147, User: event_scheduler, Command: Daemon, State: Waiting on empty queue
CREATE EVENT [IF NOT EXISTS] event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
[COMMENT 'comment']
DO sql_statement;
-- schedule 範例
AT '2024-12-31 23:59:59' -- 單次
EVERY 1 SECOND -- 每秒
EVERY 5 MINUTE -- 每 5 分鐘
EVERY 1 DAY STARTS '2024-01-01 00:00:00' -- 每天固定時間
EVERY 1 WEEK ENDS '2025-12-31' -- 截止日期
-- 管理
ALTER EVENT event_name DISABLE/ENABLE;
DROP EVENT [IF EXISTS] event_name;
SHOW EVENTS [FROM db_name] [LIKE 'pattern'];
DELIMITER //
CREATE PROCEDURE `sp_slave_monitor`()
BEGIN
DECLARE v_slave_running VARCHAR(3);
SELECT VARIABLE_VALUE INTO v_slave_running
FROM performance_schema.global_status
WHERE VARIABLE_NAME = 'SLAVE_RUNNING'; -- 5.7+ 用 performance_schema
IF v_slave_running != 'ON' THEN
-- 發現 Slave 停止,嘗試跳過 0 個錯誤並重啟
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 0;
START SLAVE;
-- 可擴充:寫入告警表、發送郵件/企業微信
INSERT INTO monitor.alert_log (event, msg, created_at)
VALUES ('SLAVE_AUTO_RESTART', CONCAT('Slave restarted at ', NOW()), NOW());
END IF;
END//
DELIMITER ;
CREATE EVENT `ev_slave_monitor`
ON SCHEDULE EVERY 5 SECOND
ON COMPLETION PRESERVE
ENABLE
DO CALL sp_slave_monitor();
ALTER EVENT ev_slave_monitor DISABLE;
ALTER EVENT ev_slave_monitor ENABLE;
CREATE EVENT `ev_partition_maintenance`
ON SCHEDULE EVERY 1 DAY
STARTS '2024-01-01 02:00:00'
ON COMPLETION PRESERVE
DO
BEGIN
-- 動態建立下個月分區 (範例: RANGE BY MONTH)
SET @next_month = DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 1 MONTH), '%Y%m');
SET @sql = CONCAT('ALTER TABLE logs ADD PARTITION (PARTITION p', @next_month,
' VALUES LESS THAN (', UNIX_TIMESTAMP(DATE_ADD(DATE_FORMAT(NOW(), '%Y-%m-01'), INTERVAL 2 MONTH)), '))');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- 歸檔 12 個月前分區 (EXCHANGE PARTITION 到歷史表)
SET @old_month = DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 12 MONTH), '%Y%m');
SET @sql2 = CONCAT('ALTER TABLE logs EXCHANGE PARTITION p', @old_month, ' WITH TABLE logs_archive');
PREPARE stmt2 FROM @sql2; EXECUTE stmt2; DEALLOCATE PREPARE stmt2;
END;
EVENT 權限 (GRANT EVENT ON db.* TO user;)。DEFINER / SQL SECURITY)。ALTER EVENT ... DEFINER=new_user@host 修正。| 限制 | 說明 | 替代方案 |
|---|---|---|
無法在事件中直接執行 SHOW SLAVE STATUS | 預備語句不支援 | 查 performance_schema.replication_connection_status / replication_applier_status |
| 秒級調度精度受長查詢阻塞影響 | 單線程串行執行 | 任務邏輯極簡、耗時 < 100ms;複雜任務改用外部調度 (Airflow/xxl-job) |
| 不支援分散式協調 | 單實例內部 | 多實例需外部分散式調度器 |
| DDL (ALTER TABLE) 可能導致事件執行失敗 | 元資料鎖衝突 | 避開 DDL 維護窗口、使用 gh-ost/pt-osc |
-- 查看事件執行狀態
SELECT * FROM information_schema.EVENTS WHERE EVENT_SCHEMA='mydb'\G
-- LAST_EXECUTED, LAST_FAILED, STATUS (ENABLED/DISABLED/SLAVESIDE_DISABLED)
-- 查看事件執行錯誤日誌 (需啟用 log_error_verbosity=3)
SHOW ERRORS;
-- 或查詢 mysql.general_log (若啟用)
Event Scheduler 是「資料庫原生、秒級精度、無外部依賴」的輕量級調度器,極適合 **Slave 自愈、分區維護、統計快照、緩存預熱、臨時表清理** 等資料庫內部週期性任務。複雜業務流程、跨系統編排、高可用調度仍建議使用專業調度平台 (Airflow, DolphinScheduler, xxl-job)。