MySQL连接适用于localhost,但不适用于127.0.0.1


9

我在Debian Wheezy(apt-get install mysql-server mysql-client)上有一个非常标准的MySQL安装,我已经成功完成了很多次。

当我尝试通过连接时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.

顺便说一句,即使启用了日志记录,MySQL日志文件也是完全安静的。


我从Java应用程序中收到错误的原因是JDBC驱动程序无法解析localhost到套接字,而是使用网络。正如人们自然期望的那样...但是最初的问题仍然存在。
菲利普·贾达斯

Answers:


1

罪魁祸首似乎是hosts.denyhosts.allow默认情况下文件模式为0x600。MySQL无法读取它们来确定是否允许连接。我将文件模式更改为0x644,现在一切运行顺利。我仍然想知道为什么MySQL没有记录任何错误...



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::,没有区别。
菲利普·贾达斯

0

我最近中断了一个可以正常运行的安装,其中大多数客户端都基于Java。CLI工具可以使用,但是Java客户端都停止了前进。就我而言,罪魁祸首是我启用了“提高性能”的新设置:

skip-name-resolve       = on

当您执行此操作时,MySQL lo不再使用rDNS来解析127.0.0.1->,localhost并且由于我所有的GRANTs都用于user@localhost,因此不允许用户从host连接127.0.0.1

针对此特定问题,存在两种解决方案:

  1. 禁用 skip-name-resolve
  2. 扩展您GRANT的,使其包含127.0.0.1以及localhost
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.