grant之后还需要跟flush privilege吗?

发布于:2025-07-08 ⋅ 阅读:(18) ⋅ 点赞:(0)

前言

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中存在导致添加不通过.

如果你直接通过 UPDATEINSERT 等操作修改了 mysql.usermysql.db 等系统权限表,MySQL 默认不会立即重新加载权限数据,因此需要手动执行 FLUSH PRIVILEGES 来使改动生效。