时间:2021-07-01 10:21:17 帮助过:13人阅读
mysql和mariadb的用户表里存在匿名用户时,普通用户出现无法登录的情况
先查看下用户表
mysql> select user, host, password from mysql.user;
+------+------------------+-------------------------------------------+
| User | Host | Password |
+------+------------------+-------------------------------------------+
| root | localhost | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
| root | 127.0.0.1 | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
| sweet| % | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
| root | % | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
| | localhost | |
+------+------------------+-------------------------------------------+
最后一条user为空的记录就是匿名用户的记录
普通用户为什么无法登录呢?因为匿名用户的主机名(host)是localhost,当我们在本机登录时,我们只会输入user,
mysql -usweet -p
所以mysql默认host为localhost,由于mysql的规则是host优先级比user高,所以会先匹配host,mysql就会去用户表里取host=localhost的数据进行认证,所以普通用户(比如sweet)的记录当然就被过滤掉了,因而也就登录不上了,这里有读者可能就会问:%不是可以匹配所有的ip吗,那么应该也可以匹配localhost啊?是的,%可以匹配localhost,但是这里涉及到一个优先级的问题,匹配到了localhost就不会继续匹配%
mysql -usweet-p
当我们输入以上指令登录时,mysql的匹配逻辑是这样的:
这里需要注意:匿名用户的user为空(‘‘),是可以匹配所有字符的,所以只要有匿名用户存在,其余普通用户在本机是登录不上的!
我们以普通用户sweet和root用户为例分别模拟上述认证过程
sweet用户
| root | localhost | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
| | localhost | |
| | localhost | |
root用户
| root | localhost | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
| | localhost | |
| | localhost | |
补充:root用户可以登录的原因是mysql初始化时就在用户表里创建了一条root | localhost的记录,而root为非空,优先级高于空字符,所以先匹配到,因而roo用户可以正常登录
删除匿名用户
select user,host,password from mysql.user;
drop user ''@'localhost';
注意一定要重启服务才会生效!!!
linux下重启命令为:
systemctl stop mariadb
systemctl start mariadb
windows下重启命令为
net stop mysql
net start mysql
mysql普通用户本机无法登录的解决办法
标签:读者 第一条 access user star 返回 存在 top 查看