我在 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 日志文件也是完全无声的。
答案1
罪魁祸首似乎是hosts.deny
和hosts.allow
,默认情况下,它们的文件模式为0x600
。MySQL 无法读取它们以确定是否允许连接。我将文件模式更改为0x644
,现在一切都运行顺利。我仍然想知道为什么 MySQL 没有记录任何错误...
答案2
我最近弄坏了一个正在运行的安装,其中大多数客户端都是基于 Java 的。CLI 工具可以工作,但 Java 客户端全都停止运行。就我而言,罪魁祸首是我启用的一项“以提高性能”的新设置:
skip-name-resolve = on
当您执行此操作时,MySQL lo 不再使用 rDNS 来解析127.0.0.1
-> localhost
,并且由于我的所有GRANT
s 都是针对user@localhost
,因此不允许用户从主机 进行连接127.0.0.1
。
对于这个特定问题,有两种解决方案:
- 禁用
skip-name-resolve
- 扩大你的
GRANT
s 以127.0.0.1
包括localhost
答案3
这个问题与MySQL 无法通过“localhost”连接,只能通过 127.0.0.1。正如这里所述,您可能将 MySQL 配置为仅监听网络套接字,而不监听文件系统套接字。
答案4
它对我有用Linux的.编辑文件 -/etc/mysql/mysql.conf.d/mysqld.cnf 像这样 ->绑定地址 = 0.0.0.0