MySQL 연결은 localhost와 작동하지만 127.0.0.1과는 작동하지 않습니다 말해서,이 게시물에는 두 가지 질문이 있습니다. 왜

데비안 위지 (Debian Wheezy apt-get install mysql-server mysql-client) 에 꽤 표준 MySQL 설치를 해봤는데, 그 전에도 여러 번 성공적으로 해냈습니다.

를 통해 연결하려고하면 localhost모든 것이 작동합니다. 그러나 통해 연결 127.0.0.1하면 오류 메시지가 나타납니다.

$ mysql -h localhost -P 3306 -u xxx -p
-- works

$ mysql -h 127.0.0.1 -P 3306 -u xxx -p
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0

Java 응용 프로그램에서 연결하려고 localhost하면 호스트 이름으로 사용 하고 있지만 비슷한 오류가 발생 합니다.

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure. The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.

MySQL 서버가 유휴 연결을 닫았거나 다시 시작되면 일반적 으로이 예외가 발생합니다. 그러나 이제는 응용 프로그램을 처음 연결하려고 할 때 응용 프로그램을 시작할 때 발생합니다.

재미는 충분이 했던 몇 시간 전에 일을. 불행히도 나는 서버에서 아무것도 바꾸지 않았다는 것을 기억할 수 없다. 🙁

솔직히 말해서,이 게시물에는 두 가지 질문이 있습니다. 왜 연결할 수 127.0.0.1없습니까? localhostCLI 를 통해 할 수 있는데 왜 애플리케이션을 통해 연결할 수 없습니까?

# mysqld -V
mysqld  Ver 5.5.37-0+wheezy1-log for debian-linux-gnu on x86_64 ((Debian))

# mysql -V
mysql  Ver 14.14 Distrib 5.5.37, for debian-linux-gnu (x86_64) using readline 6.2

# grep bind /etc/mysql/my.cnf
bind-address = 127.0.0.1

# grep socket /etc/mysql/my.cnf
socket = /var/run/mysqld/mysqld.sock

# ping localhost
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_req=1 ttl=64 time=0.022 ms

# grep localhost /etc/hosts
127.0.0.1 localhost
::1     ip6-localhost ip6-loopback

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere             tcp

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

# netstat -ln | grep 3306
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN

tomcat # grep mysql conf/server.xml
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/dbname"

편집하다

나는에 서버를 결합 시도 0.0.0.0하고 ::아무 소용.

서버는 IPv6을 지원하며 그에 따라 구성됩니다.

# host localhost
localhost has address 127.0.0.1
localhost has IPv6 address ::1

에 연결하려고 할 때 위에서 설명한 것과 동일한 문제가 발생합니다 ::1.

# ping6 ::1
64 bytes from ::1: icmp_seq=1 ttl=64 time=0.020 ms

# ping6 localhost
64 bytes from ip6-localhost: icmp_seq=1 ttl=64 time=0.018 ms

편집 2

연결 telnet은 많은 정보 를 제공하지 않지만 연결이 즉시 닫 혔음을 표시합니다.

# telnet localhost 3306
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.

그건 그렇고, MySQL 로그 파일은 로깅이 활성화되어 있어도 완전히 침묵합니다.



답변

범인은 것 같았다 hosts.deny하고 hosts.allow있는 기본적으로의 파일 모드를 가지고 0x600. MySQL은 연결 허용 여부를 결정하기 위해 읽을 수 없습니다. 파일 모드를로 변경했으며 0x644이제 모든 것이 원활하게 실행되고 있습니다. MySQL이 왜 오류를 기록하지 않았는지 궁금합니다.


답변

이 질문은 MySQL이 “localhost”를 통해 연결할 수없고 127.0.0.1 과 매우 유사 합니다 . 여기에 언급 된 것처럼 파일 시스템 소켓이 아닌 네트워크 소켓 만 수신하도록 MySQL을 구성했을 것입니다.


답변

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

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


답변

최근에 대부분의 클라이언트가 Java 기반 인 설치가 중단되었습니다. CLI 도구는 작동하지만 Java 클라이언트는 모두 추적이 중지되었습니다. 필자의 경우 범인은 “성능 향상”을 위해 활성화 한 새로운 설정이었습니다.

skip-name-resolve       = on

이렇게하면 MySQL은 더 이상 rDNS를 사용하여 문제를 해결하고 127.0.0.1-> localhost모든 것을 GRANT위한 것이므로 user@localhost사용자는 host에서 연결할 수 없습니다 127.0.0.1.

이 특정 문제에 대한 두 가지 해결책이 있습니다.

  1. 비활성화 skip-name-resolve
  2. GRANT포함하고 포함하도록 127.0.0.1을 확장하십시오localhost

답변