ฉันมีการติดตั้ง MySQL ที่ค่อนข้างมาตรฐานบน Debian Wheezy ( apt-get install mysql-server mysql-client
) ซึ่งฉันเคยทำมาแล้วหลายครั้ง
เมื่อฉันพยายามเชื่อมต่อผ่าน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
? และทำไมแอปพลิเคชันของฉันไม่สามารถเชื่อมต่อผ่านlocalhost
แม้ว่าฉันสามารถผ่าน 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"
แก้ไข
ฉันพยายามผูกเซิร์ฟเวอร์กับ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.
โดยวิธีการที่ logfiles MySQL จะเงียบอย่างสมบูรณ์แม้จะมีการเปิดใช้งานการบันทึก
localhost
กับซ็อกเก็ต แต่ใช้เครือข่าย อย่างที่คาดหวังไว้ตามธรรมชาติ ... แต่คำถามดั้งเดิมยังคงอยู่