Koneksi MySQL berfungsi dengan localhost tetapi tidak dengan 127.0.0.1


9

Saya memiliki instalasi MySQL cukup standar pada Debian Wheezy ( apt-get install mysql-server mysql-client) yang telah saya lakukan berhasil banyak kali sebelumnya.

Ketika saya mencoba terhubung melalui localhost, semuanya berfungsi. Tetapi menghubungkan via 127.0.0.1memberikan pesan kesalahan:

$ 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

Ketika saya mencoba untuk terhubung dari aplikasi Java, saya mendapatkan kesalahan yang sama, meskipun saya menggunakan localhostsebagai nama host:

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.

Saya biasanya mendapatkan pengecualian ini ketika server MySQL telah menutup koneksi siaga atau telah dimulai kembali. Namun, ini sekarang terjadi pada startup aplikasi ketika aplikasi mencoba untuk terhubung untuk pertama kalinya.

Cukup lucu ini melakukan pekerjaan hanya beberapa jam sebelum. Sayangnya saya tidak dapat mengingat telah mengubah apa pun di server. :-(

Jadi jujur ​​saja, posting semacam ini mengandung dua pertanyaan: Mengapa saya tidak dapat terhubung melalui 127.0.0.1? Dan mengapa aplikasi saya tidak dapat terhubung localhostmeskipun saya bisa melalui 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"

EDIT

Saya mencoba mengikat server ke 0.0.0.0dan ::, tidak berhasil.

Server mendukung IPv6 dan dikonfigurasi sesuai:

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

Masalah yang sama seperti yang dijelaskan di atas terjadi ketika saya mencoba terhubung ::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

EDIT 2

Menghubungkan via telnettidak memberikan banyak informasi tetapi menunjukkan bahwa koneksi ditutup segera.

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

By the way, file log MySQL benar-benar diam bahkan dengan logging diaktifkan.


Alasan mengapa saya mendapatkan kesalahan dari aplikasi Java saya adalah bahwa driver JDBC tidak menyelesaikan localhostke soket tetapi menggunakan jaringan. Seperti yang diharapkan secara alami ... Tetapi pertanyaan aslinya tetap ada.
Philipp Jardas

Jawaban:


1

Pelakunya tampaknya hosts.denydan hosts.allowyang secara default memiliki mode file 0x600. MySQL tidak dapat membacanya untuk menentukan apakah akan mengizinkan koneksi. Saya mengubah mode file ke 0x644, dan sekarang semuanya berjalan dengan lancar. Saya masih bertanya-tanya mengapa MySQL tidak mencatat kesalahan ...



0

Anda mungkin memiliki IPv6 yang diaktifkan, localhost yang sangat mungkin memutuskan ke localhost ipv6, yang tidak didefinisikan dalam konfigurasi mysql Anda.

Anda dapat memeriksa ini dengan melihat apakah 'host localhost' di baris perintah mengembalikan :: 1 serta 127.0.0.1. Jika demikian, Anda dapat menghapus pemetaan :: 1 atau mengkonfigurasi ulang MySQL untuk mendengarkan alamat IPv6 :: 1 dan juga 127.0.0.1


Memang localhost memutuskan untuk keduanya 127.0.0.1dan ::1. Saya mencoba mengikat MySQL ::1, tidak ada perubahan. Saya bahkan mencoba mengikat MySQL ke 0.0.0.0dan ::, tidak ada perbedaan.
Philipp Jardas

0

Saya baru-baru ini merusak instalasi yang berfungsi di mana sebagian besar klien berbasis Java. Alat CLI akan bekerja, tetapi klien Java semua berhenti mati di jalur mereka. Dalam kasus saya, pelakunya adalah pengaturan baru yang saya aktifkan "untuk meningkatkan kinerja":

skip-name-resolve       = on

Ketika Anda melakukan ini, lo MySQL lebih lama menggunakan rDNS untuk menyelesaikan 127.0.0.1-> localhostdan, karena semua milik saya GRANTuntuk user@localhost, pengguna tidak diizinkan untuk terhubung dari host 127.0.0.1.

Ada dua solusi untuk masalah khusus ini:

  1. Nonaktifkan skip-name-resolve
  2. Perluas Anda GRANTuntuk memasukkan 127.0.0.1jugalocalhost
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.