先上总结图:
《MySQL——关于grant赋权以及flush privileges》_数组
对于赋予权限或者收回权限还是创建用户,都会涉及两个操作:

1、磁盘,mysql.user表,用户行所有表示权限的字段的值的修改

2、内存,acl_users找到用户对应的对象,将access值修改

grant授权

创建用户 ’ua’@’%’,密码是 pa

create user 'ua'@'%' identified by 'pa';

全局权限

grant all privileges on *.* to 'ua'@'%' with grant option;

grant命令对于全局权限,同时更新了磁盘和内存。命令完成后即时生效,接下来新创建的连接也会使用新权限

2、对于一个已经存在的连接,它的全局权限不受grant命令影响。(也就是说,如果全局权限信息已经在线程对象中,revoke操作影响布道这个线程对象)

回收权限可以这样:

revoke all privileges on *.* from 'ua'@'%';

库级别权限

grant all privileges on db1.* to 'ua'@'%' with grant option;

只要拿到了库的权限,在切换出这个库之前,线程对象对这个库一直有权限。而只connect而不use,也就是没有拿到库的权限,这个库权限被收走后,该线程对象就操作不了这个库了。对于一个已经存在的连接,它的库权限受grant命令影响

表权限和列权限

赋权语句如下:

create table db1.t1(id int, a int);
grant all privileges on db1.t1 to 'ua'@'%' with grant option;
GRANT SELECT(id), INSERT (id,a) ON mydb.mytbl TO 'ua'@'%' with grant option;

与db权限类似,对于这个两个权限的操作,也会马上影响到已经存在的连接。

flush privileges命令

该命令会清空​​acl_users​​​数组,然后从​​mysql.user​​​表中读取数据重新加载,重新构造一个​​acl_user​​数组。

以数据表中的数据为准,会将全局、db、表、列权限内存数组重新加载一遍

用途:正常的grant命令之后,没有必要跟着执行flush privileges

只有当磁盘数据表中权限数据和内存中的权限数据不一致时,才需要该语句来重建内存数据,达到一致状态。

《MySQL——关于grant赋权以及flush privileges》_mysql_02

就如上面情况。