3 回答
TA贡献1828条经验 获得超3个赞
您可能有一个匿名用户''@'localhost'
或''@'127.0.0.1'
。
根据手册:
当可能存在多个匹配项时,服务器必须确定要使用哪些匹配项。它解决了这个问题如下:(...)
当客户端尝试连接时,服务器按排序顺序查看[表mysql.user]的行。
服务器使用与客户端主机名和用户名匹配的第一行。
(...)服务器使用排序规则,首先对具有最特定主机值的行进行排序。文字主机名[例如“localhost”]和IP地址是最具体的。
因此,这样的匿名用户将“屏蔽”任何其他用户,就像'[any_username]'@'%'
连接时一样localhost
。
'bill'@'localhost'
匹配'bill'@'%'
,但会匹配(例如)''@'localhost'
beforehands。
推荐的解决方案是删除这个匿名用户(这通常是一件好事)。
以下编辑主要与主要问题无关。这些仅用于回答本主题中其他评论中提出的一些问题。
编辑1
'bill'@'%'
通过套接字进行身份验证。
root @ myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass --socket = / tmp / mysql-5.5.sock
欢迎使用MySQL监视器(...)
mysql> SELECT用户,主机FROM mysql.user;
+ ------ + ----------- +
| 用户| 主持人|
+ ------ + ----------- +
| 账单| %|
| 根| 127.0.0.1 |
| 根| :: 1 |
| 根| localhost |
+ ------ + ----------- +
4行(0.00秒)
mysql> SELECT USER(),CURRENT_USER();
+ ---------------- + ---------------- +
| USER()| CURRENT_USER()|
+ ---------------- + ---------------- +
| bill @ localhost | 账单@%|
+ ---------------- + ---------------- +
1排(0.02秒)
mysql> SHOW VARIABLES LIKE'skip_networking';
+ ----------------- + ------- +
| Variable_name | 价值|
+ ----------------- + ------- +
| skip_networking | ON |
+ ----------------- + ------- +
1排(0.00秒)
编辑2
完全相同的设置,除了我重新激活网络,我现在创建一个匿名用户''@'localhost'。
root @ myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql
欢迎使用MySQL监视器(...)
mysql> CREATE USER''@'localhost'通过'anotherpass'识别;
查询正常,0行受影响(0.00秒)
mysql>再见
root @ myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
--socket = / TMP / MySQL的-5.5.sock
ERROR 1045(28000):用户'账单'@'localhost'拒绝访问(使用密码:YES)
root @ myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
-h127.0.0.1 --protocol = TCP
ERROR 1045(28000):用户'账单'@'localhost'拒绝访问(使用密码:YES)
root @ myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
-hlocalhost --protocol = TCP
ERROR 1045(28000):用户'账单'@'localhost'拒绝访问(使用密码:YES)
编辑3
与编辑2中的情况相同,现在提供匿名用户的密码。
root @ myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -panotherpass -hlocalhost
欢迎使用MySQL监视器(...)
mysql> SELECT USER(),CURRENT_USER();
+ ---------------- + ---------------- +
| USER()| CURRENT_USER()|
+ ---------------- + ---------------- +
| bill @ localhost | @localhost |
+ ---------------- + ---------------- +
1排(0.01秒)
结论1,来自编辑1:可以'bill'@'%'通过套接字进行身份验证。
结论2,从编辑2:无论是通过TCP连接还是通过套接字连接都不会对身份验证过程产生影响(除了一个人不能像其他人一样连接,但'something'@'localhost'
通过套接字,显然)。
结论3,来自编辑3:虽然我指定了-ubill
,但我被授予了匿名用户的访问权限。这是因为上面提到的“排序规则”。请注意,在大多数默认安装中,存在无密码的匿名用户(应该保护/删除)。
TA贡献1876条经验 获得超6个赞
尝试:
~$ mysql -u root -p Enter Password:mysql> grant all privileges on *.* to bill@localhost identified by 'pass' with grant option;
添加回答
举报