我的資料庫有不同的伺服器。
當我使用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
選項)。
其他可以幫助追蹤問題的實用程式/命令:
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
。