You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 19:00:53