MySQL每日定时事件异常:仅首日触发次日失效的解决办法
MySQL事件次日不触发的解决办法
问题原因
原事件的ENDS参数使用CURRENT_DATE + INTERVAL 72000 SECOND,会将结束时间固定为事件创建当天的20:00。当当天20:00过后,事件会自动变为DISABLED状态,因此次日无法触发。
修正方案
方案1:添加时间条件判断(推荐)
让事件每5分钟全局触发一次,但仅在每日8:00-20:00时段内执行任务。这样事件不会因到期被禁用,无需每日重新创建。
DROP EVENT IF EXISTS test; CREATE EVENT test ON SCHEDULE EVERY 5 MINUTE STARTS CURRENT_DATE + INTERVAL 8 HOUR -- 首次从当天8点开始触发 ON COMPLETION PRESERVE -- 事件完成后保留,不自动删除 ENABLE DO BEGIN -- 判断当前时间是否在8:00-20:00之间 IF TIME(NOW()) BETWEEN '08:00:00' AND '20:00:00' THEN INSERT INTO temp (name) VALUES (concat('event_name ', SYSDATE())); END IF; END;
方案2:每日自动重建时段事件
创建一个每日8:00触发的控制事件,自动生成当日8:00-20:00每5分钟执行的任务事件,当日20:00后自动清理临时事件。
-- 创建每日调度的控制事件 DROP EVENT IF EXISTS daily_event_controller; CREATE EVENT daily_event_controller ON SCHEDULE EVERY 1 DAY STARTS CURRENT_DATE + INTERVAL 8 HOUR ON COMPLETION PRESERVE ENABLE DO BEGIN -- 删除当日的临时执行事件(如果存在) DROP EVENT IF EXISTS daily_task_event; -- 创建当日8:00-20:00每5分钟执行的事件 CREATE EVENT daily_task_event ON SCHEDULE EVERY 5 MINUTE STARTS CURRENT_DATE + INTERVAL 8 HOUR ENDS CURRENT_DATE + INTERVAL 20 HOUR ON COMPLETION NOT PRESERVE -- 当日结束后自动删除 ENABLE DO INSERT INTO temp (name) VALUES (concat('event_name ', SYSDATE())); END;
验证方法
执行以下命令查看事件状态,确认事件为ENABLED:
SHOW EVENTS LIKE 'test'; -- 对应方案1 -- 或 SHOW EVENTS LIKE 'daily_event_controller'; -- 对应方案2
内容的提问来源于stack exchange,提问作者Akshay Jain
相关产品推荐
相关产品推荐

