MySQL bağlantısı localhost ile çalışıyor ancak 127.0.0.1 ile çalışmıyor


9

Ben daha apt-get install mysql-server mysql-clientönce birçok kez başarılı bir şekilde yapmış Debian Wheezy ( ) oldukça standart bir MySQL kurulum var.

Bağlanmaya çalıştığımda localhosther şey çalışıyor. Ancak üzerinden bağlanmak 127.0.0.1bir hata mesajı verir:

$ 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

Bir Java uygulamasından bağlanmaya çalıştığımda localhosthostname olarak kullanmama rağmen benzer hatalar alıyorum :

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 sunucusu boşta olan bir bağlantıyı kapattığında veya yeniden başlatıldığında genellikle bu istisnayı alıyorum. Ancak, bu uygulama ilk kez bağlanmaya çalıştığında uygulama başlangıcında olur.

Komik yeterince bu yaptığımız sadece birkaç saat önce işi. Ne yazık ki sunucuda bir şey değiştiğini hatırlayamıyorum. :-(

Dürüst olmak gerekirse, bu yazı türünde iki soru var: Neden bağlantı kuramıyorum 127.0.0.1? Ve localhostCLI aracılığıyla yapabilsem de uygulamalarım neden bağlanamıyor ?

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

DÜZENLE

Sunucuyu bağlamayı denedim 0.0.0.0ve ::boşuna.

Sunucu IPv6'yı destekler ve buna göre yapılandırılır:

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

Bağlanmaya çalıştığımda yukarıda açıklananla aynı sorun ortaya çıkıyor ::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

DÜZENLEME 2

Üzerinden bağlanmak telnetçok fazla bilgi vermez, ancak bağlantının hemen kapatıldığını gösterir.

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

Bu arada, MySQL günlük dosyaları günlük etkinleştirilmiş olsa bile tamamen sessizdir.


Benim Java uygulaması hataları olsun nedeni JDBC sürücüsü yapmasıdır değil çözmek localhostsoket ancak kullanımları ağ için. Doğal olarak beklendiği gibi ... Ama asıl soru var.
Philipp Jardas

Yanıtlar:


1

Suçlu gibi görünüyordu hosts.denyve hosts.allowvarsayılan olarak bir dosya moduna sahip 0x600. MySQL, bağlantılara izin verilip verilmeyeceğini belirlemek için bunları okuyamadı. Dosya modlarını değiştirdim 0x644ve şimdi her şey düzgün çalışıyor. Hala neden MySQL'in herhangi bir hata kaydetmediğini merak ediyorum ...



0

IPv6'yı etkinleştirmiş olabilirsiniz, mümkün olan yerel ana bilgisayarı mysql yapılandırmanızda tanımlanmayan ipv6 yerel ana bilgisayarına çözümlenir.

Komut satırında 'host localhost' komutunun :: 1 yanı sıra 127.0.0.1 döndürüp döndürmediğini kontrol ederek bunu kontrol edebilirsiniz. Öyleyse, :: 1 eşlemesini kaldırabilir veya MyvQL'i IPv6 :: 1 adresini ve 127.0.0.1'i dinleyecek şekilde yeniden yapılandırabilirsiniz


Aslında localhost hem 127.0.0.1ve 'ye çözümlenir ::1. MySQL bağlamayı denedim ::1, değişiklik yok. Hatta MySQL'i bağlamayı denedim 0.0.0.0ve ::hiçbir fark yok.
Philipp Jardas

0

Son zamanlarda çoğu istemcinin Java tabanlı olduğu bir çalışan yüklemeyi bozdum. CLI araçları işe yarayacaktır, ancak Java istemcilerinin tümü parçalarında durdu. Benim durumumda suçlu, "performansı iyileştirmek" için etkinleştirdiğim yeni bir ayardı:

skip-name-resolve       = on

Bunu yaptığınızda, MySQL lo - artık çözmek için rDNS kullanır 127.0.0.1-> localhostve, tüm benim GRANTiçin user@localhostolduğundan, kullanıcının ana bilgisayardan bağlanmasına izin verilmez 127.0.0.1.

Bu sorun için iki çözüm vardır:

  1. Devre Dışı skip-name-resolve
  2. Bunlarınızı GRANTiçerecek 127.0.0.1şekilde genişletinlocalhost
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.