MySQL创建的用户无法从本地登陆

前几天发现了一个有趣的事情,两台类似的mysql数据库,都有dong这个用户。在本地连接时,一个连接正常,一个连接失败。

两台的mysql版本都是5.6 。下面是两台mysql上的所有账户:

服务器1:

 

服务器2:

 

这两台服务器上都有dong用户,且都可以从任何地方登陆(host列的值是%)。但我在服务器2上却登陆失败了!

 

              服务器1登陆成功

 

              服务器2 登陆失败

查阅官方文档后,发现了一些信息。

 

有时候用户的连接信息可能匹配到了user表的多行记录。那到底用哪一行来认证呢?

mysql会把user表加载到内存,并对所有的行进行排序。当有用户连接时,就从第一行开始匹配,并使用第一个匹配到的行来认证。排序是按照主机名的明确性来排序,谁更明确,谁就排在前面。主机名明确性相同就按照用户名的明确性继续排序。(localhost比%明确,%代表可以从任意地方登陆,localhost代表只能从本地登陆)

比如:服务器1 的user表排序后的顺序可能是

 root  localhost  

 rep   %       

 dong  %       

 root   %  

服务器2 的user表排序后的顺序可能是

root    localhost      

root    localhost.localdomain

root    127.0.0.1

root    ::1

         localhost

         localhost.localdomain

dong    %

在服务器1上登陆时,匹配到了1行,也就是(dong %),登陆没有问题。在服务器2上登陆时,匹配到了3行,也就是('' localhost),('' localhost.localdomain),(dong %) 。但是第一个匹配到的是('' localhost),所以会用这一行来认证。至于登陆失败是因为('' localhost)这个用户是没有密码的。如果使用 mysql -udong 就可以登陆了,并且会以''@localhost这个用户来登陆。

 

查看一下登陆的用户

 

???哪里来的dong@localhost 用户?查看一下这个用户的权限

 

验证了我前面说的是用’’@localhost这个用户登陆的。

 

一般的我们会删掉服务器2上用户名为空的用户,这样登陆就不会出现上面的问题。或者也可以再建一个同名的用户,不过登陆的host是localhost 这样在本地也可以登陆了。

posted @ 2018-10-25 15:28  AYard  阅读(2115)  评论(0编辑  收藏