Navicat 命令行无自动重试机制,需外层脚本实现;必须依据 stderr 关键词(如“Lost connection”)而非 exit code 判断失败,配合 sleep 2s、最多 3 次重试,并确保路径正确、权限充足。

Navicat 本身没有“网络恢复后自动重试失败任务”的内置机制。所谓“自动重试”,必须由你控制的外层脚本实现,且重试触发条件不能依赖网络状态轮询(不可靠),而应基于任务执行时的明确失败信号。
navicat --run-sql 命令失败时 exit code 不可信
Windows 的 navicat.exe --run-sql 和 macOS/Linux 的 navicat_premium --run-sql 在 SQL 执行出错(如锁超时、连接中断、主键冲突)时,仍可能返回 0。官方未定义任何重试参数,也未保证错误传播到进程退出码。
- 实测 macOS 上多个版本始终返回
0,哪怕 stderr 输出Lost connection to MySQL server - 仅靠
if [ $? -ne 0 ]判断必然漏判,导致“假成功” - 真正可用的失败依据是 stderr 中的关键词,不是 exit code
重试逻辑必须捕获 stderr 中的典型错误关键词
网络临时中断或服务端主动断链后,Navicat 命令行输出里会暴露真实失败原因。你需要用 grep -qE 检查这些字符串:
-
Lost connection to MySQL server:TCP 连接已断,但进程未退出 -
Lock wait timeout exceeded:事务被阻塞超时,常见于长同步任务 -
Deadlock found:死锁被服务端强制回滚 -
MySQL server has gone away:服务端 kill 掉空闲会话后的典型报错
注意:不要匹配泛化词如 Error 或 Failed——Navicat 日志中存在大量非致命提示,会导致误重试。
重试脚本必须带 sleep 且限制次数
连续重试不加延迟会加剧服务端压力,尤其在云数据库场景下可能触发限流或连接拒绝。推荐策略是:
- 最多重试
3次:超过说明不是临时问题,而是配置或数据逻辑缺陷 - 每次重试前
sleep 2:避免雪崩,也给服务端缓冲时间 - 完整路径必须转义或引号包裹:macOS 上
/Applications/Navicat Premium.app/Contents/MacOS/navicat_premium含空格,不处理会报command not found - 脚本运行用户需有钥匙串访问权限:某些 Navicat 版本在读取保存的密码时会弹窗卡住,需提前授权
“自动重连”设置对命令行任务完全无效
GUI 中勾选的 Auto Reconnect 和 Keep-alive interval 只影响交互式查询,对 --run-sql 这类一次性命令无任何作用。
- 它不会让已失败的 SQL 语句重跑,也不会跳过已成功执行的部分
- 它不改变进程生命周期,也不影响 stderr 输出内容
- 它甚至无法感知命令行任务是否正在执行——两者属于不同执行上下文
真正起作用的是你在终端里跑的那个 shell/batch 脚本,不是 Navicat GUI 里的勾选项。最容易忽略的一点是:脚本里调用的 navicat_premium 路径错了,或者没给执行权限,重试逻辑再完善也启动不了。











