您的位置:首页 > 数据库 > MySQL

mysql新建用户无法登录解决方案

2016-01-04 17:47 706 查看
原文转自:

http://www.cnblogs.com/linuxnote/p/3780244.html?utm_source=tuicool&utm_medium=referral

http://www.tuicool.com/articles/BZbEreU

非常感谢上面两位的分享总结。

许多新手,新建帐号后登录,发现即使密码输对了也无法登录,一直报错 。无论如何一直被拒绝。

如下:

ERROR 1045(28000):Access denied for user root@localhost (using password :NO)

解决方案总结如下:

方案一:删除mysql数据库user表中的匿名用户(user为空字符串的用户为匿名用户)

mysql> delete from user where user='';


方案二:root帐号匿名登录,并update无法登录的帐号的密码

(1) 停用mysql服务:
service mysqld stop 或者/etc/rc.d/init.d/mysqld stop


(2)输入命令:mysqld_safe –user=mysql –skip-grant-tables –skip-networking &

[root@service /]# mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
[1] 27455
[root@service /]# 160104 13:24:23 mysqld_safe Logging to '/var/lib/mysql/service.err'.
160104 13:24:23 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql


(3)输入命令:mysql -u root -p

[root@service /]# mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
[2] 27588
[root@service /]# 160104 13:27:29 mysqld_safe Logging to '/var/lib/mysql/service.err'.
160104 13:27:30 mysqld_safe A mysqld process already exists
mysql -u root -p
Enter password:


(4)无需输入密码,直接点击回车键,登录。

(5)使用mysql数据库:
mysql> use mysql;

Database changed


- 更新刚才登录报错的帐号的密码:

mysql> update user set password =PASSWORD('newPassword') where='newUser';


- 刷新权限:
mysql> flush privileges;


- 退出:
mysql> quit


如果使用其中一种方案,无法解决问题,那就两个方案联合起来一起使用。

下面详细介绍下解决思路。

在安装完成MySQL后,我们通常添加拥有相应权限的普通用户用来访问数据库。

例如,我的MySQL中的用户为:

mysql> SELECT User, Host, Password FROM mysql.user;
+------+------------------+-------------------------------------------+
| User | Host             | Password                                  |
+------+------------------+-------------------------------------------+
| root | localhost        | *1277D7238CD54A118C48B8DD228CABBF89502878 |
| root | 127.0.0.1        | *1277D7238CD54A118C48B8DD228CABBF89502878 |
| jing | %                | *1277D7238CD54A118C48B8DD228CABBF89502878 |
|      | localhost        |                                           |


可以看到,我的数据库中有root用户,jing 用户和匿名用户,jing 用户的主机使用%代表所有主机。

匿名用户的帐号和密码都为空

在本机使用jing账户登录数据库:

[root@liao ~]# mysql -ujing  -p'jing'
ERROR 1045 (28000): Access denied for user 'jing '@'localhost' (using password: YES)


结果是无论如何都提示登录被拒绝。

再次使用jing账户登录数据库,这次使用空密码尝试

[root@liao ~]# mysql -
bf35
uGaMe -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 59
Server version: 5.5.21-log Source distribution

Copyright (c) 2000, 2011, 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>


登录成功了,使用USER()和CURRENT_USER()两个函数查看所使用的用户

USER()函数返回你在客户端登陆时指定的用户名和主机名。

CURRENT_USER()函数返回的是MySQL使用授权表中的哪个用户来认证你的登录请求。

mysql> SELECT USER(), CURRENT_USER();
+----------------+----------------+
| USER()         | CURRENT_USER() |
+----------------+----------------+
| jing@localhost | @localhost     |
+----------------+----------------+
1 row in set (0.00 sec)


这里发现,我使用’jing’@’localhost’这个账户登录数据库(因为在本地登陆时没指定主机,默认是以localhost登录),但是数据库使用的是”@’localhost’这个账户来进行登录认证,而”@’localhost’这个匿名用户是没有密码的,因此我输入空密码登录成功了。但是登录后,所对应的用户的匿名用户。

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


那么MySQL是如何进行用户身份认证呢?

通过Google查的资料,总结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字段都有多个匹配值,主机名最精确匹配的条目被用户对用户进行认证。

了解了这个认证流程,就知道为什么jing登录失败了。

数据时,不指定-h参数默认为localhost主机登录,而在MySQL中有两个匹配的条目:

‘jing’@’%’

”@’localhost’

匿名用户能够匹配的原因上面说过, 空字符串可以匹配所有的用户名,就像通配符一样。

根据MySQL认证时的排序规则,第一个条目的用户名排序更前,第二个条目的主机名更精确,排序更前.

而MySQL会优先使用主机名排序第一的条目进行身份认证,因此”@’localhost’被用户对客户端进行认证。因此,只有使用匿名用户的空密码才能登录进数据库。就会出现上面的情况了。

解决的方法:删除匿名用户(仅仅为了安全也有这个必要)

为什么root用户不会受影响,而只有普通用户不能从本地登录?

因为mysql_install_db脚本会在授权表中生成’root’@’localhost’这个账户。同样的,使用root登录MySQL时,’root’@’localhost’和”@’localhost’都能匹配登录的账户,但是根据排序规则,主机名相同,而用户名非空字符串优先,因此’root’@’localhost’这个条目的排序更靠前。使用root本地登录是不会被匿名用户遮盖。

以上问题一模块,摘抄至:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: