Navicat计划任务不支持“每月最后一天”直接触发,因其依赖系统定时器且无日历逻辑解析能力;须改用Windows任务计划程序(设“每月最后一天”触发)或macOS/Linux脚本判断日期后调用navicat CLI执行。
Navicat 的计划任务不支持“每月最后一天”直接触发
navicat 自带的「计划任务」功能底层依赖的是操作系统的定时机制(windows 用任务计划程序,macos/linux 用 cron),它本身没有日历逻辑解析能力,每月最后一天 这种动态日期无法通过 navicat 界面里的「按月执行」选项实现——你选的“每月 31 日”,在 2 月、4 月等就根本不会运行。
真正可行的做法是:绕过 Navicat 的图形化调度,改用系统级定时器调用 Navicat CLI 工具执行连接和查询。Navicat 提供了 navicat.exe(Windows)或 navicat(macOS)命令行接口,可静默运行指定的连接和查询文件。
- Windows 下需启用「任务计划程序」,触发条件设为「每月最后一天」(任务计划程序高级属性里有该选项)
- macOS 需用
launchd+ 脚本判断日期,因为原生 cron 不支持L或W这类月末语法 - Linux 同样不能靠 cron 直接写
59 23 L * *(无效),得用 shell 脚本配合date -d "tomorrow +1 month -1 day" +%d判断今天是否为当月最后一天
Windows 任务计划程序中设置“每月最后一天”触发
这是最直观的方案。Navicat 安装后,其 CLI 可执行文件通常位于:
C:\Program Files\PremiumSoft\Navicat Premium 16\navicat.exe
你需要提前在 Navicat 中保存一个「查询文件」(.sql)和一个「连接文件」(.ncx),然后用命令行调用:
navicat.exe --run-query "C:\path\to\my_conn.ncx" "C:\path\to\monthly_cleanup.sql"
在任务计划程序中新建基本任务时:
- 触发器选「每月」→「在以下日期」→ 勾选「每月最后一天」
- 操作选「启动程序」,程序路径填
navicat.exe绝对路径,参数栏填上面那条--run-query命令 - 务必勾选「只在下列条件下运行」→「只有在以下网络连接可用时」→ 选你的实际连接名(避免离线时失败)
- 「常规」页勾选「不管用户是否登录都要运行」并「不存储密码」——否则任务可能因会话切换失效
macOS 上用 launchd 实现等效调度
macOS 的 launchd 不支持月末语法,必须靠脚本判断。先写一个检测脚本 /usr/local/bin/run-if-last-day.sh:
#!/bin/zsh today=$(date +%d) next_month=$(date -v+1M +%Y-%m-01) last_day_of_month=$(date -j -f "%Y-%m-%d" "$next_month" -v-1d +%d 2>/dev/null || echo "31") if [[ "$today" == "$last_day_of_month" ]]; then /Applications/Navicat\ Premium.app/Contents/MacOS/navicat --run-query "/Users/me/conn.ncx" "/Users/me/monthly.sql" fi
再配一个 plist 文件(如 ~/Library/LaunchAgents/com.navicat.monthly.plist),每晚 23:59 检查一次:
<key>StartCalendarInterval</key> <dict> <key>Hour</key> <integer>23</integer> <key>Minute</key> <integer>59</integer> </dict>
注意:launchd 默认以当前用户权限运行,但 GUI 应用(如 Navicat)可能因 Aqua session 限制无法弹窗或访问钥匙串——若报错 Could not connect to server,大概率是凭据没加载,需在脚本开头加 export GUI_SESSION=1 并确保 Navicat 已首次手动登录过该连接。
为什么别用 cron + “31 日”硬编码
有人图省事,在 crontab 里写 0 0 31 * * ...,这会导致:
- 2 月、4 月、6 月、9 月、11 月完全不执行(这些月份没有 31 日)
- 部分 cron 实现(如某些嵌入式 BusyBox)会在 31 日不存在时顺延到下月 1 日,造成逻辑偏移
- 闰年 2 月 29 日会被跳过,而 28 日不是最后一天,导致整月漏执行
真正的月末判定必须基于日历计算,不是固定数字。哪怕只是简单用 date +%d -d tomorrow 看明天是不是 01 日,也比硬写 31 可靠得多。
Navicat CLI 的静默执行容易忽略错误反馈——建议在调用命令后加 && echo "OK" >> /tmp/navicat.log,并检查退出码;另外,连接文件(.ncx)里的密码是加密存储的,但 CLI 执行时仍依赖当前用户的钥匙串或登录密钥环,换用户或重装系统后需重新授权。


















