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.