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 的虛擬機器。

答案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,您只能從 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

答案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(命令列介面)之間的配置,因為配置可能有所不同。

伺服器可能正在運行,但您嘗試使用與伺服器正在偵聽的連接埠、命名管道或 Unix 套接字檔案不同的 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

相關內容