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 옵션.
이 문제를 해결하는 몇 가지 방법이 있습니다.
- 유닉스 소켓 대신 TCP/IP만 사용해도 됩니다.이렇게 하면 됩니다.
127.0.0.1
대신에localhost
연결할 때.하지만 유닉스 소켓은 더 빠르고 안전하게 사용할 수 있습니다. - 에서 소켓을 변경할 수 있습니다. MySQL 구성 파일을 엽니다.
my.cnf
MySQL고 PHP합니다를 합니다.mysqli.default_socket
그 길로.내 시스템에서는./var/run/mysqld/mysqld.sock
. 연결을 열 때 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
아니면null
value, 이름이 지정된 파이프/소켓 연결(: 참조)을 시행합니다. 그렇지 않으면(예: 포트 또는 비로컬 호스트 호스트를 지정할 때) 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
'source' 카테고리의 다른 글
문자열을 연결하여 SELECT * MySql (0) | 2023.10.11 |
---|---|
SQL 구문에 오류가 있습니다. MySQL 서버 버전에 해당하는 설명서에서 다음에 사용할 올바른 구문을 확인하십시오. (0) | 2023.10.11 |
두 열 A,B를 기준으로 데이터 프레임에서 중복 제거, 다른 열 C에 최대값이 있는 행 유지 (0) | 2023.10.11 |
Node.js와 함께 밑줄 모듈 사용 (0) | 2023.10.11 |
주어진 url로 이미지가 존재하는지 확인하는 방법은? (0) | 2023.10.11 |