端口未监听是连接被拒绝的首要原因,需先用ss或netstat确认mysql是否监听3306端口,再检查防火墙、安全组及bind_address配置是否允许远程连接。

端口没监听?先确认 mysqld 真正在听 3306
连接被拒绝,最常被跳过的一步是:MySQL 根本没在监听你试图连的那个地址和端口。不是密码错,也不是权限问题,是压根没人开门。
常见错误现象:ERROR 2003 (HY000): Can't connect to MySQL server on 'xxx' (111) 或直接提示“Connection refused”;mysql -h 192.168.1.100 -u root -p 失败,但 mysql -u root -p(本地 socket)能进。
- Linux 上执行
ss -tuln | grep :3306,看输出里是否有LISTEN和对应 IP(比如*:3306或0.0.0.0:3306);若只有127.0.0.1:3306,说明只接受本地回环连接 - Windows 上用
netstat -ano | findstr :3306,同样找LISTENING状态 - 如果没输出,立刻检查
systemctl status mysql(或mysqld),服务可能根本没起来;或者查配置文件里的bind_address是否写成了127.0.0.1且没改
防火墙/安全组拦住了?别只信“本地能连”
本地 mysql -u root -p 成功 ≠ 远程能连。只要走 TCP(比如用 IP 地址、域名连),就一定会经过防火墙或云平台安全组——这两道关卡不放行,请求连包都发不出去。
使用场景:你在笔记本上用 Navicat / DBeaver 连云服务器的 MySQL;或容器内应用连宿主机 MySQL;甚至同一局域网内两台物理机互连。
- Linux 防火墙(如 firewalld):运行
firewall-cmd --query-port=3306/tcp,返回no就得加规则:firewall-cmd --add-port=3306/tcp --permanent && firewall-cmd --reload - 云服务器(阿里云/腾讯云等):必须进控制台 → 安全组 → 入方向规则 → 添加允许 TCP:3306,来源 IP 建议不要直接填
0.0.0.0/0,至少限制为你的办公 IP 段 - Windows 防火墙:进“高级安全 Windows Defender 防火墙” → 入站规则 → 新建规则 → 端口 → TCP 3306 → 允许连接 → 作用域设为“任何 IP”或指定 IP
bind_address 写死 localhost?远程连接永远失败
这是配置层面最隐蔽的坑。MySQL 默认把 bind_address 设成 127.0.0.1 或 localhost,它不是“只给本地用”的友好提示,而是硬性拒绝所有非回环地址的 TCP 连接请求。
参数差异:bind_address = 127.0.0.1 只监听本地回环;bind_address = 0.0.0.0 监听所有 IPv4 接口;bind_address = 192.168.1.100 只监听该网卡 IP。
- 配置文件位置:Linux 通常是
/etc/mysql/mysql.conf.d/mysqld.cnf或/etc/my.cnf;Windows 是my.ini - 找到
[mysqld]下的bind_address行,改成0.0.0.0(开发测试可用),保存后必须执行systemctl restart mysql(或service mysql restart)才生效 - 改完仍连不上?再跑一次
ss -tuln | grep :3306,确认监听地址已变成*:3306—— 否则说明配置没加载,可能是路径错、段落名错(比如写成[mysql]而非[mysqld])
telnet 或 nc 测不通?说明网络层已断
在客户端机器上执行 telnet 192.168.1.100 3306 或 nc -zv 192.168.1.100 3306,如果显示 “Connection refused” 或超时,问题一定出在网络通路:要么端口没监听,要么防火墙/安全组拦截,要么中间有 NAT/代理阻断。
这个测试比任何 MySQL 客户端报错都早、都干净——它不涉及用户名密码、不触发权限校验,纯粹验证 TCP 层是否可达。
- 如果
telnet成功(出现空白或乱码),说明网络通了,问题转向 MySQL 账户权限或认证方式(比如 plugin 是caching_sha2_password但客户端不支持) - 如果失败,别急着改 MySQL 密码或授权,先回头查端口监听状态和防火墙规则——90% 的“连接被拒绝”停在这一步
- 注意:某些 Linux 发行版默认没装
telnet,用nc更可靠;macOS 用户可装nmap后用nmap -p 3306 192.168.1.100
真正卡住人的,往往不是不会授权、不是不会改密码,而是误以为“服务起来了=能连”,忽略了监听地址和网络策略这两个前置铁闸。每次连不上,先 ss + telnet 两步,省下半小时翻日志。











