Navicat通过SSH隧道备份失败主因是远端mysqldump未安装或路径错误、MySQL用户缺少localhost权限、认证插件不兼容、备份模式误选快速备份、密码未转义及定时任务环境隔离;需手动验证远端命令、配置远程路径、创建localhost用户、勾选旧版认证、禁用快速备份、启用转义密码,并改用系统级调度替代GUI计划任务。
SSH隧道连通但备份命令执行失败
ssh连接测试成功(比如能连上终端),不代表navicat发起的mysqldump就能跑通——它走的是另一条链路:ssh登录后,再在远端执行mysqldump命令,而这个命令依赖远端mysql客户端、权限、路径和环境变量。
- 先手动模拟:用SSH登录服务器后,直接运行
mysqldump --version;如果报command not found,说明远端没装MySQL客户端或不在$PATH里 - 检查远端
mysqldump路径:常见位置是/usr/bin/mysqldump、/usr/local/mysql/bin/mysqldump,或phpEnv这类环境下的/path/to/phpenv/mysql/bin/mysqldump - Navicat「高级」设置里必须填「远程
mysqldump路径」,不能留空或填本地路径;Windows用户尤其容易误填自己电脑上的mysqldump.exe,这完全无效 - 远端用户(即SSH登录用的系统账号)需对备份目标目录有写权限;若导出到
/tmp失败,换到/home/username/backups/这类用户主目录下试试
备份时提示“Access denied for user”但SSH已通
错误不是出在SSH层,而是mysqldump连接MySQL时认证失败。关键点在于:SSH隧道会让MySQL看到的来源IP是127.0.0.1或::1,所以它查的是user@localhost这条记录,而不是user@'%' 或user@'192.168.x.x'。
- 登录远端MySQL,执行
SELECT user, host FROM mysql.user WHERE user = 'your_db_user';,确认是否存在host = 'localhost'的行 - 如果只有
host = '%',补一条:CREATE USER 'your_db_user'@'localhost' IDENTIFIED BY 'same_password'; GRANT SELECT, LOCK TABLES ON `your_db`.* TO 'your_db_user'@'localhost'; FLUSH PRIVILEGES; - MySQL 8.0+默认用
caching_sha2_password插件,老版本mysqldump不认;临时方案是在Navicat备份设置中勾选「使用旧版身份验证」,长期建议改用户插件:ALTER USER 'your_db_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'same_password';
备份文件为空或只含DDL语句
这不是连接问题,而是Navicat在SSH模式下误用了「快速备份」或参数传递被截断。SSH通道本身不校验SQL内容,但mysqldump命令若被错误拼接,会静默跳过数据。
- 禁用「快速备份」:该模式依赖物理文件拷贝,在SSH环境下几乎不可靠;务必在备份向导中选择「标准备份(SQL)」
- 检查「备份内容」选项:第二步必须选「结构和数据」,且下方「忽略数据」复选框绝对不能勾选
- 密码含特殊字符(如
@、$、&)会导致SSH远程执行时命令解析错乱;启用Navicat备份设置里的「转义密码」选项,或临时换一个纯字母数字密码测试 - 大库备份可能因
max_allowed_packet太小中断,远端MySQL配置里加一句max_allowed_packet = 512M并重启服务
定时任务通过SSH自动备份总失败
GUI里能手动备份成功,不代表定时任务能跑通——任务调度走的是无GUI环境,且不会继承你登录shell的$PATH和SSH agent密钥上下文。
- 不要依赖「计划任务」界面:它本质是GUI触发器,在非交互式环境下大概率卡住;改用系统级调度
- Linux用
crontab -e,写类似:0 2 * * * /usr/bin/ssh -i /home/user/.ssh/id_rsa user@host '/usr/bin/mysqldump -u dbuser -p"pass" your_db > /home/user/backups/$(date +\%Y\%m\%d).sql' - Windows可用
schtasks调Navicat CLI:schtasks /create /TR "navicat.exe --run-job \"SSH Backup\" > C:\logs\navicat.log 2>&1",注意CLI模式仅Premium 16+支持 - 所有路径必须用绝对路径,
~或环境变量(如$HOME)在crontab或schtasks里不生效
SSH备份失败最常卡在「以为连上了就万事大吉」——其实只是打通了第一道门,后面每一步(远端命令、MySQL认证、参数拼接、环境隔离)都得单独验证。别跳过手动SSH后执行mysqldump这一步,它是最快定位真实瓶颈的动作。


















