TCP连接不通是2002错误主因,需逐项验证:MySQL服务运行且监听3306(非127.0.0.1)、phpMyAdmin配置禁用socket并显式设IP和端口、远程用户权限匹配host、防火墙及网络层全链路连通。

确认每台远程MySQL服务真实运行且监听TCP
2002错误不是密码或权限问题,而是连接通道不通。对每台远程MySQL,必须单独验证:mysqld进程是否真在跑、是否监听3306端口、是否允许外部连接。
登录目标服务器执行:
-
systemctl is-active mysql或systemctl is-active mariadb—— 返回active才算服务管理器层面“活着” -
ps aux | grep mysqld—— 必须看到不含grep的mysqld主进程行(不是mysqld_safe) -
ss -tlnp | grep :3306—— 输出里要有LISTEN状态,且Local Address:Port不是127.0.0.1:3306(否则只接受本地连)
如果端口没监听,检查 /etc/mysql/mysql.conf.d/mysqld.cnf 中的 bind-address:不能是 127.0.0.1 或 ::1,应设为 0.0.0.0 或具体内网IP;同时确认没启用 skip-networking。
phpMyAdmin配置中必须用IP+端口,禁用socket字段
phpMyAdmin对每台服务器的配置是独立的,$cfg['Servers'][$i] 块里一旦写了 socket,就会强制走本地文件通信,和“远程”冲突。
立即学习“PHP免费学习笔记(深入)”;
对每个远程MySQL条目,确保以下三点同时满足:
-
$cfg['Servers'][$i]['host']设为远程服务器的真实IP(如'192.168.10.5'),绝不能写'localhost'或'mysql-01'(除非DNS/hosts已解析且你确认它指向正确IP) -
$cfg['Servers'][$i]['port']显式设为3306(即使默认)—— 避免某些PHP版本忽略端口导致 fallback 到 socket -
$cfg['Servers'][$i]['socket']这行必须删除或注释掉(哪怕留空字符串也不行)
示例正确片段:
$cfg['Servers'][1]['host'] = '192.168.10.5'; $cfg['Servers'][1]['port'] = '3306'; // $cfg['Servers'][1]['socket'] = '/var/run/mysqld/mysqld.sock'; ← 这行删了
远程MySQL用户权限必须匹配host字段
把 $cfg['Servers'][$i]['host'] 改成 '192.168.10.5' 后,phpMyAdmin会以该IP作为客户端来源去认证。如果MySQL里只有 root@localhost 或 admin@127.0.0.1,就必然失败。
登录那台远程MySQL,执行:
-
SELECT User, Host FROM mysql.user;—— 看是否存在对应Host值(比如'192.168.10.%'或具体IP) - 若无,用
CREATE USER 'admin'@'192.168.10.5' IDENTIFIED BY 'xxx';+GRANT ALL ON *.* TO 'admin'@'192.168.10.5'; - 别忘了
FLUSH PRIVILEGES;
注意:通配符 % 在远程场景下慎用,生产环境建议限定子网段,如 '192.168.10.%'。
防火墙与网络层连通性必须逐跳验证
phpMyAdmin所在机器到每台MySQL服务器之间,可能卡在任意一环:本机防火墙、中间路由器ACL、云平台安全组、目标服务器iptables/firewalld。
最简验证法(在phpMyAdmin所在机器上执行):
-
nc -zv 192.168.10.5 3306—— 成功返回succeeded!表示TCP可达 - 若失败,先关本地防火墙测试:
sudo ufw disable(Ubuntu)或sudo systemctl stop firewalld(CentOS) - 若仍失败,用
traceroute 192.168.10.5看是否路由中断;云环境重点查安全组入方向规则是否放行3306/tcp且源IP范围正确
容易被忽略的是:某些MySQL容器镜像默认不暴露3306端口,Docker run时必须加 -p 3306:3306,且 docker ps 要确认端口映射状态正常。



















