mysql mariadb 创建mysql mariadb用户,登录报错

mysql mariadb 创建energy普通用户,登录mysql报错 :access denied

GRANT REPLICATION CLIENT,PROCESS,SELECT ON *.* TO 'mysqld_exporter'@'%' identified by '123';

解决办法:

  1. 登录mysql 查看用户表
mysql -uroot -pPote123
select user,host,password from mysql.user;

mysql mariadb 创建mysql mariadb用户,登录报错_第1张图片
发现有两条用户为空的记录

  1. 删除匿名用户
drop user ''@'localhost';
drop user ''@'gxkt-app2';
quit
systectl restart mariadb

登录成功

  1. 分析理解

mysql默认host为localhost,由于mysql的规则是host优先级比user高,所以会先匹配host,mysql就会去用户表里取 host=localhost的数据进行认证,所以普通用户energy的记录当然就被过滤掉了,因而也就登录不上了。
那么有人会问%不是可以匹配所有的ip吗,那么应该也可以匹配localhost啊?是的,%可以匹配localhost,但是这里涉及到一个优先级的问题,匹配到了localhost就不会继续匹配%

mysql -uroot -pPote123

登录mysql,mysql的匹配逻辑是这样的:
(1) 匹配host,匹配成功(匹配到一条或多条)就进入下一步
(2) 匹配user,匹配到第一条后停止,进入下一步
(3) 有匹配验证密码,没有密码提示输入密码
匿名用户的user为空(‘’),是可以匹配所有字符的,所以只要有匿名用户存在,其余普通用户在本机是登录不上的。

  • 使用普通用户登录匹配过程
mysql -uenergy -pPote123

| root   | localhost | *588C4F8219256889231F450E881100ED8F2D8D6C |
|        |  localhost | 

(1)匹配host,匹配到以上两条记录host=localhost
(2)匹配user,匹配到energy,匹配到一条记录空(空字符可以匹配所有的字符)
(3)匹配password ,匹配失败,返回access denied

  • 使用root用户登录匹配过程
mysql -uenergy -pPote123

(1)匹配host,匹配到以上两条记录host=localhost
(2)匹配user,匹配到root,匹配到一条记录空(空字符可以匹配所有的字符)
(3)匹配password ,匹配成功。

你可能感兴趣的:(数据库,mysql,mariadb,数据库)