解决mysql 本地用户无法登陆

2023-10-14 15:32

本文主要是介绍解决mysql 本地用户无法登陆,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

 

    在安装完成MySQL后,我们通常添加拥有相应权限的普通用户用来访问数据库。在使用用户本地登录数据库的时候,经常会出现怎么登录也无法登录的情况,但是从其它的mysql客户端却可以登录。

故障现象:

故障现象:
[root@mysrv ~]# mysql -u root -poracle

1
2
3
4
5
6
7
8
Welcome to the MySQL monitor.  Commands end  with  or  \g.
Your MySQL connection id is  10
Server version:  5.6. 25 -enterprise-commercial-advanced-log MySQL Enterprise Server - Advanced Edition (Commercial)
Copyright (c)  2000 2012 , Oracle  and / or  its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation  and / or  its
affiliates. Other names may be trademarks of their respective
owners.
Type  'help;'  or  '\h'  for  help. Type  '\c'  to clear the current input statement.

mysql> select version()\g
+-------------------------------------------+
| version()                                 |
+-------------------------------------------+
| 5.6.25-enterprise-commercial-advanced-log |
+-------------------------------------------+
1 row in set (0.00 sec)

创建用户并授权
mysql> grant all on prod.* to 'rose'@'%' identified by 'rose';
Query OK, 0 rows affected (0.01 sec)

mysql> show grants for rose;

1
2
3
4
5
6
7
+-----------------------------------------------------------------------------------------------------+
| Grants  for  rose@%                                                                                   |
+-----------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO  'rose' @ '%'  IDENTIFIED BY PASSWORD  '*86F57026C60B8CE1038EFB3B9383EC573979A7BD'  |
| GRANT ALL PRIVILEGES ON `prod`.* TO  'rose' @ '%'                                                       |
+-----------------------------------------------------------------------------------------------------+
2  rows  in  set ( 0.00  sec)


mysql> select user,host from user;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
+-------+-----------+
| user  | host      |
+-------+-----------+
| jerry | %         |
| rose  | %         |
| tom   | %         |
| tom1  | %         |
| tom2  | %         |
| root  |  127.0. 0.1  |
| root  | :: 1        |
|       | localhost |
| jerry | localhost |
| root  | localhost |
| scott | localhost |
| tom   | localhost |
|       | mysrv     |
| root  | mysrv     |
+-------+-----------+
14  rows  in  set ( 0.00  sec)

用户登陆:

[root@mysrv ~]# mysql -u rose -prose
ERROR 1045 (28000): Access denied for user 'rose'@'localhost' (using password: YES)          

---登陆失败!


[root@mysrv ~]# mysql -u rose -p      

1
2
3
4
5
6
7
8
9
Enter password: 
Welcome to the MySQL monitor.  Commands end  with  or  \g.
Your MySQL connection id is  22
Server version:  5.6. 25 -enterprise-commercial-advanced-log MySQL Enterprise Server - Advanced Edition (Commercial)
Copyright (c)  2000 2012 , Oracle  and / or  its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation  and / or  its
affiliates. Other names may be trademarks of their respective
owners.
Type  'help;'  or  '\h'  for  help. Type  '\c'  to clear the current input statement.

 

--在不用密码的情况下可以登陆,但没有权限访问,应该是匿名用户的身份 !

 

远程登陆:

远程登陆:

Center

 

---远程登陆成功!

 

一、登录后查看mysql.user表的情况

可以看到,我的数据库中有rose用户和匿名用户localhost;
mysql> show grants for rose;

1
2
3
4
5
6
7
8
9
10
11
12
13
+-----------------------------------------------------------------------------------------------------+
| Grants  for  rose@%                                                                                   |
+-----------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO  'rose' @ '%'  IDENTIFIED BY PASSWORD  '*86F57026C60B8CE1038EFB3B9383EC573979A7BD'  |
| GRANT ALL PRIVILEGES ON `prod`.* TO  'rose' @ '%'                                                       |
+-----------------------------------------------------------------------------------------------------+
2  rows  in  set ( 0.00  sec)

二、在本机用rose用户登录,发现不用密码可以登录;
[root@mysql01 ~]# mysql -urose -p
Enter password: 

mysql> select user(),current_user();
+----------------+----------------+
| user()         | current_user() |
+----------------+----------------+
| rose@localhost | @localhost     |
+----------------+----------------+
1 row in set (0.00 sec)

登录成功了,使用USER()和CURRENT_USER()两个函数查看所使用的用户。
USER()函数返回你在客户端登陆时指定的用户名和主机名。
CURRENT_USER()函数返回的是MySQL使用授权表中的哪个用户来认证你的登录请求。
这里发现,我使用'rose'@'localhost'这个账户登录数据库(因为在本地登陆时没指定主机,默认是以localhost登录),但是数据库使用的是''@'localhost'这个账户来进行登录认证,而''@'localhost'这个匿名用户是没有密码的,因此我输入空密码登录成功了。但是登录后,所对应的用户的匿名用户。

