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>

同じメッセージが表示されますか? 接続が拒否されましたか? その場合、ユーザーの権限が間違っている可能性があります。

もう 1 つの理由は、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: )を修正してください。

テストするにはPDOPHP から直接接続するには、次のコマンドを実行します。

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
  • XDebugxdebug.show_exception_trace=1xdebug.ini
  • OS Xでは試しsudo dtruss -fn mysqld、Linuxではデバッグでstrace
  • Unix ソケットの権限を確認しstat $(mysql_config --socket)、十分な空き容量があるかどうかを確認します ( df -h)。
  • MySQLを再起動します。
  • チェックnet.core.somaxconn

関連情報