SSH选项卡填的是跳板机系统账号(如root),非MySQL账号;常规页主机必须填127.0.0.1以确保走TCP隧道,因localhost强制走socket绕过隧道;数据库Access denied主因是MySQL用户权限未授权给跳板机内网IP。
Navicat里填SSH用户名时,为什么不能填MySQL账号
因为ssh隧道建立的是系统级连接,不是数据库连接。navicat在ssh选项卡里填的用户名,是跳板机(或目标服务器)的操作系统账户,比如root、deploy或ubuntu;而常规选项卡里的用户名才是mysql的数据库账号。填反了是连不上最常见原因。
如果你用的是云服务器(如阿里云ECS、腾讯云CVM),默认SSH登录用户通常不是root(尤其CentOS 7+/Ubuntu 20.04+),而是centos或ubuntu——得去服务器上执行whoami确认。
- 私钥认证下,
用户名必须和私钥对应账户一致,否则SSH拒绝登录 - 若服务器禁用了密码登录(
PasswordAuthentication no),只留密钥入口,那SSH选项卡里必须选“公钥”,且不能填密码字段 - Windows版Navicat不直接支持OpenSSH原生
id_rsa格式,需用PuTTYgen转成.ppk;macOS/Linux版可直读id_rsa(但路径要绝对,别用~)
为什么常规页主机必须填127.0.0.1,而不是localhost或内网IP
这是SSH隧道能通的关键逻辑点。localhost在MySQL客户端行为中会强制走Unix socket文件,完全绕过TCP协议;而SSH隧道只转发TCP流量。填127.0.0.1才能确保Navicat发起的是TCP连接,流量才会被隧道捕获并转发到远端。
即使MySQL实际装在另一台内网机器(比如10.10.5.20:3306),只要跳板机能访问它,你就在SSH页填跳板机信息,常规页仍填127.0.0.1 + 对应端口(比如跳板机上执行了ssh -L 3307:10.10.5.20:3306 user@jump,那常规页端口就填3307)。
- 填
localhost→ Navicat尝试连/tmp/mysql.sock→ 报错Can't connect to local MySQL server - 填内网IP(如
10.10.5.20) → Navicat直连该IP,不走隧道 → 被防火墙或网络策略拦截 - 填
127.0.0.1+ 正确端口 → 流量进本地端口 → SSH隧道自动转发 → 成功抵达目标MySQL
私钥文件路径和格式踩坑最多的地方
Navicat对私钥文件位置和格式非常敏感,尤其跨平台时。Windows下必须用.ppk,macOS/Linux虽支持OpenSSH格式,但路径含空格、中文、符号或相对路径(如~/keys/id_rsa)都会导致“无法加载密钥”错误。
推荐做法:把私钥文件放到无空格、无中文、权限可控的路径,例如C:\navicat-keys\jump.ppk(Win)或/Users/you/.ssh/jump_id_rsa(macOS),然后在SSH页点击“…”选择该文件。
- PuTTYgen转换时,“Key comment”字段建议填跳板机标识(如
jump-prod-2026),方便后续排查 - 如果私钥设置了passphrase,务必在“密码短语”栏准确填写——大小写、空格、特殊字符一个都不能错
- Linux/macOS下检查私钥权限:
chmod 600 /path/to/id_rsa,否则SSH服务端可能拒收
隧道连上了但数据库报Access denied,问题大概率不在Navicat
SSH隧道本身成功,只说明你登录跳板机没问题;MySQL拒绝连接,说明数据库层权限没配对。典型场景是MySQL用户授权绑定了具体IP,比如'app_user'@'10.10.5.100',但通过隧道进来时,MySQL看到的客户端IP是跳板机的内网地址(如127.0.0.1或10.10.5.50),而非你的本机IP。
解决方式只有改MySQL授权:用有权限账号登录MySQL,执行类似语句(根据实际调整):
GRANT ALL ON mydb.* TO 'app_user'@'127.0.0.1' IDENTIFIED BY 'xxx';
或者更通用一点(允许从跳板机任意内网IP来):
GRANT ALL ON mydb.* TO 'app_user'@'10.10.5.%' IDENTIFIED BY 'xxx';
- 不要盲目授权
'app_user'@'%',这会降低安全性 - 执行完记得
FLUSH PRIVILEGES; - 如果MySQL配置了
bind-address = 127.0.0.1,它只接受本地连接,此时跳板机上MySQL必须监听0.0.0.0或对应内网IP
实际最难调的永远不是Navicat那一屏配置,而是搞清“谁在连谁”——SSH连的是跳板机系统,MySQL连的是跳板机视角下的数据库实例,两层身份、两套权限,漏掉任一环都会卡住。


















