Connection refused 根本原因是 MySQL 未监听目标地址端口,常见于服务未启动、仅绑定 127.0.0.1、bind-address 配置错误、防火墙/安全组拦截或 Docker 映射缺失;需依次检查 systemctl 状态、ss 监听结果、日志报错、网络连通性及认证插件兼容性。

Connection refused 不是权限问题,而是 MySQL 根本没在监听你连的那个地址和端口。 90% 的情况,服务压根没起来,或者只绑定了 127.0.0.1 却试图从外网连。
service 没跑,或者跑挂了
这是最常被跳过的一步。别急着改配置,先确认进程真在运行:
- 执行
systemctl status mysql(Ubuntu/Debian)或systemctl status mysqld(CentOS/RHEL),看状态是不是active (running);active (exited)或failed都算没跑成 - 如果 inactive,直接
sudo systemctl start mysql,但启动后立刻查日志:journalctl -u mysql -n 50 -e,重点找Can't start server、Address already in use、Table 'mysql.plugin' doesn't exist这类报错 - 本地用 socket 连一下:
mysql -u root -S /var/lib/mysql/mysql.sock。能连上?说明服务本身 OK,问题出在网络层
bind_address 配错了,只监听了 localhost
即使服务起来了,如果 bind_address 还是 127.0.0.1,远程 TCP 连接就会被内核直接拒绝。
- 查当前绑定:
ss -tlnp | grep :3306,输出里要是0.0.0.0:3306或[::]:3306才对;如果只有127.0.0.1:3306,说明只接受本地连接 - 改配置文件(通常是
/etc/mysql/mysql.conf.d/mysqld.cnf或/etc/my.cnf),找到[mysqld]下的bind-address行,改成:bind-address = 0.0.0.0(允许所有 IP)或指定公网 IP - 注意:如果配置里有
skip-networking = 1,必须删掉或注释掉,否则 MySQL 会彻底关闭 TCP 连接能力 - 改完重启:
sudo systemctl restart mysql,再跑一遍ss -tlnp | grep :3306确认生效
防火墙或云服务器安全组拦住了 3306
服务监听了,也开了端口,但中间链路不通,照样 Connection refused。
- 本地测试端口通不通:
telnet 127.0.0.1 3306—— 应该连得上;再试telnet your_server_ip 3306(your_server_ip 是服务器公网 IP)—— 如果超时,大概率是网络拦截 - Linux 本机防火墙:
sudo ufw status(Ubuntu)或sudo firewall-cmd --list-ports(CentOS),确保 3306 在放行列表里 - 云服务器(阿里云、腾讯云、AWS 等)必须检查「安全组」规则,手动加一条入方向规则:协议类型 TCP,端口范围 3306,源 IP 可设为
0.0.0.0/0(测试用)或具体客户端 IP - Docker 部署的 MySQL 还要确认
-p 3306:3306是否正确映射,且容器内bind-address已设为0.0.0.0
MySQL 8.0+ 的 caching_sha2_password 插件不兼容老客户端
这个错误现象其实是 Access denied,但很多人误以为是 Connection refused。如果你 telnet 能通、ss 显示监听正常,却连不上,就要怀疑认证插件。
- 登录 MySQL 后执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_username'; - 如果
plugin是caching_sha2_password,而你的客户端(比如旧版 PHP mysqli、某些 JDBC 驱动)不支持,就会报错 - 临时解决:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';,然后FLUSH PRIVILEGES; - 长期方案是升级客户端驱动,而不是降级服务端认证方式
真正卡住的地方往往不是配置本身,而是“改完没重启”“重启没生效”“日志没看就瞎猜”。ss -tlnp | grep :3306 和 journalctl -u mysql -n 50 -e 这两条命令,比翻十篇教程都管用。


















