navicat 不支持通过 ssh 隧道直接执行 mysqldump 或远程还原,其“运行 sql 文件”功能仅逐条发送语句,受限于超时、大文件中断、不支持 source/delimiter、字符集调试难、无进度反馈等问题;真正可靠的远程还原需先建立 ssh 隧道,再在本地终端用 mysql 命令导入,且须确保 mysql 用户权限匹配跳板机 ip(如 'app'@'10.10.5.%'),并配置 ssh 心跳防断连。
navicat 本身不支持在 ssh 隧道内直接执行 mysqldump 或远程还原(如 mysql 命令导入 sql 文件),它只做图形化连接和查询。所谓“通过 ssh 通道执行远程还原”,实际是靠 navicat 在本地建立隧道后,再用命令行或工具把 sql 流打到 127.0.0.1:3306(即走隧道的本地端口)——还原动作不在 navicat 界面里完成,而是在你本地终端发起。
为什么 Navicat 的「运行 SQL 文件」不能替代远程还原
Navicat 的「运行 SQL 文件」功能本质是将文件内容逐条发给 MySQL 服务端执行,它依赖已建立的数据库连接,但不绕过客户端限制:
- 大文件(>50MB)容易因超时或内存不足中断,报错类似
MySQL server has gone away - 不支持
source语句、存储过程定义中的分号冲突、DELIMITER切换等原生命令 - 无法控制字符集转换细节,遇到
Incorrect string value很难调试 - 还原过程中无法实时看到进度或跳过错误(比如
CREATE DATABASE IF NOT EXISTS失败后卡住)
真正能跑通的远程还原流程:先建隧道,再本地调用 mysql 命令
这是最稳、最可控的方式,且完全复用你已配好的 Navicat SSH 隧道参数:
- 确认 Navicat 中该连接已「测试成功」,说明 SSH 登录、端口映射、MySQL 认证三者都通
- 打开终端(Windows 用 PowerShell 或 Git Bash;macOS/Linux 用 Terminal)
- 执行命令还原:
mysql -h 127.0.0.1 -P 3306 -u 'app' -p'xxx' db_name
- 注意:
-P是大写 P,填的是 Navicat 「常规」页里设的端口(默认 3306);-h 127.0.0.1强制走 TCP,不能写localhost - 如果 Navicat 配了非标准端口(比如映射到本地 3307),这里也得同步改
-P 3307
常见失败点:连得上 Navicat,但命令行还原报 Access denied
这不是 Navicat 配错了,而是 MySQL 权限没对齐:
- Navicat 连接用的用户名是
'app',但你授权的是'app'@'localhost'或'app'@'%'—— 这两个都不生效 - SSH 隧道下,MySQL 看到的来源 IP 是跳板机的内网地址(如
10.10.5.100),所以必须显式授权:CREATE USER 'app'@'10.10.5.100' IDENTIFIED BY 'xxx'; - 别漏
GRANT ALL ON db_name.* TO 'app'@'10.10.5.100';和FLUSH PRIVILEGES; - 若跳板机 IP 不固定,授权子网更稳妥:
'app'@'10.10.5.%'
空闲断连导致还原中途失败怎么办
还原耗时长(尤其百 MB 级 SQL),SSH 隧道可能被中间设备静默回收,现象是命令卡住、报 Lost connection to MySQL server:
- 不是 Navicat 设置问题,而是跳板机 SSH 服务或云厂商安全组主动断开空闲连接
- 临时解法:在终端执行还原前,先手动启一个保活隧道:
ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=3 -fN -L 3307:127.0.0.1:3306 user@jump-host
- 其中
-L 3307:127.0.0.1:3306表示把跳板机本地的 3306 映射到你本机 3307;ServerAliveInterval是心跳间隔 - 长期方案:让运维在跳板机
/etc/ssh/sshd_config加TCPKeepAlive yes和ClientAliveInterval 60
真正麻烦的从来不是怎么填 Navicat 表单,而是搞清「谁在连谁」——命令行还原失败,90% 是权限绑错 IP,剩下 10% 是空闲断连。别在 Navicat 界面里死磕「运行 SQL 文件」,它不是设计来干这个的。











