背景

mysql和mariadb的用户表里存在匿名用户时,普通用户出现无法登录的情况

## 分析
先查看下用户表
```sql
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为空的记录就是匿名用户的记录

<br>
普通用户为什么无法登录呢?因为匿名用户的主机名(host)是localhost,当我们在本机登录时,我们只会输入user,
```sql
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,匹配到一条记录(空字符可以匹配到所有字符)
```sql
| | localhost | |
```


- 匹配password,匹配失败,返回access denied


root用户

  • 匹配host=localhost,匹配到两条记录
| root | localhost        | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
| | localhost | |

- 从以上两条记录中匹配user=root,匹配到一条记录(root为非空,优先级高于空字符,匹配到一条就进入下一步)
```sql
| | localhost | |
```


- 匹配password,匹配成功,进入登录界面

补充:root用户可以登录的原因是mysql初始化时就在用户表里创建了一条root | localhost的记录,而root为非空,优先级高于空字符,所以先匹配到,因而roo用户可以正常登录

## 解决办法

删除匿名用户

### 查看用户表,找到匿名用户对应的记录
```sql
select user,host,password from mysql.user;


<br>
### 删除匿名用户 ```sql
drop user ''@'localhost';

重启mysql服务

注意一定要重启服务才会生效!!!

linux下重启命令为:

systemctl stop mariadb
systemctl start mariadb

windows下重启命令为

net stop mysql
net start mysql

mysql普通用户本机无法登录的解决办法的更多相关文章

  1. 异常详细信息: System.Data.SqlClient.SqlException: 用户 'NT AUTHORITY\IUSR' 登录失败解决办法

    最近在做.net项目,因为本人以前做java较多,所以对.net不熟悉,在项目完成后部署到IIS服务器上出现诸多问题,以上其中之一,若有时间,在更新其他问题的解决办法! 异常详细信息: System. ...

  2. 异常详细信息: System.Data.SqlClient.SqlException:用户 'IIS APPPOOL\DefaultAppPool' 登录失败解决办法

    1.安全性---登录名---新建登录名 2.常规----搜索 3.添加SERVICE用户-- 4.服务器角色---勾上sysadmin: IIS中: 应用程序池---对应的程序池上右键---高级设置 ...

  3. 用户 'IIS APPPOOL\DefaultAppPool' 登录失败解决办法

    法一:将iis站点的应用程序池的用户改为本地用户,如果所示: 方法二: 1.打开sql server  management studio安全性->登录名->右击新建登录名->常规- ...

  4. redhat图形界面启动后出现桌面但是没有登录界面解决办法

    redhat图形界面启动后出现桌面但是没有登录界面解决办法 2014年07月11日 10:50:10 阅读数:7931 redhat Linux一直用着好好地,今天打开只有图像界面背景,没有出现登陆界 ...

  5. 卸载MySQL以及重装卡到Start Services的解决办法(亲测有效,刚重装成功)

    卸载MySQL以及重装卡到Start Services的解决办法 重装系统永远是个好办法,但是对于我们程序员来说只要一想到电脑上的环境变量和其他的配置就蔫了.所以这一条就当作是废话吧. 一般来说装My ...

  6. 普通用户不能使用sudo命令的解决办法

    普通用户不能使用sudo命令的解决办法 https://www.cnblogs.com/fasthorse/p/5949946.html 1. 切换到root用户下:su – root 2. 给/et ...

  7. VMware虚拟机中的CentOS7安装Nginx后本机无法访问的解决办法

    VMware虚拟机中的CentOS7安装Nginx后本机无法访问的解决办法 在linux上安装nginx 请参考:Linux Centos7 安装 nginx 在虚拟机centos7上安装nginx之 ...

  8. MySQL Shell无法拉起MGR集群解决办法

    MySQL Shell无法拉起MGR集群解决办法 用MySQL Shell要重新拉起一个MGR集群时,可能会提示下面的错误信息: Dba.rebootClusterFromCompleteOutage ...

  9. SQLServer中用户 'sa' 登录失败解决办法

    今天下午,很奇怪的网站突然就打不开了,报错如下: “/”应用程序中的服务器错误. 用户 'sa' 登录失败. 说明: 执行当前 Web 请求期间,出现未处理的异常.请检查堆栈跟踪信息,以了解有关该错误 ...

随机推荐

  1. layui中弹出层的两种表达方式

    方式一: 定义js中定义html变量 方式二: 设置div :hidden:hidden 布局 数据表格自适应大小: 代码: <style> .btn-container { margin ...

  2. PHP实现表单提交发送邮件

    只需要三个文件就可以了: 注意: 文件自命名需修改表单提交url,包含的类文件名: HTML表单文件: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML ...

  3. LeetCode算法题-Find Mode in Binary Search Tree(Java实现)

    这是悦乐书的第246次更新,第259篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第113题(顺位题号是501).给定具有重复项的二叉搜索树(BST),找到给定BST中的 ...

  4. Kafka leader副本选举与消息丢失场景讨论

    如果某个broker挂了,leader副本在该broker上的分区就要重新进行leader选举.来简要描述下leader选举的过程 1.4.1 KafkaController会监听ZooKeeper的 ...

  5. yum makecache

    $ yum makecache 就是把服务器的包信息下载到本地电脑缓存起来,makecache建立一个缓存,以后用install时就在缓存中搜索,提高了速度.配合yum -C search xxx使用 ...

  6. Resolving Issues of "Library Cache Pin" or "Cursor Pin S wait on X" (Doc ID 1476663.1)

    Doc ID 1476663.1) To Bottom In this Document   Purpose   Troubleshooting Steps   Brief Definition:   ...

  7. 领域驱动设计系列文章(2)——浅析VO、DTO、DO、PO的概念、区别和用处

    本篇文章主要讨论一下我们经常会用到的一些对象:VO.DTO.DO和PO. 由于不同的项目和开发人员有不同的命名习惯,这里我首先对上述的概念进行一个简单描述,名字只是个标识,我们重点关注其概念: 概念: ...

  8. 区块链代币(Token)笔记 — — 术语

    前言 接触区块链和数字货币差不多有大半年时间,一直在赶项目进度,现在有空整理补习一下相关的知识,只谈代币不谈区块链

  9. C#中字节数组(byte[])和字符串相互转换

    转换过程主要使用到System.Text.Encoding命名空间下的类 1. 字符串转换成字节数组byte[]: string str = "This is test string&quo ...

  10. python scapy dns 包字段解析

    qr:   0表示查询报文,1表示响应报文opcode: 通常值为0(标准查询),其他值为1(反向查询)和2(服务器状态请求).aa: 表示授权回答(authoritative answer)tc: ...