vlambda博客
学习文章列表

MySQL何时需要手动刷新授权表

MySQL数据库中对用户的授权,通常都需要flush privileges刷新一下,才可以生效,到底什么操作,才需要做这个,他背后的原理是什么?杨老师的这篇文章《》为我们作了说明。


flush privileges是flush语句集合里的一条子项,执行他的作用是来同步MySQL磁盘和内存中的授权数据,让其保持一致。说详细点就是全量读取授权表的磁盘数据并且完全覆盖内存中的授权数据,又或者反着同步磁盘上的授权数据。

具体可以参考官网手册链接:
https://dev.mysql.com/doc/refman/8.0/en/privilege-changes.html

接下来用两个简单示例说明执行flush privileges语句的时机。

第一,何时使用
当授权数据在磁盘和内存中不一致时,存在两种时机:一是内存数据较新;另一个则是磁盘数据较新。当这两点中的任意一点存在时都需要执行flush privileges语句。

例如直接对表mysql.user执行DML语句,那么此时磁盘数据较新,需要手动执行flush privileges 语句来覆盖内存中的授权数据。

举个例子,用户ytt_u1拥有的权限数据如下:

mysql:(none)>show grants for ytt_u1;
+-------------------------------------+
| Grants for ytt_u1@% |
+-------------------------------------+
| GRANT SELECT ON *.* TO `ytt_u1`@`%` |
+-------------------------------------+
1 row in set (0.00 sec)


管理员来直接更新底层用户表数据:取消select权限。

mysql:(none)>update mysql.user set select_priv='N' where user ='ytt_u1';
Query OK, 1 row affected (0.07 sec)
Rows matched: 1 Changed: 1 Warnings: 0


复查用户ytt_u1拥有的权限数据:结果没有同步。

mysql:(none)>show grants for ytt_u1;
+-------------------------------------+
| Grants for ytt_u1@% |
+-------------------------------------+
| GRANT SELECT ON *.* TO `ytt_u1`@`%` |
+-------------------------------------+
1 row in set (0.00 sec)


手动执行flush privileges语句:再次查看用户ytt_u1的权限数据,数据已经同步为最新。

mysql:(none)>flush privileges;
Query OK, 0 rows affected (0.12 sec)

mysql:(none)>show grants for ytt_u1;
+------------------------------------+
| Grants for ytt_u1@% |
+------------------------------------+
| GRANT USAGE ON *.* TO `ytt_u1`@`%` |
+------------------------------------+
1 row in set (0.00 sec)

第二,何时不需要使用
MySQL内部命令自动更新或者删除用户授权数据。


例如create user 、grant 、revoke等语句执行后会自动同步授权数据,如无异常,则不需要手动执行flush privileges语句。举个例子:还是用户ytt_u1,查看最新权限数据,结果显示没有任何权限。

mysql:(none)>show grants for ytt_u1;
+------------------------------------+
| Grants for ytt_u1@% |
+------------------------------------+
| GRANT USAGE ON *.* TO `ytt_u1`@`%` |
+------------------------------------+
1 row in set (0.00 sec)


用grant语句来给用户ytt_u1赋予数据库ytt的只读权限:

mysql:(none)>grant select on ytt.* to ytt_u1;
Query OK, 0 rows affected (0.20 sec)


查看用户ytt_u1的权限数据:数据已经同步为最新。

mysql:(none)>show grants for ytt_u1;
+-----------------------------------------+
| Grants for ytt_u1@% |
+-----------------------------------------+
| GRANT USAGE ON *.* TO `ytt_u1`@`%` |
| GRANT SELECT ON `ytt`.* TO `ytt_u1`@`%` |
+-----------------------------------------+
2 rows in set (0.00 sec)


再来看下取消授权操作是否也会同步最新授权数据:

mysql:(none)>revoke select on ytt.* from ytt_u1;
Query OK, 0 rows affected (0.09 sec)


查看用户ytt_u1的权限数据:数据也是及时同步的。

mysql:(none)>show grants for ytt_u1;
+------------------------------------+
| Grants for ytt_u1@% |
+------------------------------------+
| GRANT USAGE ON *.* TO `ytt_u1`@`%` |
+------------------------------------+
1 row in set (0.00 sec)

所以只要按照MySQL内置的用户管理语句来操作用户授权信息,则不需要手动执行flush privileges语句,反之则需要。



近期更新的文章:

《》

《》

《》

《》


文章分类和索引: