如何配置MySQL每日00:01-02:00按1分钟间隔执行事件?
解决MySQL事件调度器每日定时区间执行的问题
要实现每日00:01到02:00每分钟执行一次的事件,你原有的写法存在逻辑问题:STARTS 12:01AM和ENDS 02:00AM会被MySQL解析为当前日期的对应时间,事件仅会在当天的该时间段执行一次,无法每日重复触发。
以下是两种可行的解决方案:
方案1:每分钟触发,仅在目标区间执行逻辑
这是最简洁的实现方式,设置事件每分钟执行,但仅在指定时间段内运行业务代码:
CREATE EVENT new_schedule ON SCHEDULE EVERY 1 MINUTE STARTS TIMESTAMP(CURRENT_DATE, '00:01:00') -- 从当日00:01开始触发 ENDS CURRENT_TIMESTAMP + INTERVAL 1 YEAR -- 设置事件结束时间(可按需调整,比如1年后) ON COMPLETION PRESERVE -- 事件执行完成后保留,不自动删除 DO BEGIN -- 仅在00:01-02:00区间内执行业务逻辑 IF TIME(NOW()) BETWEEN '00:01:00' AND '02:00:00' THEN -- 这里写入你的业务代码,比如: -- INSERT INTO your_table (log_time) VALUES (NOW()); END IF; END;
方案2:每日触发,生成当日区间内的定时任务
如果需要严格控制事件仅在每日00:01-02:00启动,可以创建一个每日00:00触发的事件,动态生成当日的分钟级任务(适合更复杂的调度场景):
-- 先创建每日初始化事件 CREATE EVENT daily_schedule_init ON SCHEDULE EVERY 1 DAY STARTS TIMESTAMP(CURRENT_DATE, '00:00:00') ON COMPLETION PRESERVE DO BEGIN -- 删除前一日的分钟级事件(如果存在) DROP EVENT IF EXISTS daily_minute_schedule; -- 创建当日00:01到02:00的分钟级事件 CREATE EVENT daily_minute_schedule ON SCHEDULE EVERY 1 MINUTE STARTS TIMESTAMP(CURRENT_DATE, '00:01:00') ENDS TIMESTAMP(CURRENT_DATE, '02:00:00') ON COMPLETION NOT PRESERVE -- 当日结束后自动删除 DO BEGIN -- 这里写入你的业务代码 -- INSERT INTO your_table (log_time) VALUES (NOW()); END; END;
关键注意事项
开启事件调度器:确保MySQL的事件调度器处于开启状态,执行以下命令:
SET GLOBAL event_scheduler = ON;可通过
SHOW VARIABLES LIKE 'event_scheduler';查看当前状态。权限要求:创建事件需要
EVENT权限,确保你的数据库账号拥有该权限。
内容的提问来源于stack exchange,提问作者s.k.paul
相关产品推荐
相关产品推荐

