2012-05-30 15 views

回答

76

百分号意味着所有IP的本地主机这样是多余的......没有必要与本地主机的第二个记录的。

编辑

居然有,“localhost”的是在MySQL特殊,它指的是在Unix套接字(或命名管道上的窗户,我相信),而不是一个TCP/IP套接字连接。使用%作为主机不包括'本地主机'

+0

在什么版本?在MySQL 5.5.35中,“%”也与localhost匹配。 – depquid

+0

“localhost”不仅通过本地套接字连接,127.0.0.1(不使用套接字)也不会与%相匹配,而是与本地主机相匹配。看到今天haproxy安装。 – Phillipp

26

正如@nos在目前对这个问题所接受的答案的评论中指出的,接受的答案是不正确的。

是的,使用%localhost作为用户帐户主机时,通过套接字连接而不是标准TCP/IP连接进行连接时存在差异。

对于套接字,主机值%不包括localhost,因此如果要使用该方法进行连接,则必须指定它。

4

要提供一个稍微不同的答案,目前提供的答案。

如果在用户表''@'localhost'中有一行来自本地主机的匿名用户,那么这将被视为比使用通配符主机'user'@'%'的用户更具体。这就是为什么有必要也提供'user'@'localhost'

你可以在this page的底部看到更详细的解释。

3

百分号表示:任何主机,包括远程和本地连接。

本地主机只允许本地连接。

(这么开始了,如果你不需要你的数据库的远程连接,你可以摆脱APPUSER的@“%”用户马上)

所以,是的,他们是重叠的,但...

...有一个设置这两种类型的帐户的原因,这是在mysql文档中解释: http://dev.mysql.com/doc/refman/5.7/en/adding-users.html

如果你有一个有匿名用户在你的本地主机,您可以与发现:

select Host from mysql.user where User='' and Host='localhost'; 

,如果你只需要创建一个用户APPUSER @“%”(你不是APPUSER @'本地主机'),那么当appuser mysql用户 从本地主机连接时,使用匿名用户帐户(它优先于您的appuser @'%'用户)。

而且这种情况的解决方法是(作为一个可以猜)创建APPUSER @“localhost”的(这是更具体的本地主机的匿名用户,如果你的APPUSER从本地主机连接将被使用)。

1

我们来测试吧。

连接作为超级用户,然后:

SHOW VARIABLES LIKE "%version%"; 
+-------------------------+------------------------------+ 
| Variable_name           | Value                        | 
+-------------------------+------------------------------+ 
| version                 | 10.0.23-MariaDB-0+deb8u1-log | 

然后

USE mysql; 

与密码bar创建用于测试的用户foo

CREATE USER [email protected]'%' IDENTIFIED BY 'bar'; FLUSH PRIVILEGES; 

要连接到Unix领域套接字(即由文件系统条目命名的I/O管道或一些这样的),在命令行上运行此:

mysql -pbar -ufoo 

要连接到TCP/IP端点127.0.0.1:3306代替,在命令行上运行此:

mysql -pbar -ufoo -h127.0.0.1 

要检查连接是否通过TCP/IP套接字或Unix域套接字,通过检查ps faux的输出来获取mysql客户端进程的PID,然后运行lsof -p$GOTPID。你会看到类似这样的:

mysql [PID] quux 3u IPv4 [code] 0t0 TCP localhost:[port]->localhost:mysql (ESTABLISHED) 

mysql [PID] quux 3u unix [code] 0t0 [code] socket 

所以:

案例0:主机= '10 .10.10.10' (空试验)

update user set host='10.10.10.10' where user='foo'; flush privileges; 
  • 连接到插座:FAILURE
  • 连接到127.0.0.1:未能

案例1:主机= '%'

update user set host='%' where user='foo'; flush privileges; 
  • 与插座:OK
  • 连接到127.0.0。1:OK

情况2:主机= 'localhost' 的

update user set host='localhost' where user='foo';flush privileges; 
  • 连接到插座:OK
  • 连接到127.0.0.1:OK

情况3:主机='127.0.0.1'

update user set host='127.0.0.1' where user='foo';flush privileges; 
  • 连接到插座:未能
  • 连接到127.0.0.1:OK

案例4:主机= ''

update user set host='' where user='foo';flush privileges; 
  • 与插座:OK
  • 连接至127.0.0.1:好吧

(根据MySQL 5.7: 6.2.4 Access Control, Stage 1: Connection Verification,空字符串''也意味着“任何主机”,但在'%'之后排序。

案例5:主机= '192.168.0.1'(额外的测试)

( '192.168.0.1' 是我的机器的IP地址之一,你的情况适当改变)

update user set host='192.168.0.1' where user='foo';flush privileges; 
  • 连接到插座:未能
  • 连接到127.0.0.1:未能

  • 连接到192.168.0.1使用mysql -pbar -ufoo -h192.168.0.1:OK

边缘情况答:主机= '0.0.0.0'

update user set host='0.0.0.0' where user='foo';flush privileges; 
  • 与插座:未能
  • 连接到127.0.0.1:失败

边缘案例B:主机= '255.255.255.255'

update user set host='255.255.255.255' where user='foo';flush privileges; 
  • 与插座:未能
  • 连接到127.0.0。1:故障

清理

delete from user where user='foo';flush privileges; 

附录

要了解什么是真正的mysql.user表,这是允许的一个表,使用:

SELECT SUBSTR(password,1,6) as password, user, host, 
Super_priv AS su, 
Grant_priv as gr, 
CONCAT(Select_priv, Lock_tables_priv) AS selock, 
CONCAT(Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv) AS modif, 
CONCAT(References_priv, Index_priv, Alter_priv) AS ria, 
CONCAT(Create_tmp_table_priv, Create_view_priv, Show_view_priv) AS views, 
CONCAT(Create_routine_priv, Alter_routine_priv, Execute_priv, Event_priv, Trigger_priv) AS funcs, 
CONCAT(Repl_slave_priv, Repl_client_priv) AS replic, 
CONCAT(Shutdown_priv, Process_priv, File_priv, Show_db_priv, Reload_priv, Create_user_priv) AS admin 
FROM user ORDER BY user, host; 

这给出:

+----------+----------+-----------+----+----+--------+-------+-----+-------+-------+--------+--------+ 
    | password | user  | host  | su | gr | selock | modif | ria | views | funcs | replic | admin | 
    +----------+----------+-----------+----+----+--------+-------+-----+-------+-------+--------+--------+ 
    | *E8D46 | foo  |   | N | N | NN  | NNNNN | NNN | NNN | NNNNN | NN  | NNNNNN | 

同样,对于表mysql.db

SELECT host,db,user, 
     Grant_priv as gr, 
     CONCAT(Select_priv, Lock_tables_priv) AS selock, 
     CONCAT(Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv) AS modif, 
     CONCAT(References_priv, Index_priv, Alter_priv) AS ria, 
     CONCAT(Create_tmp_table_priv, Create_view_priv, Show_view_priv) AS views, 
     CONCAT(Create_routine_priv, Alter_routine_priv, Execute_priv) AS funcs 
     FROM db ORDER BY user, db, host;