Navicat 17 本身不运行定时任务,所有“定时”行为均依赖 MySQL 服务端 event_scheduler=ON、用户具备 EVENT 权限、Navicat 中事件的执行语句/调度时间/启用状态三者齐全且正确配置;缺一即静默失效。

Navicat 17 本身不运行定时任务,所有“定时”行为都依赖外部条件是否就绪;没配好前置条件,任务连启动都不会——不是报错,而是静默跳过。
MySQL 服务端 event_scheduler 必须为 ON
Navicat 创建的「事件」(EVENT)是纯服务端对象,执行完全由 MySQL 的 event_scheduler 线程控制。Navicat 只负责生成 SQL 并提交,不参与调度逻辑。
- 执行
SELECT @@event_scheduler;,返回值必须是ON(不是1或YES);若为OFF或DISABLED,事件创建成功但永不触发 - 临时开启用
SET GLOBAL event_scheduler = ON;,但重启失效;永久生效需在my.cnf(Linux)或my.ini(Windows)中添加event_scheduler = ON并重启 MySQL 服务 - 普通账号无权执行
SET GLOBAL,需 DBA 授权或直接改配置文件
数据库用户必须拥有 EVENT 权限
即使连接能通、表能查,缺权限也会在创建事件时直接报错:ERROR 1227 (42000): Access denied; you need (at least one of) the EVENT privilege(s)。
- 授权命令为:
GRANT EVENT ON *.* TO 'your_user'@'host'; FLUSH PRIVILEGES; - 注意:不能只授库级权限(如
EVENT ON mydb.*),MySQL 要求全局范围(*.*)才允许创建跨库事件 - Navicat 连接所用账号必须是该授权账号,切换连接或使用连接池时容易忽略这点
Navicat 中事件定义的三个硬性字段不可为空
图形界面里看似可选的字段,实际对应 CREATE EVENT 的强制语法约束。漏填任一,事件虽能保存,但状态为 SLAVESIDE_DISABLED 或 DISABLED,查 information_schema.EVENTS 就能发现。
-
Event body(执行语句):不能为空,且不能含交互式语句(如SELECT ... INTO OUTFILE在多数托管环境被禁) -
Schedule(调度时间):「开始时间」和「重复间隔」必须同时填写;若只想执行一次,也得填「开始时间」+「重复间隔为 NEVER」,不能只填一个 -
Enable(启用状态):必须勾选,否则生成的是DISABLE事件,保存后 STATUS 永远不是ENABLED
客户端环境不影响事件执行,但影响你能否看到结果
事件在 MySQL 服务端后台运行,和 Navicat 是否打开、是否登录、是否联网完全无关。但以下两点会直接影响你对任务是否成功的判断:
- 如果事件里调用存储过程,而该过程包含
INSERT INTO ... SELECT且目标表有唯一键冲突,事件会失败并停止,但 Navicat 不弹窗提示——得查SHOW EVENTS;的LAST_EXECUTED和STATUS字段 - 事件日志默认不记录错误细节,需开启 MySQL 的 general_log 或 error_log,并确认日志级别足够捕获
EVENT执行上下文
真正关键的前置条件只有三个:MySQL 服务端开了调度器、账号有 EVENT 权限、Navicat 里把那三个字段填全并启用。其余所谓“Navicat 定时设置”,全是误导——它连进程都不常驻,哪来的本地调度能力。











