การเชื่อมต่อ MySQL ทำงานกับ localhost ได้ แต่ไม่ใช่กับ 127.0.0.1


9

ฉันมีการติดตั้ง 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 จะเงียบอย่างสมบูรณ์แม้จะมีการเปิดใช้งานการบันทึก


เหตุผลที่ฉันได้รับข้อผิดพลาดจากแอ็พพลิเคชัน Java ของฉันคือไดรเวอร์ JDBC ไม่ได้แก้ไขlocalhostกับซ็อกเก็ต แต่ใช้เครือข่าย อย่างที่คาดหวังไว้ตามธรรมชาติ ... แต่คำถามดั้งเดิมยังคงอยู่
Philipp Jardas

คำตอบ:


1

ผู้กระทำผิดดูเหมือนจะเป็นhosts.denyและซึ่งเริ่มต้นโดยมีโหมดไฟล์ของhosts.allow 0x600MySQL ไม่สามารถอ่านเพื่อพิจารณาว่าจะอนุญาตการเชื่อมต่อหรือไม่ ฉันเปลี่ยนโหมดไฟล์เป็น0x644และตอนนี้ทุกอย่างทำงานได้อย่างราบรื่น ฉันยังสงสัยว่าทำไม MySQL ไม่บันทึกข้อผิดพลาดใด ๆ ...


0

คำถามนี้จะคล้ายกับMySQL ไม่สามารถเชื่อมต่อผ่าน "localhost" เพียง 127.0.0.1 ตามที่ระบุไว้ที่นี่คุณอาจตั้งค่า MySQL ให้ฟังซ็อกเก็ตเครือข่ายเท่านั้นและไม่เชื่อมต่อกับซ็อกเก็ตระบบไฟล์


คำตอบที่คุณโพสต์ตอบคำถามที่ตรงข้ามกับฉัน และฉันมีทั้งเครือข่ายและซ็อกเก็ตไฟล์ที่ใช้งานอยู่
Philipp Jardas

ใช่คุณถูก. ขออภัยคำถามของคุณผิด
Nebu

0

คุณอาจเปิดใช้งาน IPv6, localhost ที่เป็นไปได้มากจะแก้ไขเป็น ipv6 localhost ที่ไม่ได้กำหนดไว้ในการกำหนดค่า mysql ของคุณ

คุณสามารถตรวจสอบสิ่งนี้ได้โดยดูว่า 'host localhost' ที่บรรทัดคำสั่งส่งคืน :: 1 หรือ 127.0.0.1 ถ้าเป็นเช่นนั้นคุณสามารถลบการแมป :: 1 หรือกำหนดค่า MySQL ใหม่เพื่อฟังบนที่อยู่ IPv6 :: 1 และ 127.0.0.1


localhost แท้จริงมีมติให้ทั้งสองและ127.0.0.1 ::1ฉันพยายามผูก MySQL กับ::1ไม่มีการเปลี่ยนแปลง ฉันได้ลองผูก MySQL กับ0.0.0.0และ::ไม่แตกต่างกัน
Philipp Jardas

0

ฉันเพิ่งติดตั้งใช้งานไม่ได้ซึ่งลูกค้าส่วนใหญ่ใช้ Java เป็นหลัก เครื่องมือ CLI จะทำงานได้ แต่ไคลเอนต์ Java ทั้งหมดหยุดทำงานในแทร็กของพวกเขา ในกรณีของฉันผู้ร้ายคือการตั้งค่าใหม่ที่ฉันได้เปิดใช้งาน "เพื่อปรับปรุงประสิทธิภาพ":

skip-name-resolve       = on

เมื่อคุณทำเช่นนี้, MySQL ดูเถิดใช้อีกต่อไป rDNS เพื่อแก้ไข127.0.0.1-> localhostและตั้งแต่ฉันทั้งหมดGRANTs สำหรับผู้ใช้ที่ไม่ได้รับอนุญาตให้เชื่อมต่อจากโฮสต์user@localhost127.0.0.1

มีวิธีแก้ไขสองวิธีสำหรับปัญหานี้โดยเฉพาะ:

  1. ปิดการใช้งาน skip-name-resolve
  2. ขยายGRANTs ของคุณเพื่อรวม127.0.0.1เช่นเดียวกับlocalhost
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.