一般在MySQL在安装完毕后,我们使用mysql_install_db这个脚本生成授权表,会默认创建''@'localhost'这个匿名用户。正是因为这个匿名用户,影响了其他用户从本地登录的认证。
那么MySQL是如何进行用户身份认证呢?

        一、当用户从客户端请求登陆时,MySQL将授权表中的条目与客户端所提供的条目进行比较,包括用户的用户名,密码和主机。授权表中的Host字段是可以使用通配符作为模式进行匹配的,如test.example.com, %.example.com, %.com和%都可以匹配test.example.com这个主机。授权表中的User字段不允许使用模式匹配,但是可以有一个空字符的用户名代表匿名用户,并且空字符串可以匹配所有的用户名,就像通配符一样。 当user表中的Host和User有多个值可以匹配客户端提供的主机和用户名时,MySQL将user表读入内存,并且按照一定规则排序,按照排序规则读取到的第一个匹配客户端用户名和主机名的条目对客户端进行身份验证。

       二、排序规则:对于Host字段,按照匹配的精确程度进行排序,越精确的排序越前,例如当匹配test.example.com这个主机时, %.example.com比%.com更精确,而test.example.com比%.example.com更精确。对于User字段,非空的字符串用户名比空字符串匹配的用户名排序更靠前。 User和Host字段都有多个匹配值,MySQL使用主机名排序最前的条目,在主机名字段相同时再选取用户名排序更前的条目。因此,如果User和Host字段都有多个匹配值,主机名最精确匹配的条目被用户对用户进行认证。

了解了这个认证流程,就知道为什么server登录失败了。
     使用GaMe在本机登录数据时,不指定-h参数默认为localhost主机登录,而在MySQL中有两个匹配的条目:'rose'@'%'  和 ''@'localhost'
匿名用户能够匹配的原因上面说过,空字符串可以匹配所有的用户名,就像通配符一样。
根据MySQL认证时的排序规则,第一个条目的用户名排序更前,第二个条目的主机名更精确,排序更前。
而MySQL会优先使用主机名排序第一的条目进行身份认证,因此''@'localhost'被用户对客户端进行认证。因此,只有使用匿名用户的空密码才能登录进数据库。就会出现下面的情况了。
    解决的方法:删除匿名用户(仅仅为了安全也有这个必要)
为什么root用户不会受影响,而只有普通用户不能从本地登录?
因为mysql_install_db脚本会在授权表中生成'root'@'localhost'这个账户。同样的,使用root登录MySQL 时,'root'@'localhost'和''@'localhost'都能匹配登录的账户,但是根据排序规则,主机名相同,而用户名非空字符串优先,因此'root'@'localhost'这个条目的排序更靠前。使用root本地登录是不会被匿名用户遮盖。

 

解决方法:

 

授权rose用户本地登陆:

mysql> grant all on prod.* to 'rose'@'localhost' identified by 'rose';
Query OK, 0 rows affected (0.01 sec)

 

从本地登陆:

[root@mysrv ~]# mysql -u rose -prose

1
2
3
4
5
6
7
8
Welcome to the MySQL monitor.  Commands end  with  or  \g.
Your MySQL connection id is  26
Server version:  5.6. 25 -enterprise-commercial-advanced-log MySQL Enterprise Server - Advanced Edition (Commercial)
Copyright (c)  2000 2012 , Oracle  and / or  its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation  and / or  its
affiliates. Other names may be trademarks of their respective
owners.
Type  'help;'  or  '\h'  for  help. Type  '\c'  to clear the current input statement.

mysql> use prod;
Database changed
mysql> show tables;
+----------------+
| Tables_in_prod |
+----------------+
| t1             |
+----------------+
1 row in set (0.00 sec)

mysql> select * from t1;

+------+-------+
| id   | name  |
+------+-------+
|   10 | tom   |
|   20 | jerry |
|   30 | rose  |
+------+-------+
3 rows in set (0.00 sec)

---登陆成功!

 

这篇关于解决mysql 本地用户无法登陆的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/211427

相关文章

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

如何去写一手好SQL

MySQL性能 最大数据量 抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。 《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置、数据表设计、索引优化。500万这个值仅供参考,并非铁律。 博主曾经操作过超过4亿行数据

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

三国地理揭秘:为何北伐之路如此艰难,为何诸葛亮无法攻克陇右小城?

俗话说:天时不如地利,不是随便说说,诸葛亮六出祁山,连关中陇右的几座小城都攻不下来,行军山高路险,无法携带和建造攻城器械,是最难的,所以在汉中,无论从哪一方进攻,防守方都是一夫当关,万夫莫开;再加上千里运粮,根本不需要打,司马懿只需要坚守城池拼消耗就能不战而屈人之兵。 另一边,洛阳的虎牢关,一旦突破,洛阳就无险可守,这样的进军路线,才是顺势而为的用兵之道。 读历史的时候我们常常看到某一方势

如何解决线上平台抽佣高 线下门店客流少的痛点!

目前,许多传统零售店铺正遭遇客源下降的难题。尽管广告推广能带来一定的客流,但其费用昂贵。鉴于此,众多零售商纷纷选择加入像美团、饿了么和抖音这样的大型在线平台,但这些平台的高佣金率导致了利润的大幅缩水。在这样的市场环境下,商家之间的合作网络逐渐成为一种有效的解决方案,通过资源和客户基础的共享,实现共同的利益增长。 以最近在上海兴起的一个跨行业合作平台为例,该平台融合了环保消费积分系统,在短

MySQL高性能优化规范

前言:      笔者最近上班途中突然想丰富下自己的数据库优化技能。于是在查阅了多篇文章后,总结出了这篇! 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份

[MySQL表的增删改查-进阶]

🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 💻💻💻数据库约束 🔭🔭🔭约束类型 not null: 指示某列不能存储 NULL 值unique: 保证某列的每行必须有唯一的值default: 规定没有给列赋值时的默认值.primary key:

MySQL-CRUD入门1

文章目录 认识配置文件client节点mysql节点mysqld节点 数据的添加(Create)添加一行数据添加多行数据两种添加数据的效率对比 数据的查询(Retrieve)全列查询指定列查询查询中带有表达式关于字面量关于as重命名 临时表引入distinct去重order by 排序关于NULL 认识配置文件 在我们的MySQL服务安装好了之后, 会有一个配置文件, 也就