Na vicat 通过 SSH 隧道连接数据库时,必须手动显式开启相关选项,否则 Na vicat 会默认直接连接数据库端口,进而触发 Connection refused 错误。正确做法是勾选“使用SSH隧道”,并准确填写 SSH 参数;数据库主机建议填写 127.0.0.1,本地密钥路径必须使用绝对路径,导出保存路径也仅支持客户端本地目录。对于自动定时备份任务,还需要额外检查 SSH 连通性,并处理好密钥在无用户会话环境下的认证上下文问题。

Na vicat 通过 SSH 连接远程数据库时,备份任务必须显式启用 SSH 隧道
Na vicat 默认不会自动通过 SSH 转发连接数据库。即便你已经填写了 SSH 参数,如果在连接设置中没有勾选「使用 SSH 隧道」,程序依然会直接访问数据库端口(例如 3306)。而远程数据库端口通常会被防火墙拦截,或仅允许本地监听,因此常见结果就是脚本卡住、连接超时,或者出现 Connection refused 报错。
实操要点:
- 打开 Na vicat 中对应连接的「编辑连接」→「SSH」页签,务必勾选「使用 SSH 隧道」
- SSH 主机、端口、用户名必须填写正确;密钥文件路径要使用绝对路径(如
/Users/you/.ssh/id_rsa),不能写成~ - 数据库主机名建议填写
127.0.0.1或localhost(因为 SSH 隧道会把数据库请求转发到本地端口) - 测试连接成功后再保存——如果只保存不测试,导出的备份脚本仍可能因为 SSH 参数未真正生效而执行失败
导出的 .bat/.sh 脚本无法自动走 SSH,需手动验证隧道是否就绪
Na vicat 导出的脚本(例如 backup_ssh.bat)本质上只是调用 na vicat.exe,并传入 --connection="xxx" 这类参数。它不会主动检查 SSH 服务是否可用,也不会在连接异常时自动重试。一旦 SSH 中断,比如服务器重启、网络波动或隧道失效,脚本通常会静默失败,日志中往往只显示 Failed to connect to database,却没有更明确的故障原因。
建议在脚本开头加一层 SSH 可达性校验(以 Linux/macOS 为例):
ssh -o ConnectTimeout=5 -o BatchMode=yes user@ssh-host exit > /dev/null 2>&1 if [ $? -ne 0 ]; then echo "SSH unreachable at $(date)" >> /var/log/na vicat-backup.log exit 1 fi
Windows 环境下可以使用 ping + telnet 做基础连通性判断,但更稳定、更适合自动化检测的方式,是使用 plink(PuTTY 工具集)进行轻量级 SSH 探测。
定时任务执行时 SSH 认证失败,本质是缺少用户会话上下文
你在图形界面里点击“测试连接”可以成功,并不代表计划任务也一定能正常运行。无论是 Windows 任务计划程序,还是 Linux 的 cron,默认都是在无图形会话、无 keychain 环境下执行的。如果 SSH 密钥依赖系统钥匙串(如 macOS Keychain)或 Pageant(Windows PuTTY agent),那么定时备份执行时就很容易出现认证失败。
解决路径只有两条:
- 用密码认证 +
sshpass(Linux/macOS):脚本中改用sshpass -p 'xxx' ssh ...,但需确保sshpass已安装且密码不暴露在进程列表里(加-e从环境变量读) - 用免密密钥 + 绝对路径 + 无密码保护:生成密钥时不设 passphrase,
chmod 600私钥文件,并在脚本中指定-i /full/path/to/id_rsa
注意:Na vicat 本身不会管理 SSH 密钥的生命周期,它只是把你在 GUI 中填写的路径原样写入脚本参数。只要路径错误、文件权限过宽,或者密钥失效、过期,都会直接导致定时备份任务执行失败。
备份路径和时间戳变量在 SSH 场景下仍受限于客户端本地文件系统
很多用户会误以为“通过 SSH 备份数据库”就等于“把备份文件保存到远程服务器”,实际上并不是这样。Na vicat 的所有备份操作,即使通过 SSH 连接数据库,最终生成的 SQL 文件仍然会写入运行 Na vicat 的那台客户端机器本地磁盘。也就是说,导出路径如 C:backups$(DATE).sql 或 /home/user/backups/$(DATE).sql,始终都是本地路径,而不是远程路径。
如果你确实需要把备份保存到远程服务器,必须额外增加一步文件传输操作:
- 先完成本地备份(Na vicat 脚本)
- 再用
scp或rsync把生成的 SQL 文件推送到远程主机,例如:scp "/home/user/backups/mydb_$(date +%Y%m%d_%H%M%S).sql" user@remote:/backup/mysql/ - 最后加
find /home/user/backups -name "mydb_*.sql" -mtime +7 -delete清理本地旧文件
$(DATE) 是 Na vicat 唯一支持的时间变量,格式固定为 YYYYMMDD_HHMMSS,无法自定义修改;如果路径中包含空格或中文字符,往往会直接导致脚本退出,而且既不报错也不写日志——这是实际使用中最容易被忽略的静默故障点之一。
