navicat自动备份必须通过ssh隧道连接生产库,因定时任务运行于无gui、无ssh agent的干净环境,需显式配置ssh隧道、绝对路径密钥(无密码)、mysql bind-address设为127.0.0.1、导出路径为客户端本地绝对路径(仅支持$(date)变量,禁用空格和中文),并改用系统级调度(schtasks/crontab)调用cli执行,同时务必添加压缩与7天清理逻辑。
navicat自动备份任务必须走ssh隧道,否则根本连不上生产库
很多团队配置完手动连接能通,一建自动任务就报 connection refused 或 access denied——不是密码错了,是 navicat 的自动运行上下文默认不加载 ssh 隧道。gui 里点“测试连接”成功,不代表后台定时任务也能复用同一套连接逻辑。
关键区别在于:手动连接时你登录了系统账户、密钥已载入 agent、SSH 配置在当前会话生效;而自动任务由 Windows Task Scheduler 或 cron 启动,它跑在一个干净、无 GUI、无 SSH agent 的环境中。
- 必须在 Navicat 连接配置的
SSH选项卡中显式勾选“使用SSH隧道”,且所有字段(主机、端口、用户名、认证方式)都填全 - 若用密钥认证,密钥路径必须是绝对路径:
/home/deploy/.ssh/id_rsa,不能写~/.ssh/id_rsa或相对路径 - 密钥文件不能设密码(passphrase),否则 CLI 模式下无法自动解锁,任务直接卡死
- MySQL 的
bind-address必须为127.0.0.1(不是0.0.0.0),因为隧道只打通到本机回环;同时确认用户权限中Host是%或localhost
导出路径必须是客户端本地绝对路径,且不能含空格或中文
Navicat 自动备份里的“导出到 SQL 文件”路径,永远指向运行 Navicat 的那台机器(你的笔记本或跳板机),不是远程服务器。很多人误填 /data/backup/,结果任务静默失败,日志只显示 Failed to export。
- Windows 示例有效路径:
C:\navicat_backups\prod\_$(DATE).sql - macOS/Linux 示例有效路径:
/Users/you/navicat_backups/prod_$(DATE).sql -
$(DATE)是唯一支持的变量,格式固定为YYYYMMDD_HHMMSS,不支持$(TIME)、$(YEAR)等其他写法 - 路径中只要出现空格或中文字符(如
C:\我的备份\),任务就会失败,且无明确报错 - 目标目录需提前创建,并确保运行 Navicat 的用户有写权限(比如别往
C:\Program Files写)
别依赖 Navicat 自带的“计划任务”,改用系统级调度调 CLI
Navicat 的图形化“计划任务”本质是 GUI 组件,一旦你把它注册成 Windows 服务、或用 Local System 账户运行,任务就永远停在“等待触发”状态——它需要桌面会话才能激活 SSH 上下文和 GUI 资源。
- Windows 推荐用
schtasks调用 CLI:schtasks /create /tn "Daily Prod Backup" /tr "navicat.exe --run-job \"Prod MySQL Backup\"" /sc daily /st 02:00 - Linux/macOS 用
crontab -e加一行:0 2 * * * /opt/navicat/navicat --run-job "Prod MySQL Backup" > /var/log/navicat-backup.log 2>&1 - CLI 模式要求 Navicat Premium 或 Navicat for MySQL 16+,旧版本无
--run-job参数 - 必须先在 GUI 中完整配置并保存一次该备份任务(生成
.nbk文件),CLI 才能找到它 - 务必重定向输出(
> /path/to/log 2>&1),否则失败无声无息
备份后不压缩不清理 = 几天就撑爆磁盘
Navicat 原生导出只生成未压缩的纯 SQL 文本,一个 5GB 的库导出后仍是 5GB+,且不会自动删旧文件。线上环境跑一周,C:\navicat_backups\ 就可能占满整个 C 盘。
- Windows 可在
schtasks命令后追加 PowerShell 清理:; powershell -Command "Get-ChildItem C:\navicat_backups\*.sql | Where-Object {$_.LastWriteTime -lt (Get-Date).AddDays(-7)} | Remove-Item" - Linux/macOS 在 crontab 中拼接 find 命令:
&& find /Users/you/navicat_backups/ -name "*.sql" -mtime +7 -delete - 更稳妥的做法是外挂
gzip或7z:导出后立即压缩,再删原文件。例如 Linux 下加一句:&& gzip /Users/you/navicat_backups/prod_$(date +\%Y%m%d_\%H%M%S).sql - 注意:Navicat 不提供导出即压缩选项,这步必须自己补
实际跑通的关键,往往不在 Navicat 界面里点了几下,而在 CLI 调用时是否带着正确的上下文、路径是否真可写、以及压缩清理有没有被当成“次要步骤”漏掉。











