source

mysqli::mysqli(): (HY000/2002):소켓 'MySQL'을 통해 로컬 MySQL 서버에 연결할 수 없음 (2)

nicesource 2023. 10. 11. 20:47
반응형

mysqli::mysqli(): (HY000/2002):소켓 'MySQL'을 통해 로컬 MySQL 서버에 연결할 수 없음 (2)

php mysqli 클래스를 사용하여 mysql 데이터베이스에 연결하려고 하면 이 오류가 발생합니다.다음 코드 사용:

$db = new MySQLi("localhost","kamil","*****");

보안을 위해 password는 *입니다.

사용자를 만들었습니다.kamil외부 IP 주소 및 localhost에 대한 모든 권한이 있습니다.실행할 때:select user,host from mysql.user이 두 사용자를 적절하게 표시합니다.

저는 몇 가지 조사를 했고 이 벤치마크인 https://stackoverflow.com/a/2183134/1839439 를 사용하여 연결된 내용을 확인했습니다.알고 보니 이 장치는 다음과만 연결할 수 있습니다.127.0.0.1그리고.127.0.0.1:3306하지만 내가 공급할 때는 로컬 호스트입니다.localhost이것은 이 오류를 없애 줍니다.

제 질문은 왜 이름이나 외부 IP가 아닌 localhost ip 주소를 사용하여 DB에만 접속할 수 있는지 입니다.웹사이트에서 mysql을 사용하려면 다른 호스트가 필요한가요? 아니면 사용할 수 있나요?127.0.0.1?

hosts파일

127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback
fe00::0         ip6-localnet
ff00::0         ip6-mcastprefix
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

127.0.1.1       raspberrypi

Mysql user table results for this user:
| kamil            | 109.255.177.28 |
| kamil            | localhost      |

"localhost"만 사용하면 MySQL 클라이언트 라이브러리는 TCP/IP 연결 대신 유닉스 도메인 소켓을 연결에 사용하려고 합니다.이 오류는 소켓이 호출되었다는 것을 알려줍니다.MySQL, 연결이 존재하지 않기 때문일 수 있습니다(오류 번호 2).

MySQL 설명서에서:

유닉스에서 MySQL 프로그램은 다른 네트워크 기반 프로그램과 비교할 때 기대하는 것과 다른 방식으로 호스트 이름 localhost를 특별하게 처리합니다.로컬 호스트에 대한 연결의 경우 MySQL 프로그램은 유닉스 소켓 파일을 사용하여 로컬 서버에 연결을 시도합니다.포트 번호를 지정하기 위해 --port 또는 -P 옵션이 지정된 경우에도 발생합니다.클라이언트가 로컬 서버에 TCP/IP를 연결하도록 하려면 --host 또는 -h를 사용하여 호스트 이름 값 127.0.0.1 또는 로컬 서버의 IP 주소 또는 이름을 지정합니다.또한 -- protocol=를 사용하여 로컬 호스트에 대해서도 명시적으로 연결 프로토콜을 지정할 수 있습니다.TCP 옵션.

이 문제를 해결하는 몇 가지 방법이 있습니다.

  1. 유닉스 소켓 대신 TCP/IP만 사용해도 됩니다.이렇게 하면 됩니다.127.0.0.1대신에localhost연결할 때.하지만 유닉스 소켓은 더 빠르고 안전하게 사용할 수 있습니다.
  2. 에서 소켓을 변경할 수 있습니다. MySQL 구성 파일을 엽니다.my.cnfMySQL고 PHP합니다를 합니다.mysqli.default_socket그 길로.내 시스템에서는./var/run/mysqld/mysqld.sock.
  3. 연결을 열 때 PHP 스크립트에서 소켓을 직접 구성합니다.예를 들어,

    $db = new MySQLi('localhost', 'kamil', '***', '', 0, 
                                  '/var/run/mysqld/mysqld.sock')
    

PHP 문제라면 위치에 상관없이 간단하게 설정 파일 php.ini를 변경하여 PORT/SOCCET-PATH 등의 설정을 업데이트하여 서버에 연결할 수 있습니다.

저 같은 경우에는 php.ini 파일을 열어보고 했습니다.

mysql.default_socket = /var/run/mysqld/mysqld.sock
mysqli.default_socket = /var/run/mysqld/mysqld.sock

그리고 바로 효과가 있었습니다.인정할게요, 저는 @Joni의 대답에서 힌트를 얻었어요.

'localhost'가 작동하지 않지만 127.0.0.1이 작동하는 경우.로컬 호스트 파일이 올바른 위치를 가리키는지 확인합니다.(/etc/hosts for linux/mac, C:\Windows\시스템32\drivers\etc\hosts for window).

또한 사용자가 선택하려는 데이터베이스에 연결할 수 있는지 확인합니다.

제 질문은 왜 이름이나 외부 IP가 아닌 localhost ip 주소를 사용하여 DB에만 접속할 수 있는지 입니다.

다음에 대한 문서에 의거:

매개 변수: 호스트 이름:호스트 이름 또는 IP 주소일 수 있습니다.null 값 또는 문자열을 전달할 때 로컬 호스트가 가정됩니다. "localhost이 로."에.가능한 경우 TCP/IP 프로토콜 대신 파이프를 사용합니다.가 함께 (예: TCP됩니다) 됩니다.localhost:3308.

그래서 기본적으로 당신이 a를 지정한다면localhost아니면nullvalue, 이름이 지정된 파이프/소켓 연결(: 참조)을 시행합니다. 그렇지 않으면(예: 포트 또는 비로컬 호스트 호스트를 지정할 때) TCP/IP 프로토콜을 사용합니다(예:localhost:3308).

아래 파일을 확인해주시기 바랍니다.

%SystemRoot%\system32\drivers\etc\host

호스트 이름을 ip로 바인딩하는 줄에 해당 이름을 함께 바인딩하는 줄이 누락되었을 수 있습니다.

127.0.0.1  localhost

지정된 선이 누락된 경우.파일에 줄 추가


MySQL 데이터베이스의 사용자 테이블을 확인하고 사용 중인 사용자의 host column 값을 알려주시겠습니까?호스트 "127.0.0.1"과 "localhost"에 대한 사용자 권한이 있어야 하며 일반 호스트 이름의 와일드 문자이므로 %를 사용해야 합니다.

언급URL : https://stackoverflow.com/questions/13769504/mysqlimysqli-hy000-2002-cant-connect-to-local-mysql-server-through-sock

반응형