Navicat 15 通过 SSH 隧道连接数据库时,常规页主机必须填 127.0.0.1(强制走 TCP),不可填 localhost(会触发 Unix socket 导致隧道失效);SSH 测试成功仅表示能登录服务器,并不保证数据库服务可达、端口监听或权限正确;私钥路径须为绝对路径且权限为 600,macOS 版不支持 .ppk 格式;导入失败多因 MySQL 用户 host 字段未授权 'user'@'127.0.0.1'。

Navicat 15 本身不支持“通过SSH隧道导入远程数据”这种操作——它只负责建立隧道并连接数据库,数据导入动作仍由 MySQL 客户端协议或 Navicat 内置的导入功能完成,且必须走已建立的隧道通道。真正容易出错的是连接配置环节,一旦填错,后续所有导入都会失败。
SSH 隧道测试成功 ≠ 数据库能连上
很多人点“测试连接”弹出“连接成功”,就以为万事大吉,结果一导入数据就报 Can't connect to local MySQL server through socket '/tmp/mysql.sock' 或 Connection refused。这是因为:
- “测试连接”只验证了 SSH 层是否通(即能否登录服务器),并不校验数据库服务是否可达、端口是否监听、权限是否正确
- Navicat 在导入时会重新发起一次完整的数据库连接,此时若
常规页的主机填了localhost(而非127.0.0.1),就会绕过 TCP 走 Unix socket,导致隧道失效 - MySQL 用户的
host字段不匹配:比如你用root@'127.0.0.1'登录,但数据库里只存在root@'localhost',权限校验直接拒绝
常规页主机必须填 127.0.0.1,不能填 localhost
这是最常被忽略的技术细节。原因很实在:
-
localhost在 MySQL 协议中是特殊关键字,强制触发 Unix domain socket 连接(路径如/tmp/mysql.sock),完全不走 TCP,SSH 隧道捕获不到流量 -
127.0.0.1是标准 IPv4 地址,强制走 TCP 协议栈,才能被本地端口转发机制捕获,并经由 SSH 隧道发往远端 - 即使你的 MySQL 实际运行在另一台内网机器(如
10.10.5.20:3306),只要跳板机上配好了ssh -L 3306:10.10.5.20:3306,Navicat 常规页仍填127.0.0.1:3306
私钥路径和权限在 macOS / Linux 上极易失败
Mac 版 Navicat 对私钥文件极其挑剔,常见报错 Key is invalid or corrupted 或 Permission denied (publickey),基本都源于以下几点:
- 路径含
~符号(如~/id_rsa)→ Navicat 解析失败,必须用绝对路径,例如/Users/you/.ssh/id_rsa - 路径含空格或中文(如
/Users/张三/.ssh/key或/Users/you/My Keys/id_rsa)→ 直接加载失败 - 文件权限不是
600→ OpenSSH 底层拒绝读取,执行chmod 600 /path/to/id_rsa再试 - 私钥格式非 OpenSSH 原生(如 PuTTY 的
.ppk)→ Windows 版 Navicat 支持,macOS 版仅认id_rsa类型,需用ssh-keygen -p -f key.ppk转换(实际不可行),更稳妥是重生成 OpenSSH 密钥
导入数据前务必确认 MySQL 用户 host 权限
导入失败时,90% 的人第一反应是查网络或密码,但真实瓶颈往往卡在权限上。执行以下检查:
- 登录跳板机,用
mysql -u root -p -h 127.0.0.1手动连一下,看能否进;如果提示Access denied for user 'xxx'@'127.0.0.1',说明用户没授权该 host - 进入 MySQL 后运行:
SELECT User, Host FROM mysql.user WHERE User = 'your_db_user';,确认返回结果中包含'your_db_user'@'127.0.0.1' - 如果没有,执行:
CREATE USER 'your_db_user'@'127.0.0.1' IDENTIFIED BY 'password'; GRANT ALL ON your_db.* TO 'your_db_user'@'127.0.0.1'; FLUSH PRIVILEGES; - 注意:不要删
'localhost'用户,那是给本地 socket 连接用的,和隧道无关
真正麻烦的从来不是“怎么点按钮”,而是127.0.0.1 和 localhost 的语义差异、私钥路径里的隐藏空格、以及 MySQL 用户表里那一行不起眼的 Host 字段——这些地方一错,导入界面只会安静地卡住或报一个毫无指向性的错误。


















