MySQL:能够连接到localhost但无法连接到127.0.0.1

7

我猜我可能忘了某些显而易见的东西,但似乎无法使用MySQL连接127.0.0.1。 通过localhost连接可以工作。

MySQL / Linux版本:Server version: 10.0.31-MariaDB-0ubuntu0.16.04.2 Ubuntu 16.04

这个是有效的:

$ mysql -h localhost -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 71982
Server version: 10.0.31-MariaDB-0ubuntu0.16.04.2 Ubuntu 16.04

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

这种方法是行不通的:

$ mysql -h 127.0.0.1 -u root
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

据我所知,MySQL正在监听 127.0.0.1:3306

$ netstat -plnt
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      1841/mysqld 

我甚至可以使用 Telnet 连接到 3306 端口:

$ telnet 127.0.0.1 3306
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
j
5.5.5-10.0.31-MariaDB-0ubuntu0.16.04.2TGYk-=,d5-??wz}'Hr*s+u24mysql_native_password

以防万一,我也为主机127.0.0.1创建了一个具有授权选项的用户:

mysql > CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY '<redacted>';
mysql > GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION;

以下是关于用户的一些信息(由@brian-ecker建议查询):

MariaDB [(none)]> SELECT User, Host, plugin FROM mysql.user;
+------------------+-----------+-------------+
| User             | Host      | plugin      |
+------------------+-----------+-------------+
| root             | localhost | unix_socket |
| root             | 127.0.0.1 |             |
+------------------+-----------+-------------+

我也尝试创建一个使用unix_socket标识的root用户,但没有帮助:

MariaDB [(none)]> CREATE USER 'root'@'127.0.0.1' IDENTIFIED VIA unix_socket;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION;
MariaDB [(none)]> SELECT User, Host, plugin FROM mysql.user;
+------------------+-----------+-------------+
| User             | Host      | plugin      |
+------------------+-----------+-------------+
| root             | localhost | unix_socket |
| root             | 127.0.0.1 | unix_socket |
+------------------+-----------+-------------+

你有什么建议,为什么我可以通过“localhost”连接,但无法通过“127.0.0.1”连接?

你尝试过使用密码吗?mysql -h 127.0.0.1 -u root -p。当你使用 localhost 进行连接时,MySQL 尝试使用套接字进行连接,但是当你连接到 127.0.0.1 时,它使用 tcp 进行连接,而且权限甚至可以针对 localhost127.0.0.1 分别设置,所以也许 127.0.0.1 设置了密码,但是 localhost 不需要密码? - Brian Ecker
是的,我有:mysql -h 127.0.0.1 -u root -p 返回:输入密码: 当我输入密码后,我看到这个错误信息:ERROR 1698 (28000): 用户'root'@'localhost'被拒绝访问 - siment
你可以发布以下查询结果吗:SELECT User、Host、plugin FROM mysql.user; - Brian Ecker
当然。我已经编辑了原帖并附上了查询结果。 - siment
3个回答

10
通过将以下内容添加到MySQL配置文件中解决了问题:
skip-name-resolve       = 1

来自MySQL文档

如果它是OFF,mysqld在检查客户端连接时解析主机名。 如果它是ON,则mysqld仅使用IP地址; 在这种情况下,授权表中的所有Host列值都必须是IP地址或localhost。


请记住,当需要时您可能会错过FLUSH PRIVILEGES,或者主机localhost是除“正常”IP主机(如127.0.0.1)之外的特殊分离登录。或者两者的组合。更改此服务器设置很可能是不必要的,但也许需要重新启动/刷新权限。 - Progman
这对我也解决了问题 - MariaDB 10.1.26(Debian Stretch)。最令人恼火的行为。 - David Goodwin

2

我在Debian 9上使用MariaDB 10.1.26遇到了这个问题。如果你想使用TCP,在127.0.0.1或其他地方连接,使用root作为用户名根本不起作用

最终,我创建了另一个具有全局权限的用户 - 没有问题。


有找到解决方案吗?我遇到了你的情况:在MariaDB 10.1.31/Debian 9上,我可以使用localhost(socket)连接root,无论是否使用密码(后者使用了unix_socket插件)。但是我无法作为root@127.0.0.1连接。我也启用了skip-name-resolve,但没有成功(至少我现在确定我正在使用TCP而不是socket)。创建另一个用户可以正常工作。 - Marco Pallante
没有,从未找到解决方案。 - Simon Fredsted
1
看起来Debian团队重新编译了MariaDB的源代码,禁用了这个功能,但是我在文档中找不到任何信息。我现在没有时间,但是使用官方的MariaDB软件包而不是Debian的软件包进行尝试会很好,或者尝试与Debian维护人员联系。 - Marco Pallante

1
也许你想在本地主机上使用Unix套接字。但是,如果不使用“unix_socket”插件,则再次连接到127.0.0.1就可以了。例如,执行以下操作:
UPDATE user SET plugin = '' 
WHERE user = 'root' AND host = 'localhost';
FLUSH PRIVILEGES;

这种解决方案的缺点是您不能再从系统的 root 帐户使用 MySQL root 登录;即无需输入密码即可访问 MySQL root,例如 mysql -u root -h localhost 将不再起作用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接