SQLSTATE[HY000][2002] PDO连接MySQL Connection refused错误求助
域名连接场景下MySQL连接拒绝报错解决方案
SQLSTATE[HY000] [2002] Connection refused 报错与时区配置、DIR/SITEEMAIL应用地址配置无关联,这两类配置分别负责PHP时间计算、站点路径跳转/邮件发件人标识,不会触发数据库连接层的拒绝逻辑。
现有代码的明确错误
- PDO连接参数拼接错误:当前代码中数据库名部分写为
dbname=AppDatabase".DBNAME,实际运行时会拼接为无效库名AppDatabasedbname,该问题会后续触发库不存在报错,不是本次连接拒绝的诱因,但必须修正。 - 端口硬编码错误:代码中写死的
8889是本地MAMP集成环境的默认MySQL端口,绝大多数远程自建MySQL、云数据库默认监听端口为3306,直接套用本地端口配置是远程连接失败的常见原因。
远程连接场景排查步骤(非localhost本地场景)
按以下顺序逐一排查即可解决问题:
- 确认MySQL实际监听端口
登录数据库所在服务器执行命令netstat -tulpn | grep mysql,查看输出结果中MySQL进程实际监听的端口号,替换代码中port参数的硬编码值。 - 修改MySQL绑定地址配置
找到MySQL配置文件my.cnf(通常在/etc/mysql/路径下),检查bind-address配置项,如果值为127.0.0.1则代表MySQL仅接受本地连接,外部IP/域名发起的连接会被直接拒绝,将该值修改为bind-address = 0.0.0.0后保存,重启MySQL服务生效。 - 配置数据库用户远程访问权限
root用户默认仅允许本地登录,无远程连接权限。登录服务器本地MySQL客户端,执行以下命令授权:
语句中GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '你实际设置的root密码'; FLUSH PRIVILEGES;%代表允许任意IP发起连接,若要做访问限制,可将%替换为你站点服务器的出口IP。 - 放行端口访问规则
检查数据库所在服务器的内部防火墙(firewalld/ufw/iptables),放通MySQL实际监听端口的入方向规则;如果使用云服务器,还需要在云服务商控制台的安全组配置中,同步放通该端口的入方向访问权限,来源IP设置为站点服务器的IP即可。 - 修正代码中的PDO连接逻辑
将原有PDO实例化代码替换为以下内容,端口号替换为第一步查到的实际监听端口:$db = new PDO("mysql:host=".DBHOST.";port=3306;dbname=".DBNAME, DBUSER, DBPASS);
关于存疑配置项的说明
DIR配置项填写你站点实际的根访问地址即可,当前填写的https://domain/test/只要和实际部署的访问路径一致就没有问题,该配置不参与数据库连接逻辑。- 时区配置仅影响PHP时间相关函数的返回结果,和数据库连接是否成功无关联。
内容的提问来源于stack exchange,提问作者Duck
相关产品推荐
相关产品推荐

