PHP 致命错误:未捕获异常“PDOException”,消息为“SQLSTATE[HY000] [2002] 连接被拒绝

PHP 致命错误:未捕获异常“PDOException”,消息为“SQLSTATE[HY000] [2002] 连接被拒绝

我的数据库有一个不同的服务器。

当我使用 PDO 连接到数据库时,我使用数据库 VM 的 IP 地址作为主机参数:

$dbh = new pdo("mysql:host=192.168.56.103;port=3306;dbname=data",'root','root')

但是我收到拒绝连接(PDOException,消息为“SQLSTATE[HY000] [2002]”)。我猜它无法在那里找到 MySQL。但是它可以找到具有该 IP 的 VM。

答案1

那么检查 mysql 是否真的没有运行:

sudo aptitude install nmap

进而:

sudo nmap -sS <ipofdbserverhere>

您也可以在 mysql 服务器上安装该工具,命令如下:

sudo nmap -sS localhost

在这两种情况下,您的答案都应该是这样的。

[simmel]@[mars]$ sudo nmap -sS 172.16.1.41

Starting Nmap 6.40 ( http://nmap.org ) at 2015-04-08 15:09 CEST

Nmap scan report for 172.16.1.41
Host is up (0.010s latency).
Not shown: 996 closed ports
PORT     STATE SERVICE
3306/tcp open  mysql

Nmap done: 1 IP address (1 host up) scanned in 33.17 seconds

如果显示端口 3306,则表明该端口确实已打开并准备连接。如果是这种情况,请从计算机通过命令行使用 mysql。

mysql -u<USER> -p<PASSWORD> -h<ipofdbserverhere> <databasename>

出现相同的消息?连接被拒绝?那么您的用户可能拥有错误的权限。

另一个原因是当 mysql 服务器绑定到某个地址时,例如 127.0.0.1。

要找出答案,请检查以下输出:

sudo netstat -tlpen

如果 mysql 没有监听0.0.0.0:3306但是监听127.0.0.1:3306,则您只能从本地主机连接。

要更改此设置,请转到/etc/mysql/my.cnf并注释掉以下行:

bind-address            = 127.0.0.1

注释掉它的方法是添加一个前导#字符:

#bind-address            = 127.0.0.1

保存文件并重启mysql服务

sudo service mysql restart

现在您应该可以连接了。

要更改端口,请输入:

port = 8888

/etc/mysql/my.cnf

保存文件并重新启动mysql服务:

sudo service mysql restart

答案2

错误 2002 意味着 MySQL 无法通过套接字文件(例如/tmp/mysql.sock)连接到本地数据库服务器。

要找出套接字文件的位置,请运行:

mysql_config --socket

然后仔细检查您的应用程序是否使用正确的 Unix 套接字文件或通过 TCP/IP 端口进行连接。

测试插座:

mysql --socket=/var/mysql/mysql.sock

如果 Unix 套接字错误,您可以对其进行符号链接,例如:

ln -vs /Applications/MAMP/tmp/mysql/mysql.sock /var/mysql/mysql.sock

或者更正您的配置文件(例如php.ini)。

测试原产地保护组织直接从 PHP 连接,你可以运行:

php -r "new PDO('mysql:host=localhost;port=3306;charset=utf8;dbname=dbname', 'root', 'root');"

还请检查 Apache 和 CLI(命令行界面)之间的配置,因为配置可能不同。

可能是服务器正在运行,但您尝试使用与服务器正在监听的端口不同的 TCP/IP 端口、命名管道或 Unix 套接字文件进行连接。要纠正此问题,您需要调用客户端程序(例如指定--port选项)来指示正确的端口号、正确的命名管道或 Unix 套接字文件(例如--socket选项)。

看:解决连接 MySQL 的问题


其他可以帮助追踪问题的实用程序/命令:

  • netstat -ln | grep mysql
  • php -r "phpinfo();" | grep mysql
  • php -i | grep mysql
  • xdebug.show_exception_trace=1在您的中使用 XDebugxdebug.ini
  • 在 OS X 上尝试sudo dtruss -fn mysqld,在 Linux 上调试strace
  • 检查 Unix 套接字的权限:stat $(mysql_config --socket)以及是否有足够的可用空间(df -h)。
  • 重新启动 MySQL。
  • 查看net.core.somaxconn

相关内容