Navicat 不支持脚本执行失败后的自动重试,因其命令行工具不捕获 SQL 错误、退出码不可靠、无重试参数且不自动重连;需用外层 shell/batch 脚本封装并基于可识别错误信号实现重试。
不能直接实现脚本运行失败后的自动重试。navicat 本身不提供 sql 脚本执行失败后自动重试的内置机制,无论通过 gui 导入还是 navicat.exe --run-sql 命令行调用,失败即终止,无重试逻辑。
为什么 navicat.exe 命令行不支持失败重试
Navicat 的命令行工具(如 Windows 下的 navicat.exe --run-sql 或 macOS 下的 navicat_premium)仅负责“触发一次执行”,它不捕获 SQL 执行层面的错误类型(比如锁超时、死锁、连接中断),也不暴露退出码语义——即使 SQL 报错,进程仍常以 0 退出,导致外部脚本无法可靠判断是否真失败。
- 官方文档未定义任何重试相关参数(如
--retry、--max-attempts) - 所有错误都输出到标准错误流(stderr),但格式非结构化,难做精准匹配
- 连接中断类错误(如
Lost connection to MySQL server)在命令行模式下通常不触发重连,也不会重试
可行替代方案:用 shell/batch 封装 + 条件判断
真正能实现“失败后重试”的,是你自己写的外层批处理或 shell 脚本,核心是:先确保 Navicat 命令能返回可识别的失败信号,再基于该信号循环执行。
- Windows batch 示例(需配合 Navicat 16+ 支持 exit code 的版本):
set MAX_RETRY=3 set RETRY=0 :retry navicat.exe --run-sql "C:\script.sql" --connection "MyDB" if %ERRORLEVEL% NEQ 0 ( set /a RETRY+=1 if %RETRY% LEQ %MAX_RETRY% ( timeout /t 2 >nul goto retry ) else ( echo Failed after %MAX_RETRY% attempts. exit /b 1 ) ) - macOS/Linux bash 更可靠:
#!/bin/bash MAX_RETRY=3 for ((i=0; i<max_retry i do if premium.app then exit else echo failed retrying... sleep fi done retries exhausted.></max_retry>
- 关键前提:必须确认你的 Navicat 版本在 SQL 执行失败时真实返回非零
exit code;旧版本(如 15.x)常忽略错误并始终返回 0,此时需改用日志关键词匹配(如 grep “Error”)
比命令行重试更稳的做法:换用 mysql 客户端
如果目标只是“执行 SQL 脚本并失败重试”,绕过 Navicat 命令行反而更可控:
- 用原生
mysql命令(需已安装 MySQL client):mysql -h host -u user -p'pass' db_name ,它在语法错误、连接失败等场景下稳定返回非零码
- 配合
until或while循环天然支持重试逻辑,且可精细控制重试间隔、最大次数、错误过滤 - Navicat 的价值在于可视化建模、数据同步、备份等高级功能,纯 SQL 批量执行不是它的强项
真正容易被忽略的是:Navicat 命令行的 --run-sql 实际会启动一个隐藏 GUI 进程,若系统无图形会话(如远程 SSH 无 X11、CI 环境),它可能直接卡死或静默失败——这种“不可见的依赖”比重试逻辑本身更常导致自动化中断。











