-
成功在虚拟机上安装MySQL之后,创建了root用户并授予所有权限:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root';
-
当在windows系统的MySQL客户端进行创建用户并授权时报错:
grant SELECT on micr_product.* TO 'dev'@'%' IDENTIFIED BY '123' WITH GRANT OPTION;
[Err] 1044 - Access denied for user 'root'@'%' to database 'micr_product'
-
查看mysql数据库中user表发现grant权限为N,因此需要修改root用户的权限:
-
在虚拟机上登录root账户,然后执行如下命令即可:
> revoke all on *.* from 'root'@'%'; > GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION;
-
此时,root用户就获得了grant权限,此时便可以创建用户并为新用户授权了。
MySQL5.7官方文档:访问控制一【连接验证】
-
当你试图连接到MySQL服务器时,服务器会去校验你的用户标识(用户标识包括用户名和IP),当匹配到用户标识后,会根据这个标识对应的密码去校验登录密码,再去判断账户是否被锁定,所有校验都通过后便可以连接成功
-
MySQL的用户信息保存在msyql库的user表中,每次服务器去读取user表时,都会将表中的账户按一定的规则进行排序,然后保存在内存中,当用户试图连接时,会从内存中按顺序对用户标识进行匹配,将匹配到的第一个用户标识作为当前用户的登录标识
-
匹配规则:指定的主机名或IP地址(无论是否包含IP掩码)为最高优先级,如果IP中包含了%,则优先级低,如果IP为空字符串,同样意味着任意IP,但是优先级在%之后;如果IP相同,则指定的用户名具有较高优先级,用户名为空字符串意味着任何用户,优先级较低;如果IP和用户名的优先级都相同,那么排序是随机的。
-
基于以上理论,当登录的用户没有你所想要的权限时,你需要考虑是否账户验证的问题。查看当前账户是否登录正确可以使用一下命令,或者打印user表,然后手动进行排序获取第一个匹配的用户标识来判断:
# 这个命令会打印出登录时校验的用户标识,格式为:用户名@主机名 SELECT CURRENT_USER();
-
例子:当用户jeffrey 从h1.example.net这个IP地址来连接服务器时,服务器匹配到的用户标识是@h1.example.net,而不是jeffrey@%,两个用户标识所对应的权限可能不一样,这样就会导致操作时权限受到限制。