MySQL何时需要手动刷新授权表
MySQL数据库中对用户的授权,通常都需要flush privileges刷新一下,才可以生效,到底什么操作,才需要做这个,他背后的原理是什么?杨老师的这篇文章《》为我们作了说明。
接下来用两个简单示例说明执行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语句,反之则需要。
近期更新的文章:
《》
《》
《》
《》
《》
文章分类和索引:
》