求助:PHP连接MariaDB数据库出现SQLSTATE[HY000] [2002] Connection refused错误(端口3306正确)
排查MariaDB连接错误:SQLSTATE[HY000] [2002] Connection refused
我来帮你一步步排查这个连接拒绝的问题,这种情况通常是服务状态、配置设置、用户权限或者网络层面的问题,咱们逐个来检查:
1. 确认MariaDB服务是否正常运行
首先要确保树莓派上的MariaDB服务已经启动并在运行。登录到你的树莓派,执行以下命令查看状态:
sudo systemctl status mariadb
如果输出里看不到active (running),那就启动服务:
sudo systemctl start mariadb
为了避免下次重启后服务不自动启动,可以设置开机自启:
sudo systemctl enable mariadb
2. 检查MariaDB的监听地址配置
默认情况下,MariaDB可能只允许本地(127.0.0.1)连接。如果你的Web服务器和MariaDB不在同一台机器,或者即使在同一台但主机名解析有问题,就会导致连接拒绝:
- 找到MariaDB的配置文件(通常是
/etc/mysql/mariadb.conf.d/50-server.cnf或者/etc/my.cnf) - 找到
bind-address这一行,把它改成bind-address = 0.0.0.0(允许所有IP访问),或者指定Web服务器的IP地址 - 修改后重启MariaDB服务:
sudo systemctl restart mariadb
另外,你可以尝试把PHP代码里的host=raspberrypi换成树莓派的实际IP地址(比如192.168.1.100),避免主机名解析失败的问题:
$pdo = new PDO("mysql:host=192.168.1.100;port=3306;database=$database", $username, $password);
3. 验证数据库用户的访问权限
你使用的是root用户,默认情况下root可能只允许从localhost登录。需要确认这个用户是否允许从Web服务器所在的IP访问数据库:
- 登录到树莓派的MariaDB:
mysql -u root -p
- 执行以下命令查看用户的权限范围:
SELECT user, host FROM mysql.user;
- 如果
root对应的host是localhost或者127.0.0.1,而你的Web服务器在其他机器,就需要给root授权允许远程访问:
GRANT ALL PRIVILEGES ON weatherbot.* TO 'root'@'你的Web服务器IP' IDENTIFIED BY 'M1lVhPuio'; FLUSH PRIVILEGES;
如果你希望root能从任何IP访问,可以把你的Web服务器IP换成%。
4. 检查防火墙是否阻止了3306端口
树莓派的防火墙(比如ufw)可能会阻止外部对3306端口的访问:
- 查看防火墙状态:
sudo ufw status
- 如果没有允许3306端口的规则,添加允许规则:
# 允许所有IP访问3306端口(适合测试,生产环境建议限制IP) sudo ufw allow 3306 # 或者只允许Web服务器的IP访问 sudo ufw allow from 你的Web服务器IP to any port 3306
5. 测试网络连通性
最后,从Web服务器所在的机器测试和树莓派的网络连通:
- 先ping树莓派的IP,确认网络可达:
ping 192.168.1.100
- 再用telnet测试3306端口是否能连接:
telnet 192.168.1.100 3306
如果telnet连接失败,说明网络层面有问题,需要先解决网络连通性(比如检查路由器设置、IP是否在同一网段等)。
内容的提问来源于stack exchange,提问作者Marie03
相关产品推荐
相关产品推荐

