PHP致命错误:未捕获exception’PDOException’,消息’SQLSTATE 连接被拒绝

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

当我用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。

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

 sudo aptitude install nmap 

然后:

 sudo nmap -sS  

您也可以在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 -p -h  

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

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

要找出检查输出:

 sudo netstat -tlpen 

如果mysql没有收听0.0.0.0:3306而是收听127.0.0.1:3306 ,那么你只能从localhost连接。

要更改它转到/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 

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

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

 mysql_config --socket 

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

测试sockets:

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

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

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

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

要直接从PHP测试PDO连接,您可以运行:

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

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

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

请参阅: 连接到MySQL的问题疑难解答


其他有助于跟踪问题的工具/命令:

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