Kết nối MySQL hoạt động với localhost nhưng không phải với 127.0.0.1


9

Tôi có một bản cài đặt MySQL khá chuẩn trên Debian Wheezy ( apt-get install mysql-server mysql-client) mà tôi đã thực hiện thành công rất nhiều lần trước đây.

Khi tôi cố gắng kết nối thông qua localhost, mọi thứ hoạt động. Nhưng kết nối qua 127.0.0.1cho một thông báo lỗi:

$ 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

Khi tôi cố gắng kết nối từ một ứng dụng Java, tôi gặp lỗi tương tự, mặc dù tôi đang sử dụng localhostlàm tên máy chủ:

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.

Tôi thường nhận được ngoại lệ này khi máy chủ MySQL đã đóng kết nối không hoạt động hoặc đã được khởi động lại. Tuy nhiên, điều này bây giờ xảy ra khi khởi động ứng dụng khi ứng dụng cố gắng kết nối lần đầu tiên.

Buồn cười là điều này đã làm việc chỉ một vài giờ trước đó. Thật không may, tôi không thể nhớ đã thay đổi bất cứ điều gì trên máy chủ. :-(

Vì vậy, thành thật mà nói, loại bài đăng này chứa hai câu hỏi: Tại sao tôi không thể kết nối qua 127.0.0.1? Và tại sao các ứng dụng của tôi không thể kết nối thông qua localhostmặc dù tôi có thể thông qua CLI?

# 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"

BIÊN TẬP

Tôi đã cố gắng ràng buộc máy chủ 0.0.0.0::không có kết quả.

Máy chủ hỗ trợ IPv6 và được cấu hình phù hợp:

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

Vấn đề tương tự như được mô tả ở trên xảy ra khi tôi cố gắng kết nối ::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

CHỈNH SỬA 2

Kết nối qua telnetcho không nhiều thông tin nhưng cho thấy kết nối bị đóng ngay lập tức.

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

Nhân tiện, các logfile MySQL hoàn toàn im lặng ngay cả khi đăng nhập được kích hoạt.


Lý do tại sao tôi gặp lỗi từ ứng dụng Java của mình là trình điều khiển JDBC không giải quyết localhostđược ổ cắm mà sử dụng mạng. Như người ta thường mong đợi ... Nhưng câu hỏi ban đầu vẫn còn.
Philipp Jardas

Câu trả lời:


1

Thủ phạm dường như hosts.denyhosts.allowtheo mặc định có chế độ tập tin là 0x600. MySQL không thể đọc chúng để xác định xem có cho phép kết nối hay không. Tôi đã thay đổi chế độ tập tin thành 0x644, và bây giờ mọi thứ đang chạy trơn tru. Tôi vẫn tự hỏi tại sao MySQL không ghi lại bất kỳ lỗi nào ...


0

Câu hỏi này rất giống với MySQL không thể kết nối thông qua "localhost", chỉ 127.0.0.1 . Như đã nêu ở đây, có lẽ bạn đã cấu hình MySQL để chỉ nghe ổ cắm mạng và không nghe ổ cắm hệ thống tệp.


Câu trả lời bạn đăng câu trả lời một câu hỏi hoàn toàn ngược lại với tôi. Và tôi có cả ổ cắm mạng và tập tin hoạt động.
Philipp Jardas

Có bạn đúng. Xin lỗi đọc sai câu hỏi của bạn.
Nebu

0

Bạn có thể đã bật IPv6, localhost rất có thể của nó sẽ phân giải thành ipv6 localhost, không được xác định trong cấu hình mysql của bạn.

Bạn có thể kiểm tra điều này bằng cách xem liệu 'host localhost' tại dòng lệnh trả về :: 1 cũng như 127.0.0.1. Nếu vậy, bạn có thể xóa ánh xạ :: 1 hoặc cấu hình lại MySQL để nghe trên địa chỉ IPv6 :: 1 cũng như 127.0.0.1


Thật vậy, localhost giải quyết cả hai 127.0.0.1::1. Tôi đã thử ràng buộc MySQL với ::1, không thay đổi. Tôi thậm chí đã thử ràng buộc MySQL 0.0.0.0::, không có sự khác biệt.
Philipp Jardas

0

Gần đây tôi đã phá vỡ một cài đặt hoạt động trong đó hầu hết các máy khách đều dựa trên Java. Các công cụ CLI sẽ hoạt động, nhưng tất cả các máy khách Java đều ngừng hoạt động. Trong trường hợp của tôi, thủ phạm là một cài đặt mới mà tôi đã kích hoạt "để cải thiện hiệu suất":

skip-name-resolve       = on

Khi bạn thực hiện việc này, MySQL lo sử dụng rDNS lâu hơn để giải quyết 127.0.0.1-> localhostvà, vì tất cả những gì tôi GRANTlàm user@localhost, người dùng không được phép kết nối từ máy chủ 127.0.0.1.

Hai giải pháp tồn tại cho vấn đề cụ thể này:

  1. Vô hiệu hóa skip-name-resolve
  2. Mở rộng GRANTs của bạn để bao gồm 127.0.0.1cũng nhưlocalhost
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.