MySQL은“localhost”를 통해 연결할 수 없으며 127.0.0.1 만 가능합니다


27

이것은 나에게 다소 신비입니다. MySQL에 연결할 수있는 유일한 방법은 "127.0.0.1"을 통해 호출하는 것입니다. 예를 들어 PHP 연결 스크립트가 localhost와 작동하지 않습니다.

Mac OS X Lion, 내장 된 apache2, MySQL, PHP, phpMyAdmin을 실행하고 있습니다.

mysqladmin :

count                             0
debug-check                       FALSE
debug-info                        TRUE
force                             FALSE
compress                          FALSE
character-sets-dir                (No default value)
default-character-set             auto
host                              (No default value)
no-beep                           FALSE
port                              0
relative                          FALSE
socket                            (No default value)
sleep                             0
ssl                               FALSE
ssl-ca                            (No default value)
ssl-capath                        (No default value)
ssl-cert                          (No default value)
ssl-cipher                        (No default value)
ssl-key                           (No default value)
ssl-verify-server-cert            FALSE
user                              (No default value)
verbose                           FALSE
vertical                          FALSE
connect-timeout                   43200
shutdown-timeout                  3600
plugin-dir                        (No default value)
default-auth                      (No default value)

1
이것은 아마도 서버 결함에 대한 것일 수도 있지만 호스트 파일에 localhost 별명이 있는지 확인하십시오.
Matt

127.0.0.1 localhost가 호스트 파일에 있습니다.
dcolumbus

명령 프롬프트를 열고 입력 한 ping localhost내용을 확인하십시오.
Steve Robbins

127.0.0.1에서 64 바이트 : icmp_seq = 0 ttl = 64 time = 0.100ms 127.0.0.1에서 64 바이트 : icmp_seq = 1 ttl = 64 time = 0.102ms 127.0.0.1에서 64 바이트 : icmp_seq = 2 ttl = 64 time = 0.096 ms
dcolumbus

답변:


26

"localhost"에 연결하라고 지시하면 MySQL은 유닉스 소켓에 연결을 시도합니다. 127.0.0.1에 연결하도록 지시하면 네트워크 소켓에 연결하도록 강요하는 것입니다. 따라서 파일 시스템 소켓이 아닌 네트워크 소켓 만 수신하도록 MySQL을 구성했을 것입니다.

유닉스 소켓에 정확히 무엇이 잘못되었는지 말하기는 어렵습니다. 그러나 MySQL 참조 안내서 에서이 페이지 를 읽는 것이 좋습니다 . 도움이 될 것입니다.

업데이트 : 업데이트 된 질문 : "socket"매개 변수는 "/var/lib/mysql/mysql.sock"과 같아야합니다. 참조 매뉴얼의이 페이지 에는 더 많은 정보가 있습니다.

여기 내 /etc/my.cnf 파일의 시작 부분이 있습니다 :

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

파일이 비슷해야합니다. 그런 다음 문제를 해결해야합니다. 테스트하기 전에 MySQL 서버를 다시 시작하는 것을 잊지 마십시오.


1
와우 : "호스트 이름을 지정하지 않거나 특별한 호스트 이름 localhost를 지정하면 유닉스 소켓 파일이 사용됩니다." 직관적이지 않은 것 같습니다. 따라서 다른 모든 답변.
Mark Wagner

알아두면 좋은 점 +1
Matt

나는 이론에 감사한다 ... 그 답이 무엇인지 모른다.
dcolumbus

@ dcolumbus : 이미 쓴 것처럼 말하기가 어렵습니다. 내가 추천 할 수있는 것은 콘솔을 열고 "mysql"명령을 작성하는 것입니다. 아마도 더 많은 정보를 얻을 수있을 것입니다. 또 다른 것은 로그 파일을 살펴 보는 것입니다. 내 디렉토리는 / var / log / 디렉토리에 있으며 mysql.log라고합니다. 당신은 다른 이름이나 다른 위치를 가질 수 있습니다. 더 많은 정보를 제공 할 수 있다면 더 나은 도움을 줄 수 있습니다.
라파엘 루티 게르

2
php.ini에는 "/var/mysql/mysql.sock"(정확한 3 곳)에 대한 참조가 있으며 "/tmp/mysql.sock"으로 변경해야합니다. 도움을 주셔서 감사합니다!
dcolumbus

8

