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