mysql普通用户本机无法登录的解决办法
Posted liuzz07
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql普通用户本机无法登录的解决办法相关的知识,希望对你有一定的参考价值。
背景
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的匹配逻辑是这样的:
- 匹配host,匹配成功(匹配到一条或多条)就进入下一步
- 匹配user,匹配到第一条后停止,进入下一步
- 有匹配验证密码,没有密码提示输入密码
这里需要注意:匿名用户的user为空(‘‘),是可以匹配所有字符的,所以只要有匿名用户存在,其余普通用户在本机是登录不上的!
我们以普通用户sweet和root用户为例分别模拟上述认证过程
sweet用户
- 匹配host=localhost,匹配到两条记录
| root | localhost | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
| | localhost | |
- 从以上两条记录中匹配user=sweet,匹配到一条记录(空字符可以匹配到所有字符)
| | localhost | |
- 匹配password,匹配失败,返回access denied
root用户
- 匹配host=localhost,匹配到两条记录
| root | localhost | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
| | localhost | |
- 从以上两条记录中匹配user=root,匹配到一条记录(root为非空,优先级高于空字符,匹配到一条就进入下一步)
| | localhost | |
- 匹配password,匹配成功,进入登录界面
补充:root用户可以登录的原因是mysql初始化时就在用户表里创建了一条root | localhost的记录,而root为非空,优先级高于空字符,所以先匹配到,因而roo用户可以正常登录
解决办法
删除匿名用户
查看用户表,找到匿名用户对应的记录
select user,host,password from mysql.user;
删除匿名用户
drop user ''@'localhost';
重启mysql服务
注意一定要重启服务才会生效!!!
linux下重启命令为:
systemctl stop mariadb
systemctl start mariadb
windows下重启命令为
net stop mysql
net start mysql
以上是关于mysql普通用户本机无法登录的解决办法的主要内容,如果未能解决你的问题,请参考以下文章
织梦dedecms使用Mysql8.0无法登录后台的解决办法