Connection refused 表明TCP连接在三次握手前被拒绝,根本未到达MySQL认证环节;95%原因为mysqld未监听3306端口或被防火墙/安全组拦截,需用ss -tlnp | grep :3306确认真实监听状态,并检查bind-address配置、systemd覆盖项及云平台安全组规则。

Connection refused 是服务没起来,不是密码错了
看到 Connection refused 就去改密码、重置用户权限,基本白忙。这个错误说明 TCP 连接在三次握手前就被系统拒绝了——根本没到 MySQL 认证那步。95% 的情况是 mysqld 没监听 3306,或者监听了但被拦在半路。
先用 ss 或 netstat 看 3306 到底有没有真在监听
别信配置文件里写了 bind_address = 0.0.0.0 就以为它真绑定了。实际运行状态才是唯一依据:
- 执行
ss -tlnp | grep :3306(推荐)或netstat -tlnp | grep :3306 - 如果没输出,说明 mysqld 根本没在监听该端口——可能是服务没启动、
skip-networking开了、或者bind_address配成了127.0.0.1且你正从远程连 - 如果有输出,注意看第二列:是
0.0.0.0:3306还是127.0.0.1:3306?前者可远程连,后者只能本地用mysql -h 127.0.0.1连(但不等于localhost)
bind-address 配错是最常见的“假开放”原因
bind_address 不是“允许谁来连”,而是“我在哪张网卡上听”。配错就等于把门焊死在屋里:
- 值为
127.0.0.1:只响应本机 TCP 请求(mysql -h 127.0.0.1),localhost会走 socket 路径,不走这个地址 - 值为
0.0.0.0:监听所有 IPv4 接口,但必须配合防火墙放行,否则外网仍连不上 - 值为具体内网 IP(如
192.168.1.100):仅对该网段开放,适合多网卡服务器 - 注释掉或留空:部分旧版本默认回退到
127.0.0.1,不可靠;MySQL 8.0+ 默认行为已变,务必显式配置
防火墙和安全组是远程连接的最终守门人
即使 ss 显示 0.0.0.0:3306 在监听,云服务器或物理机的防火墙也可能直接丢包:
- Linux 上查
firewall-cmd --list-ports(CentOS/RHEL)或ufw status(Ubuntu),确认3306/tcp在列表里 - 云服务器(阿里云、腾讯云等)必须进控制台检查安全组——宝塔面板里的“防火墙”开关只管面板端口,对 MySQL 完全无效
- 测试连通性别只用
ping,得用telnet your_ip 3306或nc -zv your_ip 3306;不通就不是 MySQL 的问题,是网络策略层卡住了
真正容易被忽略的是:systemd 服务单元文件可能覆盖了 my.cnf 里的 bind_address,比如 /etc/systemd/system/mysqld.service.d/override.conf 里加了 Environment="MYSQLD_OPTS=--bind-address=127.0.0.1" ——这种优先级更高,改了 my.cnf 也白搭。











