前言
grant之后其实并不需要跟flush privilege来刷新权限
grant之后还需要跟flush privilege吗?
grant命令
grant命令是用来给数据库添加权限的,
mysql中可以直接添加全局权限,库权限,表以及行权限
grant的操作流程
假如创建了一个用户ua,
那么就会在数据库的user表中创建这个用户,然后会在内存数组acl_user表中添加这个用户信息。如果没有权限那么所有表示权限的列都是N,
使用grant命令添加所有权限之后就会更新数据库这个user表和内存数组acl_user。
读取全局权限的流程
一个线程连接之后会把内存数组中这个用户acl_user的权限复制到线程内存中。所以全局权限如果修改之后,已经连接的线程并不能立马感知。
只有新连接的线程才会使用新的连接。
库级权限
那么对于库级权限存储在mysql.db表中和acl_dbs内存数组中,执行grant添加库权限的逻辑和全局权限相同。
只不过线程判断权限时都会使用这个内存数组acl_dbs判断,
所以修改权限之后,线程立马可以感知到。
但是这里有一个有趣的逻辑,
就是如果这个线程已经进入了这个db,比如执行了use db1,那么权限就会保存在这个线程的会话中,就感知不到内存数组中对这个acl_dbs的权限操作了。只有退出这个db之后才会发现权限的变更。
表和行权限
对于表和行权限保存在mysql.tables_priv和mysql.cloum_priv表中,和内存都保存在cloum_priv_hash中,
执行grant命令和变更时机和db类似。
flush privilege
flush privilege 命令是用来刷新权限缓存的,就是我们上面提到的各级权限都会在内存中存储一份,就是用来使的内存中的权限数据失效,然后从db中重新加载到内存中。例如:用来删除acl_user表中的数据,然后重新加载磁盘中的user表数据的。
所以grant之后还需要跟flush privilege吗?
答案是 不用的。
因为我们上的grant命令,会直接修改内存和db中的权限数据。
那么flush privilege什么时候执行呢?
一般是在错误的操作mysql权限表导致数据不一致而发生错误时使用。
比如使用了delect 命令删除了user表中的用户,当给用户添加权限时会报找不到这个用户。重新添加这个用户的时候,由于内存数组acl_user中存在导致添加不通过
.
如果你直接通过 UPDATE
或 INSERT
等操作修改了 mysql.user
、mysql.db
等系统权限表,MySQL 默认不会立即重新加载权限数据,因此需要手动执行 FLUSH PRIVILEGES
来使改动生效。