Navicat 本身不支持失败自动发邮件,需通过命令行调用(--run参数)+外部脚本监听退出码实现;Windows用PowerShell,Linux/macOS用bash+mail;任务计划中须注意运行身份、起始路径和最高权限。
Navicat 本身不支持失败自动发邮件
navicat 的「计划任务」只能执行 sql 或备份,触发失败时最多写日志或弹窗(windows 下),没有内置 smtp 发信能力。所谓“零代码”不是指 navicat 自带功能能搞定,而是绕过它,用系统级调度+轻量脚本兜底。
真正可行的路径是:把 Navicat 任务转为命令行可调用(靠 navicat.exe 的 --run 参数),再用外部工具监听执行结果并决定是否发邮件。
- 必须开启 Navicat 的「命令行运行」支持(设置 → 常规 → 勾选「允许通过命令行运行」)
- Windows 上推荐用 PowerShell 调用,Linux/macOS 用 bash +
mail或sendmail - Navicat 16+ 才支持
--run参数;旧版本只能靠模拟点击(不稳定,不推荐)
用 PowerShell 封装执行 + 检查退出码
Navicat 命令行执行成功返回 0,失败一般返回非零值(常见 1 或 -1),这是唯一可靠判断依据。不能依赖日志文件是否存在、或截图有没有弹窗。
示例片段(保存为 run_task.ps1):
Start-Process -FilePath "C:\Program Files\PremiumSoft\Navicat Premium 16\navicat.exe" `
-ArgumentList "--run", "MyBackupTask" `
-Wait -PassThru | ForEach-Object { if ($_.ExitCode -ne 0) { Send-MailMessage -SmtpServer "smtp.company.com" -From "db@company.com" -To "ops@company.com" -Subject "Navicat Task Failed: MyBackupTask" -Body "Exit code: $($_.ExitCode)" } }
-
Start-Process ... -Wait是关键,否则脚本会立即往下走,拿不到真实退出码 - 避免用
Invoke-Expression或拼接字符串调用,容易因空格、中文路径崩 - SMTP 认证需额外加
-Credential参数,明文密码不安全,建议用Get-Credential首次缓存或改用应用专用密码
Windows 任务计划程序里别漏掉三个坑
即使脚本本地双击能跑通,扔进「任务计划程序」后大概率静默失败——不是逻辑问题,是权限和上下文错位。
- 「运行身份」必须选「不管用户是否登录都要运行」+「只在本地运行」,否则 GUI 程序(如 navicat.exe)无法加载界面组件,直接卡死
- 「起始于」字段必须填对,比如
C:\Program Files\PremiumSoft\Navicat Premium 16\,否则navicat.exe找不到配置和连接信息 - 勾选「使用最高权限运行」,尤其当任务涉及导出到受保护目录(如
C:\Program Files\下)时,否则写入失败但无提示
替代方案:用 DBeaver + Python 脚本更可控
如果后续要加重试、钉钉/企微通知、SQL 执行耗时监控,硬塞 Navicat 命令行会越来越难维护。DBeaver 支持 JDBC 直连 + 导出为 CLI 脚本,配合 Python 的 subprocess 和 smtplib,50 行内就能搭出稳定告警链路。
核心优势:
- DBeaver CLI 模式不依赖 GUI,适合服务端长期运行
- Python 可读取 SQL 执行后的标准输出,精准捕获
ERROR:、failed:等关键词,比退出码更细粒度 - 发邮件部分用
smtplib+email标准库,无需额外安装 MTA(如 sendmail),Windows/Linux 通用
复杂点不在 Navicat 本身,而在你愿不愿意接受「它只是个客户端」这个事实——告警不是它的事,是调度层该兜的底。

















