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

Posted bisal(Chen Liu)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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语句,反之则需要。

近期更新的文章:

SQL Monitor中status的作用

基金A类和C类的科普贴

MySQL时间类分区写SQL的一些注意事项

最近碰到的问题

关于数据治理的读书笔记 - 什么是数据文化?

文章分类和索引:

公众号900篇文章分类和索引

以上是关于MySQL何时需要手动刷新授权表的主要内容,如果未能解决你的问题,请参考以下文章

Linux环境 Mysql新建用户和数据库并授权

mysql grant

MySQL OCP888题解061-库表访问权限的激活时机

Unity连接Android设备时的授权

MySQL忘记密码的解决方案

MySQL忘记密码的解决方案