mysql.user表中的127.0.0.1,localhost,[hostname]有什么区别

时间:2011-10-04 07:47:46

标签: mysql host

以下是来自全新安装的MySQL 5的查询select host, user from mysql.user的结果。

+-----------+------------------+
| host      | user             |
+-----------+------------------+
| 127.0.0.1 | root             |
| localhost | debian-sys-maint |
| localhost | root             |
| ubuntu    | root             |
+-----------+------------------+

127.0.0.1localhostubuntu都指向同一台计算机,即本地主机。使用表中看似重复的主机/用户对删除行后,我找不到任何区别。

这些有什么区别?我可以安全地删除其他两个吗?

2 个答案:

答案 0 :(得分:3)

来自the manual

  

安装MySQL时,授权表将填充初始值   一组帐户。这些帐户的名称和访问权限   在第2.10.3节“确保初始MySQL的安全性”中进行了描述   帐户“,还讨论了如何为他们分配密码。

And:

  

某些帐户的用户名为root。这些是超级用户帐户   拥有所有特权,可以做任何事情。最初的root帐户   密码为空,因此任何人都可以以root身份连接到MySQL服务器   没有密码并被授予所有特权。

     

在Unix上,每个root帐户都允许来自本地的连接   主办。 可以通过指定localhost的主机名来建立连接   或实际的主机名或IP地址。

但是,我找不到任何理由。手册中的其他地方没有任何内容暗示这是必需因为任何特殊原因,但可能是为了涵盖request verification的所有基础。可能存在一些原始本地连接使用一个帐户而另一些需要使用替代帐户的情况;我想已经决定确保本地root访问总是工作,无论边缘情况如何,都是好事。

答案 1 :(得分:1)

在mysql中, user1 @ host1 是与 user1 @ host2 不同的用户,它们之间没有任何关系。幸运的是,这三个root用户恰好具有相同的密码和权限。

小心删除这些root帐户。手册警告您使用bind-address

的一个示例
  

..如果将服务器绑定到:: 1,它只接受该地址上的连接。在这种情况下,首先要确保mysql.user表中存在'root'@':: 1'帐户,这样你仍然可以连接到服务器来关闭它。

混淆可能是mysql可以将IP地址主机解析为某个主机作为主机名并使用相应的权限(或者失败,它可以匹配通配符主机%,如果存在)。如果您特别关注DNS性能或安全性并使用skip_name_resolve,则可能会遇到问题。即阅读http://dev.mysql.com/doc/refman/5.5/en/host-cache.html

例如,我发现连接到localhost的jdbc将使用127.0.0.1,因此我必须相应地定义我的用户,而不是用户@ localhost。