加入收藏 | 设为首页 | 会员中心 | 我要投稿 南通站长网 (https://www.0513zz.cn/)- 专有云、图像技术、经验、数据治理、专属主机!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

Mysql的权限问题以及flush privileges

发布时间:2022-08-09 12:40:45 所属栏目:MySql教程 来源:互联网
导读:Mysql的权限分为以下四种: 1.全局权限 eg:grant all privileges on *.* to test@% with grant option; revoke all privileges on *.* from test@%; 2.db权限 eg:grant all privileges on testdb.* to test@% with grant option; revoke all privileges on
Mysql的权限分为以下四种:
    1.全局权限
        eg:grant all privileges on *.* to 'test'@'%' with grant option;
                revoke all privileges on *.* from 'test'@'%';
    2.db权限
        eg:grant all privileges on testdb.* to 'test'@'%' with grant option;
                revoke all privileges on testdb.* from 'test'@'%';
    3.表权限
        eg:grant all privileges on testdb.test0701 to 'test'@'%' with grant option;        
    4.列权限
        eg:grant select(id), insert(id,a) on testdb.test0702 to 'test'@'%' with grant option;
 
每种权限的信息都会在磁盘和内存中存储,具体的存储位置为:
    1.全局权限
        磁盘:表mysql.user
        内存:数组acl_user
    2.db权限
        磁盘:表mysql.db
        内存:数组acl_dbs
    3.表权限
        磁盘:表mysql.tables_priv
        内存:和列权限组成的hash结构column_priv_hash
    4.列权限
        磁盘:表mysql.columns_priv
        内存:和表权限组成的hash结构column_priv_hash
    
每种权限的修改策略和作用范围:
    1.全局权限
        策略:已存在的连接不生效,新建立连接立即生效
        范围:当前线程
    2.db权限
        策略:所有连接立即生效
        范围:全局
        (注:这里面有个特殊情况,如果会话在持有某个db的权限时进入了该db,那么会话在执行use xxx时拿到的权限就会保存在会话变量中,即使之后别的会话revoke了权限,也不会影响到该会话,在切换出该db之前该会话会一直持有权限)
    3.表权限
        策略:所有连接立即生效
        范围:全局
    4.列权限
        策略:所有连接立即生效
        范围:全局    
 
关于flush privileges操作:
        对于全局权限,flush privileges操作会清空acl_user数组,然后从mysql.user表中读取数据重新构造一个acl_user数组,也就是以数据表中数据为准,将内存数组重新加载一遍
        对于db权限、表权限和列权限,Mysql也是做了这样的处理。
    
所以说如果内存中的权限数据和磁盘表中的数据一致的话,flush privileges其实是可以不用做的。
 
而对于正常的grant/revoke/create user等操作,内存和磁盘中的数据都是同步更新的,所以正常的grant/revoke操作后是不需要flush privileges的。
 
flush privileges的使用场景:
    当我们直接用DML语句修改系统权限表(mysql.user、mysql.db、mysql.tables_priv、mysql.columns_priv)时,内存中的权限数组是不会同步更新的,此时我们就需要flush privileges来更新内存权限数据了。
    eg:delete from mysql.user where user='test0701';

(编辑:南通站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读