flush privileges 命令

背景

Mysql权限修改,是不影响已经建立的连接的。那什么时候使用flush privileges 命令呢?

写在前面

参考链接为https://www.cnblogs.com/softidea/p/12897530.html

link

原理

在Mysql中,保存用户权限有三个地方

(1)已经建立的数据库连接中。grantrevoke或直接改db,不影响已经建立连接的权限情况
(2)Mysql服务器内存中的acl_users 数组
(3)db的mysql.user表中

flush privileges 命令会清空 acl_users 数组,然后从 mysql.user 表中读取数据重新加载,
重新构造一个 acl_users 数组。
也就是说,以数据表中的数据为准,会将全局权限内存数组重新加载一遍。

grant 语句会同时修改数据表和内存,判断权限的时候使用的是内存数据。
因此,规范地使用 grantrevoke 语句,是不需要随后加上 flush privileges 语句的。

flush privileges 语句本身会用数据表的数据重建一份内存权限数据,
所以在权限数据可能存在不一致的情况下再使用。

而这种不一致往往是由于直接用 DML 语句操作系统权限表导致的,所以我们尽量不要使用这类语句。

结论
grant 语句会同时修改数据表和内存,判断权限的时候使用的就是内存数据。是不需要加上 flush privileges

补充

创建用户与赋权
CREATE USER canal IDENTIFIED BY 'canal';  
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;

FLUSH PRIVILEGES;#可选用

查看
show grants for 'root'@'localhost';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION ;
GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION;

给普通用户使用grant权限的权利(一般只有管理员DBA用户拥有)
WITH GRANT OPTION
表权限和列权限除了 db 级别的权限外,MySQL 支持更细粒度的表权限和列权限。
其中,表权限定义存放在表 mysql.tables_priv 中,列权限定义存放在表 mysql.columns_priv 中。
这两类权限,组合起来存放在内存的 hash 结构 column_priv_hash 中。

本文说明,主要技术内容来自互联网技术大佬的分享,还有一些自我的加工(仅仅起到注释说明的作用)。如有相关疑问,请留言,将确认之后,执行侵权必删

你可能感兴趣的:(Mysql,mysql)