IPv6을 사용하도록 설정했을 수 있습니다. 가능한 로컬 호스트가 ipv6 로컬 호스트로 해석되며 msql 구성에 정의되어 있지 않습니다.

ive는 또한 해당 사용자의 허용 된 서브넷에 '127.0.0.1'대신 'localhost'를 추가 해야하는 문제가 있었지만 왜 (IPV4를 사용하고 있었고 얼마 전에 있었는지) 이해할 수는 없지만 시도해 볼 가치가 있습니다.


명령 줄에서 'host localhost'가 :: 1과 127.0.0.1을 반환하는지 확인하여이를 확인할 수 있습니다. 그렇다면 / private / etc / hosts에서 :: 1 매핑을 제거하거나 IPv6 :: 1 주소와 127.0.0.1을 수신하도록 MySQL을 재구성 할 수 있습니다.
David North

Mac OS X에서 IPv6이 기본적으로 활성화되어있는 곳을 읽는 것을 기억합니다. ... 그렇습니까?
dcolumbus

ipv6는 요즘 거의 모든 최신 OS에서 사용 가능합니다. osx10.6에서는 im이며 기본적으로 사용 가능합니다.
실버 파이어

잘못된. 체크 아웃 - 로컬 호스트는 MySQL의 고객을위한 특별한 의미가 serverfault.com/a/295300/67675
poige

5

나에게 OSX의 내장 PHP는 homebrew의 mysql과 다른 유닉스 소켓을 사용하도록 구성되어 있습니다. 따라서 해당 소켓을 사용하는 localhost를 통해 연결할 수 없습니다.

PHP의 구성된 소켓 경로를 mysql이 실제로 사용하는 것을 가리키는 링크로 빠른 해킹으로 수정했습니다.

sudo ln -s /tmp/mysql.sock /var/mysql/mysql.sock

다음 진단 명령이 매우 유용했습니다.

php와 mysql이 사용하는 기본 소켓 경로를 확인하십시오 :

php -i | fgrep 'mysql.default_socket'
mysql -e 'show variables where variable_name = "socket"'

지정된 소켓을 사용하여 연결하십시오.

php -r 'var_dump(mysql_connect("localhost:/tmp/mysql.sock", "user", "pass"));'
mysql --socket=/tmp/mysql.sock

mysql 클라이언트가 연결하는 데 사용하는 소켓 종류를 결정하십시오.

lsof | egrep '^mysql .*(IPv|unix)'

2

확인할 수 mysql/conf/my.conf있는지 확인하기 위해 (디렉토리 구조는 거의 OSX에서 동일해야합니다) skip-networking주석입니까? 그렇다면 #라인 앞에 추가 하고 mysql-server를 다시 시작하십시오.

실제로 비슷한 문제가 발생했습니다 (OSx에는 없었지만). 그래도 가치가 있다고 생각했습니다.


1
왜 이것이 다운 보트를 받았습니까? 설명이 도움이 될 것입니다.
karllindmark

난 당신을 투표하지 않았지만 당신의 대답은 실제로 OP가 요구하는 것과 반대입니다. 그러나 나는 반대의 상황으로 어려움을 겪었 기 때문에 당신을지지했다. 그건 그렇고, 나는 이것을 my.conf를 통해 고칠 수는 없었다. "mysqlf --skip_networking = 0 ..."명령 줄에 입력해야합니다.
Jan Steinman

2

PHP는 여전히 기본 소켓 위치를 사용하려고합니다. MariaDB / MySQL 폴더/ var / lib / mysql 에서 다른 위치 로 이동 한 경우이 문제가 발생할 수 있습니다. 문제를 해결하려면 /etc/php.ini 파일 에서 새 소켓의 위치를 ​​정의해야 합니다.

mysqli.default_socket =/newDBLocation/mysql/mysql.sock

사용하는 드라이버에 따라 pdo_mysql.default_socket = 을 지정해야 할 수도 있습니다 .

현재 디렉토리를 확인하려면 mysql에서 다음 명령을 실행하십시오.

select @@datadir;

1

localhost가 /private/etc/hosts파일에 정의되어 있습니까?


127.0.0.1 localhost가 호스트 파일에 있습니다.
dcolumbus

4
/private? 전에 본 적이 없다
TheLQ

@ TheLQ : 그것은 Mac 일입니다. / etc에서 / private / etc 로의 심볼릭 링크 있지만 어떤 이유로 Apple은 일반적으로 "true"경로를 사용하도록
권장

