“SQLSTATE[HY000] Connection refused”错误表明TCP连接被服务器主动拒绝,首要排查MySQL服务是否运行、3306端口是否监听并放行、用户权限与认证插件是否兼容、网络连通性是否正常,以及Docker环境下地址配置是否正确。
![sqlstate[hy000] connection refused数据库连不上](https://img.php.cn/upload/article/001/431/639/177875004034482.png)
如果您在PHP或ThinkPHP6等应用中尝试连接MySQL数据库,但收到“SQLSTATE[HY000] Connection refused”错误,则表明客户端发起的TCP连接请求被目标服务器主动拒绝。以下是解决此问题的步骤:
一、验证MySQL服务运行状态
该错误最常见原因是数据库服务未处于活动状态,导致系统无法响应任何连接请求。需确认MySQL进程是否已启动并持续监听。
1、在Linux系统中执行命令:systemctl status mysql,检查输出中是否显示“active (running)”。
2、若服务未运行,执行:sudo systemctl start mysql 启动服务。
3、在Windows系统中,按下 Win + R,输入 services.msc,找到“MySQL”或“MySQL80”服务,右键选择“启动”。
二、检查数据库监听端口与防火墙设置
MySQL默认监听3306端口,若端口被修改、未监听或被防火墙拦截,连接将被拒绝。需确认实际监听地址、端口及网络放行策略。
1、在Linux中运行:sudo netstat -tulnp | grep :3306,查看是否有mysqld进程绑定到0.0.0.0:3306或127.0.0.1:3306。
2、若仅监听127.0.0.1且需远程连接,编辑 /etc/mysql/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf,将 bind-address = 127.0.0.1 改为 bind-address = 0.0.0.0。
3、执行:sudo ufw allow 3306(Ubuntu)或 sudo firewall-cmd --add-port=3306/tcp --permanent && sudo firewall-cmd --reload(CentOS/RHEL)开放端口。
三、测试基础网络连通性
排除DNS解析失败或网络路由中断导致的连接拒绝,应绕过应用层直接验证TCP可达性。
1、在应用所在主机执行:telnet 127.0.0.1 3306(如无telnet,可用 nc -zv 127.0.0.1 3306)。
2、若返回“Connection refused”,说明MySQL未监听该地址端口;若超时或无法解析,则检查主机名配置或使用IP直连。
3、若连接对象为远程服务器,还需确认中间网络设备(如云服务器安全组)已放行3306端口入向规则。
四、校验数据库用户权限与认证方式
即使服务运行且端口可达,若用户账户未授权从当前来源主机连接,或认证插件不兼容,也会触发Connection refused类表现(尤其在Docker或MySQL 8.0+环境中)。
1、登录MySQL服务端:mysql -u root -p,执行:SELECT user, host FROM mysql.user;,确认目标用户(如root)的host字段包含连接来源(如'%'、'localhost'或具体IP)。
2、若需允许任意IP连接,执行:UPDATE mysql.user SET host='%' WHERE user='root'; FLUSH PRIVILEGES;。
3、对于MySQL 8.0+,若PHP客户端使用旧驱动,可能因caching_sha2_password插件不兼容而静默失败,可临时切换认证方式:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; FLUSH PRIVILEGES;。
五、排查Docker容器内连接异常
在容器化部署中,“Connection refused”常源于容器网络隔离、服务未就绪或宿主-容器地址混淆,需针对性验证容器间通信路径。
1、进入应用容器:docker exec -it your_app_container bash,再执行:ping -c 3 mysql_container_name(使用docker-compose服务名)或 ping -c 3 host.docker.internal(访问宿主机MySQL)。
2、若使用宿主机MySQL,确保PHP连接字符串中主机设为 host.docker.internal(Docker Desktop)或 172.17.0.1(Linux Docker),而非localhost。
3、若MySQL也在容器中,确认两容器处于同一自定义网络:docker network inspect your_network_name,并检查MySQL容器日志是否报错启动失败。

















