先看错误现象
mysql> revoke all on bbs.* from 'admin1'@'localhost';
ERROR 1044 (42000): Access denied for user 'root'@'%' to database 'bbs'
mysql> grant all privileges on bbs.* to 'root'@'%';
ERROR 1044 (42000): Access denied for user 'root'@'%' to database 'bbs'
mysql> grant all on *.* to 'root'@'%';
ERROR 1045 (28000): Access denied for user 'root'@'%' (using password: YES)
很奇怪,root用户应该不可能无法授权普通用户。
看两个错误码提示:1044提示root访问bbs库被拒绝 / 1045提示root访问被拒绝,密码应该没问题这里。
决定去看看mysql.user表中root这个用户的权限是怎么样的。在mysql.user表中记录了与全局相关的权限信息。这个全局权限不是指拥有所有的权限,它具体指的是拥有该MYSQL服务器所有数据库对象的权限。
首先查询系统中用户
SELECT user,host FROM mysql.user;
再查看用户权限表
SELECT host,user,Grant_priv,Super_priv FROM mysql.user;
可以看到Grant_priv是N。很显然,因为root@'%'这个用户没有授予权限的权限,所以之前的操作报错。修改一下Grant_priv的值为Y,刷新下,然后退出重新登录。问题就解决了。
update mysql.user set Grant_priv='Y' where user='root';
flush privileges;
结:这个问题不是很常见。但是这个问题提供了一种解决思路,在权限出问题时,应如何入手。mysql中权限的粒度由粗到细分别是全局,数据库,表,列,程序。可以用一句话来概括:分配某个用户从某台机器连接进来访问某个数据库下的某张表的某个列的某部分记录的权限。记录 与全局相关的权限信息就是mysql.user表中。 记录 数据库级别的权限信息 是mysql.db表。 记录 表对象的授权信息记录 是mysql.tables_priv表中。 列级权限记录在 mysql.column_priv表中。