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的匹配逻辑是这样的:

  1. 匹配host,匹配成功(匹配到一条或多条)就进入下一步
  2. 匹配user,匹配到第一条后停止,进入下一步
  3. 有匹配验证密码,没有密码提示输入密码

这里需要注意:匿名用户的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普通用户本机无法登录的解决办法的主要内容,如果未能解决你的问题,请参考以下文章

Mysql忘记用户密码的解决办法

织梦dedecms使用Mysql8.0无法登录后台的解决办法

织梦dedecms使用Mysql8.0无法登录后台的解决办法

linux 本地无法登录 远程可以登陆的解决办法

MySQL Study之--MySQL普通用户无法本地登陆

连接MySql的时候报1130的错误解决办法