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.1
cho 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 localhost
là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 localhost
mặ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
và ::
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 telnet
cho 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.
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.