Navicat任务失败邮件告警需绕过其内置机制,用PowerShell脚本捕获退出码与日志关键词(如Error、ORA-等),结合SQL断言检查(如ROW_COUNT()=0或RAISE EXCEPTION),并通过Windows任务计划以用户账号运行实现可靠告警。
Navicat 任务计划失败时怎么触发邮件告警
navicat 自带的「自动运行」任务(如定时备份、sql 文件执行)本身不支持失败自动发邮件。它只会在任务出错时记录日志,界面弹个提示——而生产库没人盯着界面看,这等于没告警。
真正可行的路径是:绕过 Navicat 的“任务失败回调”幻觉,用它的「外部工具调用」能力,把关键步骤交给系统级脚本控制。
- Navicat 任务本身必须设置为「运行后关闭」+「记录日志到文件」,否则无法获取执行结果
- 日志路径要固定,比如
C:\navi_logs\backup_{date}.log,方便后续脚本读取 - 不能依赖 Navicat 内置的「发送邮件」选项——那个只在成功时发,且不校验 SQL 执行是否真成功(比如 INSERT IGNORE 出错但返回码是 0)
用 PowerShell 脚本捕获 Navicat 任务退出码和日志关键词
Navicat 启动命令行任务(navicat.exe /run "TaskName")结束后会返回标准退出码:0 表示 Navicat 自身没崩,不代表 SQL 成功;真正的失败线索藏在日志里。
下面这个脚本才是生产可用的判断逻辑:
Start-Process -FilePath "C:\Program Files\PremiumSoft\Navicat Premium 16\navicat.exe" -ArgumentList '/run "MyProdBackup"', '/log "C:\navi_logs\last_run.log"' -Wait
$log = Get-Content "C:\navi_logs\last_run.log" -Tail 20
if ($log -match "Error|failed|ORA-|SQLSTATE|1064") {
Send-MailMessage -SmtpServer "smtp.company.com" -From "dba@company.com" -To "alert@company.com" -Subject "Navicat 任务 MyProdBackup 执行失败" -Body "见附件日志" -Attachments "C:\navi_logs\last_run.log"
}
- 必须加
-Wait,否则脚本会立刻往下走,根本读不到日志 - 只读最后 20 行,避免全量读大日志拖慢告警响应(Navicat 日志默认不轮转)
- 匹配关键词比依赖退出码靠谱:Navicat 对语法错误、锁表超时、主从延迟跳过等都可能返回
0
MySQL/PostgreSQL 任务中如何让失败真正“暴露”出来
很多 DBA 写的定时 SQL 看似没问题,但 Navicat 执行完显示绿色对勾——其实 UPDATE 影响行数为 0,或存储过程内部 RAISE NOTICE 被忽略,这些 Navicat 都当成功处理。
- 在 SQL 末尾加断言检查:MySQL 用
SELECT CASE WHEN ROW_COUNT() = 0 THEN 'FAIL' ELSE 'OK' END;,然后脚本去日志里抓'FAIL' - PostgreSQL 存储过程里别只用
RAISE NOTICE,改用RAISE EXCEPTION 'critical missing data';—— 这会让 Navicat 任务直接中断并写入错误行 - 避免用
INSERT IGNORE或ON CONFLICT DO NOTHING包裹关键逻辑,它们会吞掉本该告警的异常场景
为什么不能直接用 Navicat 的 Windows 服务模式跑告警
Navicat 安装时勾选「作为 Windows 服务运行」看似高大上,实际是个陷阱:服务账户默认无交互式桌面权限,导致 Send-MailMessage 无法连接 SMTP(证书验证失败)、日志路径访问被拒绝、甚至 Get-Content 读空文件。
- 服务模式下脚本看到的当前用户是
NT AUTHORITY\SYSTEM,不是你的域账号,邮箱凭据和证书都不继承 - 日志路径若含
%USERPROFILE%或桌面相对路径,服务完全找不到——必须用绝对路径且权限开放给Everyone或SYSTEM - 最稳方案:放弃服务模式,用 Windows 任务计划程序(Task Scheduler)以你自己的账号运行脚本,勾选「不管用户是否登录都要运行」+「运行时不显示窗口」
真正的难点从来不在“怎么发邮件”,而在于怎么定义“失败”——Navicat 不告诉你业务逻辑是否达成,只告诉你客户端有没有卡死。这点不厘清,再漂亮的邮件模板也没用。


















