“connection refused”主因是mysql未监听目标地址端口,常见于bind-address=127.0.0.1限制、skip-networking启用、服务未运行或配置文件修改错误;需检查监听状态、修正配置、重启服务并确认生效。

“Connection refused”不是密码错、也不是用户权限问题,而是请求根本没抵达 MySQL 进程——最可能的原因是 MySQL 没监听你尝试连接的那个地址和端口。
MySQL 只监听 127.0.0.1,但宝塔用服务器公网/IP 去连
这是宝塔环境下最典型的配置错位:MySQL 默认配置 bind-address = 127.0.0.1,意味着它只接受本机(localhost)来的 TCP 连接;而宝塔面板在添加远程数据库或测试连接时,往往使用服务器的内网 IP 或公网 IP 发起连接,结果直接被拒绝。
- 用
ss -tlnp | grep :3306或netstat -tlnp | grep :3306查看监听状态:如果只显示127.0.0.1:3306,就坐实了这个问题 - 配置文件路径常见于:
/etc/my.cnf、/etc/mysql/mysql.conf.d/mysqld.cnf或宝塔专属路径/www/server/mysql/etc/my.cnf - 把
bind-address = 127.0.0.1改成bind-address = 0.0.0.0(允许所有接口),或注释掉这一行(MySQL 5.7+ 默认行为即为监听全部) - 改完必须重启服务:
systemctl restart mysqld(CentOS/Rocky)或systemctl restart mysql(Ubuntu/Debian)
MySQL 启用了 skip-networking
这个配置项会彻底关闭 TCP/IP 网络监听,只保留 Unix socket 通信。一旦启用,任何远程(包括同服务器上用 IP 连接的程序)都会报 Connection refused。
- 在同一个配置文件里搜索
skip-networking - 如果存在且值为
ON或未加注释,直接删掉该行或在前面加#注释 - 注意:有些低配 VPS 上,MySQL 安装脚本会默认开启它来“省资源”,但宝塔场景下必须关掉
MySQL 进程根本没跑起来,或者启动失败了
别跳过这一步——很多“Connection refused”其实是因为 mysqld 压根没运行,或者启动中途崩溃了。
- 先查状态:
systemctl status mysqld(或mysql),看是不是inactive (dead)或failed - 如果是 failed,用
journalctl -u mysqld -n 50 --no-pager看最近 50 行错误日志,常见原因有:磁盘满、内存 OOM 被 kill、配置语法错误(比如多了一个逗号)、datadir权限不对 - 宝塔面板首页的“软件商店”里 MySQL 显示“运行中”,不等于真实进程健康;它可能只是上次启动成功的缓存状态
- 临时救急可执行
bt 16(宝塔命令行工具),选“重启 MySQL”并观察输出是否报错
防火墙或安全组放行了端口,但 bind-address 写错了内网地址
有人以为改成 bind-address = 192.168.1.100 就够了,结果发现只有同 VPC 的机器能连,宝塔服务器却连不上——因为那个 IP 并不是宝塔所在机器的出口地址,而是数据库服务器自身的某个内网卡地址,且未必和宝塔服务器在同一个子网。
-
0.0.0.0是最稳妥的选择,它不依赖具体网卡,也不挑网络拓扑 - 若坚持限定 IP,务必确认该 IP 是数据库服务器上实际承载流量的那块网卡地址(
ip a查),且和宝塔服务器路由可达 - 改完
bind-address后,一定要再跑一次ss -tlnp | grep :3306,确认监听行变成*:3306或0.0.0.0:3306,否则说明配置没生效或被其他配置覆盖
真正容易被忽略的是:配置改了、服务也重启了,但 ss 输出仍显示 127.0.0.1:3306——这时候大概率是改错了配置文件(比如改了 /etc/my.cnf,但 MySQL 实际加载的是 /www/server/mysql/etc/my.cnf),或者有多个 bind-address 出现在不同 include 文件里,后者覆盖了前者。











