내 데이터베이스에 다른 서버가 있습니다.
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:3306
mysql이 을 (를) 듣지 않고 있는 경우에는 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
.
문제를 추적하는 데 도움이 될 수 있는 기타 유틸리티/명령:
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
.