MySQL Study之--MySQL普通用户无法本地登陆
在安装完毕MySQL后,我们通常加入拥有对应权限的普通用户用来訪问数据库。在使用用户本地登录数据库的时候,常常会出现怎么登录也无法登录的情况,可是从其他的mysqlclient却能够登录。
故障现象:
[root@mysrv ~]# mysql -u root -poracle
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;
+-----------------------------------------------------------------------------------------------------+
| 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;
+-------+-----------+
| 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)
用户登陆:
ERROR 1045 (28000): Access denied for user 'rose'@'localhost' (using password: YES)
[root@mysrv ~]# mysql -u rose -p
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.
ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'prod'--
---在不用password的情况下能够登陆,但没有权限訪问,应该是匿名用户的身份 !
能够看到,我的数据库中有rose用户和匿名用户localhost;
mysql> show grants for rose;
+-----------------------------------------------------------------------------------------------------+
| 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用户登录。发现不用password能够登录。
[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()函数返回你在client登陆时指定的username和主机名。
CURRENT_USER()函数返回的是MySQL使用授权表中的哪个用户来认证你的登录请求。
这里发现,我使用'rose'@'localhost'这个账户登录数据库(由于在本地登陆时没指定主机。默认是以localhost登录),可是数据库使用的是''@'localhost'这个账户来进行登录认证。而''@'localhost'这个匿名用户是没有password的,因此我输入空password登录成功了。可是登录后,所相应的用户的匿名用户。
一般在MySQL在安装完成后,我们使用mysql_install_db这个脚本生成授权表,会默认创建''@'localhost'这个匿名用户。
正是由于这个匿名用户,影响了其它用户从本地登录的认证。
那么MySQL是怎样进行用户身份认证呢?
一、当用户从client请求登陆时,MySQL将授权表中的条目与client所提供的条目进行比較,包含用户的username,password和主机。授权表中的Host字段是能够使用通配符作为模式进行匹配的。如test.example.com, %.example.com, %.com和%都能够匹配test.example.com这个主机。
授权表中的User字段不同意使用模式匹配,可是能够有一个空字符的username代表匿名用户。而且空字符串能够匹配全部的username。就像通配符一样。
当user表中的Host和User有多个值能够匹配client提供的主机和username时,MySQL将user表读入内存,而且依照一定规则排序,依照排序规则读取到的第一个匹配clientusername和主机名的条目对client进行身份验证。
二、排序规则:对于Host字段,依照匹配的精确程度进行排序。越精确的排序越前,比如当匹配test.example.com这个主机时, %.example.com比%.com更精确,而test.example.com比%.example.com更精确。对于User字段,非空的字符串username比空字符串匹配的username排序更靠前。
User和Host字段都有多个匹配值,MySQL使用主机名排序最前的条目,在主机名字段同样时再选取username排序更前的条目。
因此,假设User和Host字段都有多个匹配值,主机名最精确匹配的条目被用户对用户进行认证。
了解了这个认证流程,就知道为什么server登录失败了。
使用GaMe在本机登录数据时,不指定-h參数默觉得localhost主机登录,而在MySQL中有两个匹配的条目:'rose'@'%' 和 ''@'localhost'
匿名用户可以匹配的原因上面说过,空字符串可以匹配全部的username,就像通配符一样。
依据MySQL认证时的排序规则,第一个条目的username排序更前。第二个条目的主机名更精确。排序更前。
而MySQL会优先使用主机名排序第一的条目进行身份认证。因此''@'localhost'被用户对client进行认证。
因此,仅仅有使用匿名用户的空password才干登录进数据库。
就会出现以下的情况了。
解决办法:删除匿名用户(只为了安全也有这个必要)
为什么root用户不会受影响,而仅仅有普通用户不能从本地登录?
由于mysql_install_db脚本会在授权表中生成'root'@'localhost'这个账户。
相同的。使用root登录MySQL 时,'root'@'localhost'和''@'localhost'都能匹配登录的账户,可是依据排序规则,主机名相同。而username非空字符串优先。因此'root'@'localhost'这个条目的排序更靠前。
使用root本地登录是不会被匿名用户遮盖。
Query OK, 0 rows affected (0.01 sec)
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 Study之--MySQL普通用户无法本地登陆的更多相关文章
- MySQL Study之--MySQL用户及权限管理
MySQL Study之--MySQL用户及权限管理 MySQLserver通过MySQL权限表来控制用户对数据库的訪问.MySQL权限表存放在mysql数据库里.由mysql_install ...
- MySQL Study之--MySQL schema_information数据库
MySQL Study之--MySQL schema_information数据库 information_schema数据库是在mysql的版本号5.0之后产生的,一个虚拟数据库,物理上 ...
- MySQL Study之--MySQL压力測试工具mysqlslap
MySQL Study之--MySQL压力測试工具mysqlslap 一.Mysqlslap介绍 mysqlslap是MySQL5.1之后自带的benchmark基准測试工具,类似Apache ...
- MySQL Study之--Mysql无法启动“mysql.host”
MySQL Study之--Mysql无法启动"mysql.host" 系统环境: 操作系统:RedHat EL55 DB Soft: Mysql 5.6.4-m7 通过源代码包 ...
- MySQL Study之--MySQL下图形工具的使用(MySQL Administrator)
MySQL Study之--MySQL下图形工具的使用(MySQL Administrator) 系统环境: 操作系统: Windows 7(64) 下载地址:http://www.soft ...
- MySQL Study之--MySQL体系结构深入解析
MySQL Study之--MySQL体系结构深入解析 MySQL体系架构 由连接池组件.管理服务和⼯工具组件.sql接口组件.查询分析器组件.优化器组件.缓冲组件.插件式存储引擎.物理⽂文件组成.m ...
- mysql创建新用户及新用户不能本地登陆的问题
最近在搭建hadoop集群,主节点上面安装的MySQL数据库,对着方面不熟悉,为hive.Ooize等服务统一使用的root账号和密码,为了安全一些库对于某些用户是不可见的,所以需要针对不同的服务设置 ...
- mac下mysql重置密码及使用用户和密码登陆
回车后 登录管理员权限 sudo su回车后输入以下命令来禁止mysql验证功能 ./mysqld_safe --skip-grant-tables &回车后mysql会自动重启(偏好设置中m ...
- MySQL普通用户无法本地登录的解决方法及MySQL的用户认证算法
在安装完成MySQL后,我们通常添加拥有相应权限的普通用户用来访问数据库.在使用普通用户本地登录数据库的时候,经常会出现怎么登录也无法登录的情况. 例如,我的MySQL中的用户为: mysql> ...
随机推荐
- Class类文件结构
平台无关性 Java是与平台无关的语言,这得益于Java源代码编译后生成的存储字节码的文件,即Class文件,以及Java虚拟机的实现.不仅使用Java编译器可以把Java代码编译成存储字节码的Cla ...
- .net 循环引用是否会造成内存泄漏
一直想做这么一个测试,人和手的测试.类型"人"有一个属性"手",需要"手"也可以读取"人"的数据.则"手&qu ...
- Eclipse启动都会Error when loading the SDK
http://jingyan.baidu.com/article/aa6a2c14fb54190d4c19c480.html
- SparkR初体验2.0
突然有个想法,R只能处理百万级别的数据,如果R能运行在Spark上多好!搜了下发现13年SparkR这个项目就启动了,感谢美帝! 1.你肯定得先装个spark吧.看这:Spark本地模式与Spark ...
- jquery学习心得:一个很好的css和js函数调用的例子
统一目录下的资源结构图: <html><head> <link rel="stylesheet" href="gallery.css&quo ...
- cat more less 命令
查看文件内容的几种常用的方法 1 在Linux系统中有三种命令可以用来查阅全部的文件,分别是cat.more和less命令.它们查阅文件的使用方法也比较简单都是 命令 文件名 ,但是三者又有着区别 ...
- ORACLE 数据库优化原则
ORACLE 数据库优化原则 一.SQL语句用大写的: 因为Oracle总是先解析SQL语句,把小写的字母转换成大写的再厉行. 二.避免在索引列上利用NOT等闲 我们要避免在索引列上利用NOT, NO ...
- 【转】【Python】Python中的__init__.py与模块导入(from import 找不到模块的问题)
python中的Module是比较重要的概念.常见的情况是,事先写好一个.py文 件,在另一个文件中需要import时,将事先写好的.py文件拷贝 到当前目录,或者是在sys.path中增加事先写好的 ...
- VC6下OpenGL 开发环境的构建外加一个简单的二维网络棋盘绘制示例
一.安装GLUT 工具包 GLUT 不是OpenGL 所必须的,但它会给我们的学习带来一定的方便,推荐安装. Windows 环境下的GLUT 本地下载地址:glut-install.zip(大小约为 ...
- (转)谈谈RTP传输中的负载类型和时间戳
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://ticktick.blog.51cto.com/823160/350142 最近被 ...