首先让我提一下,我已经看了很多建议的问题,但没有找到相关的答案。这就是我正在做的。

我连接到Amazon EC2实例。我可以用这个命令登录MySQL根目录:

mysql -u root -p

然后我用host %创建了一个新的用户帐单

CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';

授予用户bill的所有权限:

grant all privileges on *.* to 'bill'@'%' with grant option;

然后我退出root用户,尝试用bill登录:

mysql -u bill -p

输入正确的密码并得到以下错误:

错误1045(28000):用户“账单”@“localhost”(使用密码:YES)的访问被拒绝


当前回答

对我来说,这个问题是由MySQL 5.7.2的一个新特性引起的:如果用户的插件字段为空,用户条目将被忽略。

设置为mysql_native_password以重新启用它们:

UPDATE user SET plugin='mysql_native_password' WHERE user='foo';
FLUSH PRIVILEGES;

请参阅MySQL 5.7.2的发布说明,在«Authentication notes»下。

由于某些原因(可能是因为我在4.1之前的密码散列被删除了),mysql_upgrade脚本没有设置默认的插件值。

我是通过注意/var/log/mysql/error.log中的以下警告消息发现的:

[警告]用户条目“foo”@“%”的插件值为空。该用户将被忽略,任何人都不能再使用该用户登录。

我把这个答案贴在这里,也许是为了让别人不用像我一样花那么多荒谬的时间来研究这个问题。

其他回答

在Windows上,解决方法如下:

错误1045(28000):拒绝访问用户'root'@'localhost'(使用密码:NO)

从控制面板卸载mysql 删除C:\Program Files,C:\Program Files (x86)和C:\ProgramData目录下的MySql文件夹 安装mysql

在我的案例中,一个相关的问题是试图连接使用:

mysql -u mike -p mypass

空格显然是允许在-u #uname#之间,但不允许在-p和#password#之间

因此需要:

mysql -u mike -pmypass

否则,在空格之间-p mpass mysql以' mpass '作为数据库名

您可能有一个匿名用户“@'localhost'或“@'127.0.0.1'”。

根据手册:

当可能有多个匹配时,服务器必须确定其中的哪一个 使用它们。它解决这个问题如下:(…) 当客户端尝试连接时,服务器会检查mysql表的[行。用户]。 服务器使用与客户端主机名和用户名匹配的第一行。 (…) 服务器使用排序规则首先对具有最特定的Host值的行进行排序。 字面主机名[如'localhost']和IP地址是最具体的。

因此,当从本地主机连接时,这样的匿名用户将“屏蔽”任何其他用户,如“[any_username]”@“%”。

'bill'@'localhost'不匹配'bill'@'%',但会匹配(例如)“@事先“localhost”。

推荐的解决方案是删除这个匿名用户(这通常是一件好事)。


下面的编辑大多与主要问题无关。这些只是为了回答本帖其他评论中提出的一些问题。

编辑1

通过套接字验证为'bill'@'%'。


    root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass --socket=/tmp/mysql-5.5.sock
    Welcome to the MySQL monitor (...)
    
    mysql> SELECT user, host FROM mysql.user;
    +------+-----------+
    | user | host      |
    +------+-----------+
    | bill | %         |
    | root | 127.0.0.1 |
    | root | ::1       |
    | root | localhost |
    +------+-----------+
    4 rows in set (0.00 sec)
    
    mysql> SELECT USER(), CURRENT_USER();
    +----------------+----------------+
    | USER()         | CURRENT_USER() |
    +----------------+----------------+
    | bill@localhost | bill@%         |
    +----------------+----------------+
    1 row in set (0.02 sec)
    
    mysql> SHOW VARIABLES LIKE 'skip_networking';
    +-----------------+-------+
    | Variable_name   | Value |
    +-----------------+-------+
    | skip_networking | ON    |
    +-----------------+-------+
    1 row in set (0.00 sec)
    

编辑2

完全相同的设置,除了我重新激活了网络,我现在创建了一个匿名用户“@'localhost'。


    root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql
    Welcome to the MySQL monitor (...)
    
    mysql> CREATE USER ''@'localhost' IDENTIFIED BY 'anotherpass';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> Bye

    root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        --socket=/tmp/mysql-5.5.sock
    ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
    root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        -h127.0.0.1 --protocol=TCP
    ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
    root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        -hlocalhost --protocol=TCP
    ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)

编辑3

与编辑2中的情况相同,现在提供匿名用户的密码。


    root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -panotherpass -hlocalhost
    Welcome to the MySQL monitor (...)

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

来自编辑1的结论1:可以通过套接字验证为'bill'@'%'。

结论2,来自编辑2:一个人是通过TCP连接还是通过套接字连接对身份验证过程没有影响(除非一个人不能通过套接字以'something'@'localhost'的身份连接,显然)。

来自编辑3的结论3:尽管我指定了-ubill,但我被授予了匿名用户的访问权限。这是因为上面建议的“排序规则”。注意,在大多数默认安装中,都存在一个无密码的匿名用户(应该保护/删除)。

解决方案是删除匿名(Any)用户!

我在别人设置的服务器上也遇到了同样的问题。我通常不选择在安装MySQL时创建一个匿名用户,所以没有注意到这一点。最初,我以“root”用户登录,并创建了几个“正常”用户(也就是仅在dbs上以用户名作为前缀的用户),然后注销,然后继续验证第一个正常用户。我无法登录。既不通过phpMyAdmin,也不通过shell。事实证明,罪魁祸首是这个“任意”用户。

当你的密码包含一些特殊字符,如@,$等,也会发生这种情况。 为了避免这种情况,你可以把password用单引号括起来:

$ mysql -usomeuser -p's0mep@$$w0Rd'

或者在输入时不用密码。请留空,然后在终端要求时输入。这是推荐的方法。

$ mysql -usomeuser -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 191
Server version: 5.5.46-0ubuntu0.14.04.2 (Ubuntu)

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