MySQL 错误 1045 (28000) : Access denied for user 'bill' @'localhost' (using password: YES)

标签 mysql access-denied

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

我已连接到我的 Amazon EC2 实例。我可以使用以下命令使用 MySQL root 登录:

mysql -u root -p

然后我用主机 % 创建了一个新的用户账单

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

授予用户bill所有权限:

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

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

mysql -u bill -p

输入了正确的密码却出现了这个错误:

ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)

最佳答案

您可能有一个匿名用户 ''@'localhost'''@'127.0.0.1'

根据 the manual :

When multiple matches are possible, the server must determine which of them to use. It resolves this issue as follows: (...)

  • When a client attempts to connect, the server looks through the rows [of table mysql.user] in sorted order.
  • The server uses the first row that matches the client host name and user name.

(...) The server uses sorting rules that order rows with the most-specific Host values first. Literal host names [such as 'localhost'] and IP addresses are the most specific.

因此,当从 localhost 连接时,这样的匿名用户会“屏蔽”任何其他用户,例如 '[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' 通过一个 socket ,显然)。

结论 3,来自编辑 3:虽然我指定了 -ubill,但我已被授予匿名用户访问权限。这是因为上面建议的“排序规则”。请注意,在大多数默认安装中,a no-password, anonymous user exists (并且应该被保护/移除)。

关于MySQL 错误 1045 (28000) : Access denied for user 'bill' @'localhost' (using password: YES),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46231599/

相关文章:

c - 尝试删除文件时获取权限被拒绝错误

php - 如果无法访问/var/log/apache,在哪里可以查看 PHP 错误日志

Java小程序游戏未授权读取图片

php - mysql : select rows from table 1 and test if rows exists in table 2

mysql - hibernate 性能 : the same base class for a lot of children

MySQL Count函数将两列的结果相乘(应该分别返回每列的计数)

mysql - 将 SSL 与 MySql 集成

php - MySQL 返回结果的时间太长

MySQL:与直接使用 View 的底层 JOIN 的查询相比,为什么使用 VIEW 的查询效率较低?

go - 尝试从 golang 广告读取/运行 bigquery 上的查询被拒绝访问 : BigQuery BigQuery: No OAuth token with Google Drive scope was found