前几天发现了一个有趣的事情,两台类似的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 这样在本地也可以登陆了。