首先让我提一下,我已经研究了许多建议性的问题,但没有找到相关的答案。这就是我正在做的
我已连接到我的Amazon EC2实例。我可以使用以下命令使用MySQL root登录:
mysql-u root-p
然后我用主机%
创建由“passpass”标识的用户“bill”@“%”;
已将所有特权授予用户帐单:
使用grant选项将**上的所有特权授予“%”票据“@”;
然后我退出root用户并尝试使用bill登录:
mysql-u-bill-p
输入了正确的密码并出现以下错误:
错误1045(28000):拒绝用户“bill”@“localhost”的访问(使用密码:YES)
您可能有一个匿名用户'@'localhost'或'@'127.0.0.1'
根据手册:
当可能存在多个匹配项时,服务器必须确定以下哪一项:
使用它们。它解决这个问题如下:(…)
- 当客户端尝试连接时,服务器将按排序顺序查看表mysql.user的行
- 服务器使用与客户端主机名和用户名匹配的第一行
(……)
服务器使用排序规则,首先对具有最特定主机值的行进行排序。
文字主机名和IP地址是最具体的
因此,当从localhost连接时,这样的匿名用户将“屏蔽”任何其他用户,如“[任何用户名]”@“%”
'bill'@'localhost'确实匹配'bill'@'%,但会在之前匹配(例如,''localhost')
建议的解决方案是删除这个匿名用户(无论如何,这通常是一件好事)
下面的编辑大多与主要问题无关。这些只是为了回答本帖其他评论中提出的一些问题。
编辑1
通过套接字验证为'bill'@'
[email protected]:/home/mysql-5.5.16-linux2.6-x86_64#/mysql-ubill-ppass-socket=/tmp/mysql-5.5.sock 欢迎使用MySQL监视器(…) mysql>从mysql.user中选择用户、主机; +------+-----------+ |用户|主机| +------+-----------+ |账单|%| |根数| 127.0.0.1| |根|:::1| |根|本地主机| +------+-----------+ 一组4行(0.00秒) mysql>选择用户(),当前用户(); +----------------+----------------+ |用户()|当前用户()| +----------------+----------------+ | [email protected]|账单@%| +----------------+----------------+ 一组1行(0.02秒) mysql>显示“跳过网络”等变量; +-----------------+-------+ |变量名称|值| +-----------------+-------+ |跳过网络|打开| +-----------------+-------+ 一行一组(0.00秒)
编辑2
完全相同的设置,只是我重新激活了网络,现在我创建了一个匿名用户'@'localhost'
[email protected]:/home/mysql-5.5.16-linux2.6-x86_64#/mysql 欢迎使用MySQL监视器(…) mysql>创建用户“”@'localhost',由'anotherpass'标识; 查询正常,0行受影响(0.00秒) mysql>再见 [email protected]:/home/mysql-5.5.16-linux2.6-x86_64#/mysql-ubill-ppass\ --socket=/tmp/mysql-5.5.sock 错误1045(28000):拒绝用户“bill”@“localhost”的访问(使用密码:YES) [email protected]:/home/mysql-5.5.16-linux2.6-x86_64#/mysql-ubill-ppass\ -h127.0.0.1——协议=TCP 错误1045(28000):拒绝用户“bill”@“localhost”的访问(使用密码:YES) [email protected]:/home/mysql-5.5.16-linux2.6-x86_64#/mysql-ubill-ppass\ -hlocalhost——协议=TCP 错误1045(28000):拒绝用户“bill”@“localhost”的访问(使用密码:YES)
编辑3
与编辑2中的情况相同,现在提供匿名用户的密码
[email protected]:/home/mysql-5.5.16-linux2.6-x86_64#/mysql-ubill-panotherpass-hlocalhost 欢迎使用MySQL监视器(…) mysql>选择用户(),当前用户(); +----------------+----------------+ |用户()|当前用户()| +----------------+----------------+ | [email protected]|@localhost| +----------------+----------------+ 一行一组(0.01秒)
结论1,来自编辑1:可以通过套接字作为“bill”@“进行身份验证
结论2,来自编辑2:一个人是通过TCP连接还是通过套接字连接对身份验证过程没有影响(显然,除了通过套接字'something'@'localhost'之外,他不能作为任何人连接)
结论3,来自编辑3:尽管我指定了-ubill,但我已被授予作为匿名用户的访问权限。这是因为上面建议的“排序规则”。请注意,在大多数默认安装中,都存在一个无密码的匿名用户(应该对其进行保护/删除)