MySQL 8.0.35单个事件my_event自6月8日未执行,求排查方向
MySQL 8.0.35定时事件
my_event停止运行的排查方向 环境与事件信息
- MySQL版本:8.0.35
- 事件创建语句:
CREATE EVENT my_event ON SCHEDULE EVERY 1 DAY STARTS '2024-03-01 00:00:00.000' ON COMPLETION NOT PRESERVE ENABLE DO update my_table set my_column=0
问题现象
该事件自2024年6月8日起不再运行,执行以下查询后:
SELECT * FROM INFORMATION_SCHEMA.events
发现LAST_EXECUTED列在2024-06-08 00:00:00后未更新,但其他定时事件运行正常。
已完成的排查项
- 已确认INFORMATION_SCHEMA中该事件的
STATUS列值为enabled - 已确认全局变量
event_scheduler = ON - 已设置
SQL_SAFE_UPDATES = 0(解决无WHERE子句的更新警告) - 已检查MySQL日志,未发现该事件相关记录
需进一步排查的内容
1. 事件时间与调度规则验证
- 检查事件是否被设置了结束时间:
若SELECT EVENT_NAME, ENDS FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME='my_event';ENDS值早于当前日期,事件会自动停止执行。 - 验证服务器时间与时区配置:
系统时间跳变、时区配置错误会导致调度逻辑判断异常。SELECT NOW(), @@system_time_zone, @@time_zone;
2. 事件执行的依赖资源检查
- 确认目标表
my_table是否存在:
排查表是否被重命名、删除或迁移。SHOW TABLES LIKE 'my_table'; - 检查目标列
my_column的状态:
确认列是否存在、数据类型是否与UPDATE语句兼容。DESCRIBE my_table; - 验证事件DEFINER用户的权限:
先查询事件定义者:
再检查该用户的UPDATE权限:SELECT DEFINER FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME='my_event';
替换上述语句中的SHOW GRANTS FOR 'definer_user'@'host_address';definer_user和host_address为实际值。
3. 事件调度器内部状态排查
- 刷新事件调度器(生产环境操作前需评估影响):
之后观察事件是否恢复执行。SET GLOBAL event_scheduler = OFF; SET GLOBAL event_scheduler = ON; - 查看事件下一次执行时间:
若SELECT EVENT_NAME, EXECUTE_AT FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME='my_event';EXECUTE_AT为NULL或远大于当前时间,说明调度逻辑出现异常。
4. 深层日志与锁状态检查
- 检查MySQL错误日志的完整内容(重点关注6月8日之后的日志),排查是否存在低级别错误或执行异常记录。
- 排查InnoDB锁与死锁情况:
查看最近的死锁记录,或通过SHOW ENGINE INNODB STATUS;SHOW PROCESSLIST;检查是否有阻塞my_table的进程。
5. 事件修改历史排查
- 查看二进制日志中6月8日前后对
my_event的操作:
排查是否有ALTER EVENT等操作意外修改了事件状态或规则。mysqlbinlog --start-datetime='2024-06-07 00:00:00' --stop-datetime='2024-06-09 00:00:00' /path/to/binlog/file | grep -i my_event
内容的提问来源于stack exchange,提问作者lkh
相关产品推荐
相关产品推荐

