先确认SSH隧道进程是否存活,执行ps aux | grep ssh检查是否有ssh -L 127.0.0.1:3307:127.0.0.1:3306命令;再验证mysql -h 127.0.0.1 -P 3307能否连通;最后确保phpMyAdmin config.inc.php中host设为'127.0.0.1'、port设为'3307',且远程MySQL允许127.0.0.1访问。
phpMyAdmin 连不上远程 MySQL,先看隧道是否真在转发
绝大多数问题出在隧道根本没跑起来,或者端口映射错位。不是 phpmyadmin 配置错了,而是它连的压根不是你以为的那个端口。
- 执行
ps aux | grep ssh,确认输出里有类似ssh -L 127.0.0.1:3307:127.0.0.1:3306 user@remote的进程;没有就说明隧道没启动 - 别用
localhost:3307测试,直接用mysql -h 127.0.0.1 -P 3307 -u root -p命令行验证——localhost在 MySQL 客户端里可能走 socket,绕过 TCP,必须显式用127.0.0.1 - 如果命令行能连上但 phpMyAdmin 不行,说明问题一定在它的配置里,不是网络层
config.inc.php 里 host 和 port 必须严格匹配隧道绑定
phpMyAdmin 是 PHP 进程发起连接,它看到的是自己所在服务器上的地址和端口。你本地开的隧道,对它来说就是“本地回环上的一个新端口”,不是“远程数据库”。
-
$cfg['Servers'][$i]['host']必须设为'127.0.0.1'(不能是'localhost'),否则 PHP MySQL 扩展会尝试 Unix socket,跳过你的隧道 -
$cfg['Servers'][$i]['port']必须设为隧道监听的本地端口,比如'3307',和ssh -L命令中冒号前的数字一致 - 如果 phpMyAdmin 和 MySQL 在同一台机器(比如 Docker 环境),
host写'127.0.0.1'是唯一可靠选择;写'localhost'就等于放弃隧道
SSH 命令必须显式绑定到 127.0.0.1,别信默认值
某些系统里 localhost 解析为 IPv6 地址或触发 socket 连接,而 ssh -L 默认绑定行为不统一,容易导致隧道监听在不可达地址上。
- 正确写法:
ssh -L 127.0.0.1:3307:127.0.0.1:3306 user@remote-server—— 前后两个127.0.0.1都不能省 - 错误写法:
ssh -L 3307:127.0.0.1:3306 ...(缺左侧绑定地址,可能绑在::1或随机接口) - 更危险的写法:
ssh -L 0.0.0.0:3307:...,会把隧道端口暴露给局域网,且 phpMyAdmin 可能因 Host 头校验失败拒绝连接
MySQL 服务本身得允许被本机的 127.0.0.1 访问
隧道只是转发流量,最终还是靠远程 MySQL 实例响应。如果它只监听 127.0.0.1 但禁止该地址登录,隧道也白搭。
- 登录远程服务器,执行
mysql -h 127.0.0.1 -u root -p,能进就说明 MySQL 服务本身 OK - 检查
mysql.user表:至少有一条user@'127.0.0.1'或user@'localhost'的记录;host='%'不起作用,因为隧道发来的请求源 IP 是127.0.0.1 - 确认
bind-address在my.cnf中设为127.0.0.1或0.0.0.0,不能是空或localhost
localhost 和 127.0.0.1——这三处错一个,整个链路就断在看不见的地方。



















