Navicat 不支持直接对接企业微信或钉钉机器人,必须通过外部脚本中转;其任务调度仅输出日志和退出码,无内置 HTTP 客户端,需用 PowerShell(Windows)或 Bash + curl(Linux/macOS)捕获日志关键词并调用对应 Webhook API 发送告警。
navicat 本身不支持直接对接企业微信或钉钉机器人,必须借助外部脚本中转。直接在 navicat 界面里找不到“添加钉钉 webhook”这类选项,这是常见误解的起点。
为什么不能在 Navicat 里直接配置企微/钉钉告警
Navicat 的「自动运行」和「任务计划」只提供基础调度与本地日志输出能力,不内置 HTTP 客户端或 Webhook 发送模块。所有对外通知(邮件、企微、钉钉)都得靠操作系统层的脚本承接 —— 这是设计限制,不是配置遗漏。
- Navicat 任务执行后仅返回退出码
$?和写入日志文件,不暴露错误详情到标准输出 - 企业微信/钉钉要求 POST JSON 到指定
https://qyapi.weixin.qq.com/...或https://oapi.dingtalk.com/robot/send...,Navicat 无此能力 - 即使你看到某些教程说“Navicat 支持 webhook”,那也是第三方插件或误传,官方文档从未声明该功能
用 PowerShell 脚本捕获失败并调用企业微信 API(Windows 生产环境)
适用于 Windows Server 上运行的 Navicat Premium 16+,需提前获取企业微信应用的 corpid、corpsecret、agentid 和接收人 user(注意:是账号 ID,不是姓名)。
公众号运营:文章发布至草稿、样式封面、评论与用户管理、数据统计等。用户要求将 Markdown 发送到公众号草稿、查看阅读量统计或类似后台操作时,使用本技能。
- 必须加
-Wait参数启动 Navicat,否则脚本会立即读空日志 - 只读日志末尾 20 行(
-Tail 20),避免大日志阻塞告警响应 - 匹配关键词比依赖
$?更可靠:Navicat对锁表超时、主从延迟跳过等常返回0,但日志里必含Error、failed、ORA-、SQLSTATE或1064 - 调用
Invoke-RestMethod发送 JSON 到企业微信接口,注意设置-ContentType "application/json"
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") {
$token = (Invoke-RestMethod -Uri "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ww445b42e470ffd0c7&corpsecret=vDj1oEsUuuIYt6eGUn10hu8f6Od17Hvpa9E-KWwV0-Q" -Method Get).access_token
$body = @{
touser = "LiQinChang"
msgtype = "text"
agentid = 1000006
text = @{ content = "【Navicat 告警】MyProdBackup 执行失败,请检查 C:\avi_logs\last_run.log" }
} | ConvertTo-Json -Depth 3
Invoke-RestMethod -Uri "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$token" -Method Post -Body $body -ContentType "application/json"
}
用 Bash + curl 实现钉钉机器人告警(macOS/Linux)
前提:已创建钉钉群机器人,获取到 webhook 地址(含 access_token),且服务器能访问公网(或内网钉钉网关)。
- Navicat 启动命令要用
--run(注意是双短横),不是/run - 日志路径必须绝对路径,且 Navicat 有写入权限;建议用
tee同时输出到控制台和文件便于调试 - 钉钉要求
Content-Type: application/json,且必须带timestamp和sign(如启用签名验证),否则 400 错误 - 示例中省略了 sign 计算逻辑,生产环境务必加上 —— 钉钉签名算法是
HMAC-SHA256,密钥需 URL 编码
"$HOME/Applications/Navicat Premium.app/Contents/MacOS/navicat" --run "8a2b3c4d-5e6f-7g8h-9i0j-1k2l3m4n5o6p" 2>&1 | tee /tmp/navicat_backup.log
if grep -qE "(Error|failed|ORA-|SQLSTATE|1064)" /tmp/navicat_backup.log; then
curl 'https://oapi.dingtalk.com/robot/send?access_token=xxx' \
-H 'Content-Type: application/json' \
-d '{
"msgtype": "text",
"text": {
"content": "【Navicat 告警】备份任务异常,请查看 /tmp/navicat_backup.log"
},
"at": {
"atMobiles": [""],
"isAtAll": false
}
}'
fi
关键细节容易被忽略
很多团队卡在最后一步:告警发不出去,不是代码写错,而是权限或网络链路问题。
- Windows 脚本若报
Invoke-RestMethod : The underlying connection was closed,大概率是 TLS 版本不匹配,加一行[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 - 钉钉机器人若返回
{"errcode":310000,"errmsg":"invalid access_token"},检查 URL 中的access_token是否被 URL 编码或复制错误 - 企业微信若提示
{"errcode":40014,"errmsg":"invalid access_token"},说明 token 过期(2 小时),需每次调用前重新获取,不能复用 - Navicat 日志默认不轮转,
C:\avi_logs\last_run.log会越写越大 —— 建议用Get-Date -Format "yyyyMMdd"动态生成日志名,或定期清理


















