mysql事件在navicat中仅显示定义而非实时执行sql,真正执行由服务端event_scheduler线程完成;需通过show processlist查event_scheduler线程状态,并结合information_schema.events和日志表或general_log追踪实际sql。
navicat里看不到正在执行的sql,得查mysql服务端
navicat本身不提供“实时监控定时任务执行中sql”的界面。你看到的「自动运行」或「事件」列表只是任务定义,不是运行时快照。真正执行的是mysql的event_scheduler,它在服务端后台跑,navicat只负责创建和触发。
用SHOW PROCESSLIST看当前正在跑的事件线程
事件执行时会生成一个用户为event_scheduler的连接线程,但默认不会显示具体SQL。你需要结合information_schema.PROCESSLIST和information_schema.EVENTS交叉验证:
- 先确认事件是否在运行:
SELECT * FROM information_schema.EVENTS WHERE STATUS = 'ENABLED'; - 再查活跃线程:
SHOW PROCESSLIST;—— 找到User列为event_scheduler的行,注意它的Time值是否在增长、State是否为Executing或Sleep - 如果状态是
Executing,说明当前正卡在某条SQL上(比如INSERT慢、锁表),但Info列通常为空或只显示CALL your_procedure(),不会展开内部语句
想看到完整SQL?必须改存储过程加日志
MySQL事件调度器不记录执行中的SQL文本,除非你主动把SQL写进日志表。常见做法是在存储过程中插入调试信息:
- 建一张日志表:
CREATE TABLE event_log (id INT AUTO_INCREMENT PRIMARY KEY, event_name VARCHAR(64), sql_text TEXT, exec_time DATETIME DEFAULT NOW()); - 在你的存储过程开头加:
INSERT INTO event_log(event_name, sql_text) VALUES('your_event_name', 'STARTED at ' + NOW()); - 关键SQL前后各插一条日志,比如
INSERT INTO event_log(sql_text) VALUES('BEFORE INSERT INTO t_user'); - 这样每次事件运行,你查
SELECT * FROM event_log ORDER BY exec_time DESC LIMIT 10;就能看到实际执行路径
为什么SHOW EVENTS不显示SQL内容
SHOW EVENTS只返回事件元数据:名称、状态、调度时间、定义者、是否启用等,不包含DO子句里的SQL原文。即使你用CREATE EVENT ... DO INSERT INTO ...直写SQL,MySQL也只存编译后的内部表示,不保留原始字符串。这是设计使然,不是Navicat的限制,也不是权限问题。
真正要追溯某次执行的具体行为,唯一可靠方式是:提前在存储过程中埋点日志,或开启MySQL通用查询日志(general_log = ON),但后者会产生大量IO,生产环境慎用。











