首页 > 代码库 > Mysql账户问题

Mysql账户问题

3台主机web01,web02,web03,做主从,其中有一台怎么都连不上master。


在主机web02的mysql数据库中建一账户(rep),web01登录失败,web03可以正常登录。

建立账户grant replication slave on *.* to rep@‘192.168.190.%‘ identified by ‘rep111‘;

a.在web03中登录成功

技术分享

b.在web01中登录失败

技术分享

但是,在web01中不用户密码可以登录成功。

技术分享

查阅文档得知可以使用USER()和CURRENT_USER()两个函数查看所使用的用户

USER()函数返回你在客户端登陆时指定的用户名和主机名。

CURRENT_USER()函数返回的是MySQL使用授权表中的哪个用户来认证你的登录请求。

那就分别在web01和web03登录后查看。

web01

技术分享

web03

技术分享

通过以上两张图可以知道。web01是通过空账户登录的,这也就解释了为什么不用密码可以登录,但为什么用了密码反而不能登录呢??


二、这可能就要了解MySQL是如何进行用户身份认证的。

a、当用户从客户端请求登陆时,MySQL将授权表中的条目与客户端所提供的条目进行比较,包括用户的用户名,密码和主机。授权表中的Host字段是可以使用通配符作为模式进行匹配的,如test.example.com, %.example.com, %.com和%都可以匹配test.example.com这个主机。授权表中的User字段不允许使用模式匹配,但是可以有一个空字符的用户名代表匿名用户,并且空字符串可以匹配所有的用户名,就像通配符一样。 当user表中的Host和User有多个值可以匹配客户端提供的主机和用户名时,MySQL将user表读入内存,并且按照一定规则排序,按照排序规则读取到的第一个匹配客户端用户名和主机名的条目对客户端进行身份验证。

b、排序规则:对于Host字段,按照匹配的精确程度进行排序,越精确的排序越前,例如当匹配test.example.com这个主机时, %.example.com比%.com更精确,而test.example.com比%.example.com更精确。对于User字段,非空的字符串用户名比空字符串匹配的用户名排序更靠前。 User和Host字段都有多个匹配值,MySQL使用主机名排序最前的条目,在主机名字段相同时再选取用户名排序更前的条目。因此,如果User和Host字段都有多个匹配值,主机名最精确匹配的条目被用户对用户进行认证。


那我们来看一下web02上面的主机,账户,信息。

技术分享

通过MySQL用户身份认证的规则,我们得出,web01登录采用的是第1条规则,而不知道我们自认为的第2条。这也同样解释了为什么不用密码就可以登录成功的道理了。


三、解决的方法:删除匿名用户

1、使用root权限登录

2、mysql> select host,user,password from mysql.user;

3、mysql> delete from mysql.user where user=‘‘;

4、mysql> flush privileges;

技术分享


有人可以要问为什么root好像没有这种情况,那是因为

因为mysql_install_db脚本会在授权表中生成‘root‘@‘localhost‘这个账户。同样的,使用root登录MySQL 时,‘root‘@‘localhost‘和‘‘@‘localhost‘都能匹配登录的账户,但是根据排序规则,主机名相同,而用户名非空字符串优先,因此‘root‘@‘localhost‘这个条目的排序更靠前。使用root本地登录是不会被匿名用户遮盖。也许还有人要问你在web02中为什么会有web01的匿名账户呢,后来仔细想了想,原来web02是由web01虚机机复制过来的。


本文出自 “59090939” 博客,请务必保留此出处http://59090939.blog.51cto.com/6338052/1858567

Mysql账户问题