Navicat 15 不支持动态频率调度,其计划任务仅支持静态时间配置;动态调整需借助 MySQL EVENT + 外部脚本实时修改执行间隔,并避免使用 GUI 编辑已动态配置的事件。
Navicat 15 本身不支持动态频率调度
navicat 15 的「计划任务」和「自动运行」功能只接受静态时间配置,比如“每天 02:00”或“每 30 分钟”,所有触发逻辑在任务创建时就固化在 .ncx 或 .nsx 文件里。它没有运行时读取业务指标(如表行数、慢查询数、cpu 使用率)并据此修改间隔的能力——这不是 bug,是设计限制。
真正可行的动态调整路径:绕过 Navicat GUI,用 MySQL event + 外部控制层
想让“每小时备份”变成“业务高峰时每 15 分钟,空闲时每 2 小时”,必须把调度决策权交给外部程序,再由它动态改写 MySQL 的 EVENT 定义。Navicat 只能作为初始建模工具,不能参与运行时调控。
- 第一步:在 MySQL 中创建可被修改的事件,例如命名
dynamic_cleanup_event,其DO部分调用存储过程proc_dynamic_cleanup() - 第二步:写一个 Python/Shell 脚本,每 5 分钟查一次
information_schema.TABLES或自定义监控表(如monitor_business_volume),根据阈值决定下次执行间隔 - 第三步:脚本用
ALTER EVENT dynamic_cleanup_event ON SCHEDULE EVERY 900 SECOND动态更新间隔——注意:MySQL 5.7+ 支持直接ALTER EVENT,但 Navicat 15 的事件设计器点“保存”会覆盖这个改动,所以后续不能再用 GUI 编辑该事件 - 第四步:确保
event_scheduler始终为ON,且脚本有权限执行ALTER EVENT(需要EVENT权限)
Navicat 15 里最容易误以为“能动态”的三个坑
很多人试过这些操作,结果发现毫无效果:
- 在「自动运行」里勾选“启用”后,再手动改 Windows 任务计划的触发间隔——没用。
navicat.exe -runjob调用的是固定路径下的.ncx,文件内容不变,频率就不会变 - 用 Navicat 执行
SET GLOBAL event_scheduler = 0再设回1——这只会重启调度器,不会重载事件的EVERY子句 - 在事件定义里写
IF (SELECT COUNT(*) FROM logs WHERE created_at > NOW() - INTERVAL 1 HOUR) > 1000 THEN ... END IF——语法合法,但只是让事件体内部跳过执行,调度器仍按原间隔唤醒进程,浪费资源且无法降频
替代方案建议:高频轻量动作直接走 MySQL event,重操作交由外部调度
如果你的真实需求是“订单表新增超 500 行就立刻归档”,那应该:
- 用 MySQL 的
TRIGGER+INSERT DELAYED(已弃用)或更稳妥的:在应用层插入后发消息到 Redis 队列,由消费者判断是否触发归档 - 把 Navicat 当作一次性 SQL 发送器,别让它扛调度责任;它的 CLI(
navicat.exe -backup)启动慢、无返回码分级、失败静默——不适合嵌入闭环控制流 - 确认你用的不是 Navicat Premium 16+:只有 16+ 提供稳定 CLI 和
--password-from-stdin支持;15 版本在命令行下若 .nsx 含密码,-runjob必然失败,且无错误提示
动态频率的本质是“调度策略外移”,Navicat 15 在这条链路上只配当个 SQL 编辑器和初稿生成器。真要跑起来,得靠你自己搭一层薄薄的控制逻辑,而且必须避开它那些看似友好、实则固化的设计假设。


















