我们重启了一台运行mysql的机器,我们遇到了一些奇怪的问题。来自其他机器的大多数进程都可以毫无问题地连接到它们。如果我们明确地通过环回地址连接,我们也可以在本地连接。
这有效:
mysql -hlocalhost -utest_user -psecret_password
当我们运行命令时:
mysql -h192.168.1.10 -utest_user -psecret_password
在本地机器上我们收到以下错误:
ERROR 1045 (28000): Access denied for user `test_user`@`SERVER_123`
我们有以下用户:
test_user@localhost
test_user@%
我们已通过添加以下用户修复了此问题:
test_user@SERVER_123
其中SERVER_123是机器的非限定名称。 我们不知道为什么我们必须添加额外的用户,我们不想保留它,但我们也不知道为什么添加它会解决问题。
为什么从本地计算机通过IP(即mysql -ha.bcd -utest_user -ppsswd)连接无法与test_user@%
用户匹配,但是匹配test_user@machine_name
,其中machine_name是不合格的机器的名称?
这是用户表
anonymous % anonymous SERVER_123 anonymous localhost test_user_2 % test_user_3 % root ::1 root 127.0.0.1 root SERVER_123 root localhost
注意:找出问题所在。以某种方式重启机器必须改变192.168.1.10如何解决,以便它解析为SERVER_123。然后导致登录从192.168.1.10匹配test_user
@ SERVER_123
。
答案 0 :(得分:5)
我将查看MySQL文档的这一部分中的排序规则:https://dev.mysql.com/doc/refman/5.7/en/connection-access.html
传入连接的客户端主机名和用户名可以匹配用户表中的多行。
可能是您的用户被识别为具有不同密码的另一个用户。您的用户表中还有哪些其他条目?
根据新信息进行更新:您的登录信息被识别为“@”%'用户。此用户具有不同的凭据,或者缺少必要的权限。
答案 1 :(得分:3)
您可以按照MySQL文档here进行操作,该文档讨论了DNS查找优化以及如何实现这一过程的过程。从文档中指出一点如下:
MySQL服务器在内存中维护一个主机缓存,其中包含有关客户端的信息:IP地址,主机名和错误信息。服务器将此缓存用于非本地TCP连接。它不使用缓存来建立使用环回接口地址(127.0.0.1或:: 1)建立的TCP连接,也不使用使用Unix套接字文件,命名管道或共享内存建立的连接。
还有一点可以帮助您解决这个问题,即引入以下参数:
skip-name-resolve
您可以按照此处的文章提示MySQL根据IP地址或主机名进行身份验证 - 文章链接here。
默认情况下,MySQL根据IP地址或主机名授予用户身份验证。当存在来自特定主机的连接时,MySQL会执行反向DNS查找并比较主机名和IP地址。
希望这有助于回答你的问题!
答案 2 :(得分:3)
首先请记住,只有 127.0.0.1,:: 1,localhost等... 被视为环回地址 192.168.1.10或SERVER_123 ,因为您可能接受。
是的! 192.168.1.10 应匹配通配符主机%,但遗憾的是,在test_user_2和test_user_3旁边,我没有在提供的用户表数据中看到 test_user 条目。
此外,在Linux上,您可以使用/etc/hosts
文件将IP地址映射到主机名
答案 3 :(得分:1)
发现了这个问题。有一个匿名用户在特定用户之前匹配。我不确定重启过程中发生了什么导致反向解析改变,但我们有一个用户'''SERVER_123',它必须已经开始匹配。删除匿名用户解决了问题,我们不再需要拥有test_user@SERVER_123
的权限。