1

테스트 상자에서 동일한 증상을 재현 할 수 있었으면 좋겠습니다.

MySQL에서 사용자는 두 부분 (이름과 호스트)으로 정의됩니다. 기본적으로 MySQL에는 3 명의 루트 사용자가 있습니다.

mysql> SELECT host,user,password FROM mysql.user WHERE user='root';
+-----------------------+------+-------------------------------------------+
| host                  | user | password                                  |
+-----------------------+------+-------------------------------------------+
| localhost             | root |                                           |
| localhost.localdomain | root |                                           |
| 127.0.0.1             | root | *PASSWORD_HASH_GOES_HERE                  |
+-----------------------+------+-------------------------------------------+

비밀번호 필드는 비어 있거나 (비밀번호 없음) 해시가 저장되어 있습니다. 하나의 특정 사용자에 대한 비밀번호를 설정하면 MySQL이 다른 사용자로 인식하므로 비밀번호가 모두 자동으로 업데이트되지는 않습니다.

예를 들면 다음과 같습니다.

mysql> set password for 'root'@'127.0.0.1' = password('Password');

암호를 업데이트 할 것입니다 'root'@'127.0.0.1',하지만 'root'@'localhost''root'@'localhost.localdomain'

skip_name_resolve변수를 살펴보십시오 .

mysql> show variables like 'skip_name_resolve';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| skip_name_resolve | ON    |
+-------------------+-------+
1 row in set (0.00 sec)

기본적으로는 skip_name_resolve이며 OFF모든 IP 주소를 호스트 이름으로 확인하려고합니다. 예를 들어으로 'root'@'127.0.0.1'연결하면 MySQL이 연결을로 변경합니다 'root'@'localhost'.

이 경우 ON, MySQL은보고 연결합니다 'root'@'127.0.0.1''root'@'localhost'별도의 사용자로. 그리고 설정 방법에 따라 다른 암호를 가질 수도 있고 없을 수도 있습니다.


먼저 암호의 차이점을 확인하십시오. mysql> SELECT host,user,password FROM mysql.user WHERE user='root';

있는 경우 수정하거나 계속 조사 할 수 있습니다.

그런 다음 확인합니다 skip_name_resolve. mysql> show variables like 'skip_name_resolve';

인 경우 필요하지 않은 경우 ON설정 위치 (예 /etc/my.cnf:)를 찾아 제거하십시오.

잘하면 이것은 당신을 도와줍니다!


1

나는이 문제를 겪고 있었고 그것을 알아낼 수 없었다. 나는 쓸모없는 모든 것을 시도했다.

정보가있는 / root /에 .netrc가 있음을 알았습니다.

나는 그것을 삭제하고 문제가 사라졌다.

문제없이 mysql -uroot -p를 사용하여 mysql에 로그인 할 수 있습니다.

나는 이것이 오래된 게시물이라는 것을 알고 있지만 이것이 누군가를 돕기를 바랍니다.


1

나를 위해 mysql.sock의 부모 디렉토리에서 공개적으로 읽을 수 있도록 권한을 변경하면 문제가 해결되었습니다.

chmod 755 /var/lib/mysql

1

CloudLinux와 함께 CageFS를 사용하는 사람들의 경우 :

/var/lib/mysqlMySQL 서버를 처음부터 다시 작성 했기 때문에 다시 만들었습니다 ...

cagefs에서 경로를 마운트 해제했습니다. 관련이 없다는 것을 알고 있지만 cPanel과 CloudLinux를 사용하고있었습니다. 소켓 연결이 작동하지 않는 이유를 확인할 수 없었으며 마침내 깨달았습니다.

추가 /var/lib/mysql/etc/cagefs/cagefs.mp (다음 단계가 진행 이미있는 경우) 및 실행

cagefsctl --remount-all

문제를 해결했다


1
세상에! 이것이 나를 위해 고쳐 준 것입니다! 이미 /etc/cagefs/cagefs.mp있지만 실행 중 이었습니다 cagefsctl --remount-all. 고마워요!
Alvaro Flaño Larrondo

0

내 생각에 private / etc / hosts에 정의해야합니다. 어쨌든 별명 인 127.0.0.1을 사용하십시오.


127.0.0.1 localhost가 호스트 파일에 있습니다.
dcolumbus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.