首先让我提一下,我已经查看了很多建议的问题,但没有找到相关的答案。这就是我正在做的。
我已连接到我的 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/