PHP 치명적인 오류: 'SQLSTATE[HY000] [2002] 연결이 거부됨 메시지와 함께 포착되지 않은 예외 'PDOException'

PHP 치명적인 오류: 'SQLSTATE[HY000] [2002] 연결이 거부됨 메시지와 함께 포착되지 않은 예외 'PDOException'

내 데이터베이스에 다른 서버가 있습니다.

PDO를 사용하여 데이터베이스에 연결할 때 호스트 매개변수에 데이터베이스 VM의 IP 주소를 사용했습니다.

$dbh = new pdo("mysql:host=192.168.56.103;port=3306;dbname=data",'root','root')

하지만 연결이 거부되었습니다('SQLSTATE[HY000] [2002]' 메시지와 함께 PDOException'). 나는 거기에서 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>

같은 메시지가 나오나요? 연결이 거부되었나요? 그렇다면 귀하의 사용자는 아마도 잘못된 권리를 갖게 될 것입니다.

또 다른 이유는 mysql 서버가 127.0.0.1과 같은 특정 주소에 바인딩되어 있기 때문입니다.

알아 보려면 다음의 출력을 확인하십시오.

sudo netstat -tlpen

0.0.0.0:3306mysql이 을 (를) 듣지 않고 있는 경우에는 127.0.0.1:3306localhost에서만 연결할 수 있습니다.

이를 변경하려면 /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.

관련 정보