'%' 是一个通配符后备。登录尝试尝试最具体的,然后转向通配符(转向更一般的),直到找到用户/主机组合帐户(如果您要进行身份验证)。如果找不到这样的帐户,则登录失败。
因此,当您拥有'root'@'localhost'(称为帐户或用户 1)时,当您坐在本地主机上时,一切都很好。但是当您从不同的客户端附加时,例如“192.168.10.103”,您不再是“本地主机”。你现在需要一个明确的'root'@'192.168.10.103'(如果你愿意的话,用户或帐户),或者为了理智,我们使用'%' 使用通配符。为什么,因为你不可能在你的 mysql.user 中乱扔所有的排列。
可以看到您拥有的用户
select user,host from mysql.user;
拥有 3 个 root 用户的情况并不少见
'root'@'localhost'
'root'@'127.0.0.1'
'root'@'%'
赋予他们所有相同的权利。上面的第三个自然是安全风险。之所以如此,是因为 '%' 意味着 来自任何主机 任何地方。
这就是为什么 'root'@'localhost' 被推荐为系统中唯一的 root 用户的原因。您可以通过坐在那个盒子上来获得 root 权限,或者如果愿意的话,使用带有安全连接的 ssh 来成为 localhost。
您需要了解这一切都与安全有关,以及 MySQL 选择实现用户的方式,无论好坏。用户是用户名,加上主机名进来。主机名可以是 IP 地址,也可以是 DNS 主机名,例如 casper.comcastbusiness.net。当 MySQL 收到连接请求时,它会从 most-specific 向 '%' 冒泡,直到它可以或不能验证请求。
作为一个用例,我有一台服务器,我想以 root 身份进行身份验证,但出于安全原因,没有系统中有一个 'root'@'%' 用户。所以我明确地创建了一个像'root'@'casper.comcastbusiness.net' 这样的用户。另一层当然是防火墙,但这是一个单独的问题。但要轻描淡写,AWS ec2 有一个安全组区域,只有特定的 IP 地址才能连接到端口 3306。所以防火墙是另一层,我要说的是整个事情是关于保护您的服务器。
管理它是一种痛苦。但事实就是如此,我们必须忍受它。