navicat本身不支持ssh密钥认证的自动备份,必须绕过其gui计划功能,改用mysqldump/pg_dump配合ssh端口转发、autossh或openssh及系统级定时工具(如cron或task scheduler)实现免密、可定时、带重连的备份流程。
navicat 本身不支持 ssh 公私钥对认证方式的自动备份流程——它无法在「计划任务」或「批处理作业」中加载私钥、跳过密码交互,也无法调用 ssh-agent 或处理 passphrase 加密的私钥。所谓“基于公私钥对的安全自动备份”,必须绕开 navicat 的 gui 计划功能,改用底层命令 + 系统级调度。
Navicat 导出的脚本默认走密码明文,不走 SSH 密钥
当你在 Navicat 中右键数据库 →「备份数据库」→ 勾选「保存为 Shell 脚本」时,生成的 backup_script.sh 里实际调用的是 mysqldump(MySQL)或 pg_dump(PostgreSQL),而非通过 SSH 连接远程服务器。即使你连接的是一个需要 SSH 隧道的 MySQL 实例(比如 Navicat 里配置了「SSH 通道」),导出的脚本也不会复现该隧道逻辑,而是直接尝试本地 socket 或直连 IP,导致失败。
- 现象:脚本执行报错
Can't connect to MySQL server on '127.0.0.1'或Access denied for user - 原因:Navicat 的「导出为脚本」只提取数据库连接参数(host/port/user/db),完全忽略 SSH 隧道设置
- 真实路径:若需 SSH 隧道,必须手动在脚本中补上
ssh -L端口转发,再让mysqldump连本地端口
用 ssh-keygen + autossh + mysqldump 组合实现真正密钥驱动的备份
这才是能落地的方案:放弃 Navicat 的「自动运行」界面,用系统级工具链构建可定时、免密、带重连的备份流。
- 先在备份机(如 Linux 服务器)上生成无 passphrase 的密钥:
ssh-keygen -t ed25519 -f ~/.ssh/id_backup -N "" - 把公钥部署到目标数据库服务器的
~/.ssh/authorized_keys(确保sshd_config允许公钥登录) - 用
autossh建立稳定隧道(避免断连):autossh -M 0 -N -f -L 3307:127.0.0.1:3306 user@db-server-ip -i ~/.ssh/id_backup - 备份脚本里调用:
mysqldump --host=127.0.0.1 --port=3307 --user=myuser --databases mydb > "/backup/mydb_$(date +\%Y\%m\%d).sql" - 加个简单校验:
if [ $? -eq 0 ]; then gzip "$BACKUP_FILE"; fi
Windows 上用 OpenSSH + Task Scheduler 模拟等效流程
Win10/11 自带 OpenSSH 客户端,但默认不启用服务。别用 PuTTY 或第三方隧道工具——它们无法被任务计划程序静默调用。
- 启用 OpenSSH 客户端:
Get-WindowsCapability -Online | ? Name -like 'OpenSSH.Client*' | Add-WindowsCapability -Online - 生成密钥:
ssh-keygen -t ed25519 -f %USERPROFILE%\.ssh\id_navicat_backup -N "" - 用
scp把公钥传上去:type %USERPROFILE%\.ssh\id_navicat_backup.pub | ssh user@db-server "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" - 写
backup.bat:先ssh -fN -L 3307:127.0.0.1:3306 user@db-server -i %USERPROFILE%\.ssh\id_navicat_backup,再调mysqldump --host=127.0.0.1 --port=3307 ... - 任务计划程序中,“起始于”必须填
%USERPROFILE%\,否则ssh找不到私钥路径
真正的难点不在 Navicat 设置里,而在于密钥权限、SSH 服务端配置(PermitRootLogin、PubkeyAuthentication)、以及隧道生命周期管理——这些 Navicat 根本不碰,也不提示你检查。











