先上总结图:
对于赋予权限或者收回权限还是创建用户,都会涉及两个操作:
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
只有当磁盘数据表中权限数据和内存中的权限数据不一致时,才需要该语句来重建内存数据,达到一致状态。
就如上面情况。