大家好,我是 Snow Hide,作为《MySQL 实战》这个专栏的学员之一,这是我打卡的第 53 天,也是我第 115 次进行这种操作。
今天我温习了该专栏里一篇叫《grant之后要跟着flush privileges吗?》的文章。
关键词总结:创建用户命令的两个动作、全局权限(grant 命令的两个动作、grant 命令的分析结果、回收 grant 语句赋予的权限、revoke 命令的两个动作)、db 权限(库级别 grant 命令的两个动作)、表权限和列权限(两类权限的赋予命令、不需要执行 flush privileges 命令的场景)、flush privileges 使用场景(删除用户后内存数据还存在的结果)。
所学总结:
创建用户命令的两个动作
create user 'ua'@'%' identified by 'pa';
- 在磁盘上,往
mysql.user
表里插入一行,但由于没有指定权限,所以该行数据上所有与权限有关的字段值都为'N'
; - 在内存里,往数组
acl_users
里插入一个acl_user
对象,该对象的 access 字段值为0
。
全局权限
grant all privileges on *.* to 'ua'@'%' with grant option;
grant 命令的两个动作
- 在磁盘上,将
mysql.user
表里用户'ua'@'%'
行的所有与权限相关的字段值都改为'Y'
; - 在内存里,从数组
acl_users
中找到该用户对应的对象,将access
值(权限位)改为二进制的 “全 1”。
grant 命令的分析结果
grant
命令对于全局权限,同时更新了磁盘和内存。命令完成后即时生效,接下来新创建的连接会使用新的权限;- 对于一个已经存在的连接,它的全局权限不受 grant 命令的影响。
回收 grant 语句赋予的权限
revoke all privileges on *.* from 'ua'@'%';
revoke 命令的两个动作
- 在磁盘上,将
mysql.user
表里用户'ua'@'%'
行的所有与权限相关的字段值都改为'N'
; - 在内存里,从数组
acl_users
中找到该用户对应的对象,将access
的值修改为0
。
db 权限
grant all privileges on db1.* to 'ua'@'%' with grant option;
库级别 grant 命令的两个动作
- 在磁盘上,往
mysql.db
表中插入了一行记录,所有权限位字段设置为'Y'
; - 在内存里,增肌一个对象到数组
acl_dbs
中,该对象的权限位为 “全 1”。
表权限和列权限
两类权限的赋予命令
create table db1.t1(id int, a int);
grant all privileges on db1.t1 to 'ua'@'%' with grant option;
GRANT SELECT(id), INSERT (id,a) ON mydb.mytbl TO 'ua'@'%' with grant option;
不需要执行 flush privileges 命令的场景
- 内存的权限数据和磁盘数据表相同的情况;
- 使用 grant/revoke 语句时,因为内存和数据表本来就是保持同步更新的;
- 正常情况下,grant 命令之后没有必要跟着执行 flush privileges 命令。
flush privileges 使用场景
删除用户后内存数据还存在的结果
由于在事务三时直接删除了数据表的记录,而内存的数据还在:
- 事务四时给用户
ua
赋权失败,因为 mysql.user 表中找不到该行记录; - 而事务五时要重新创建该用户也不行,因为在做内存判断时,会认为该用户还存在。
末了
重新总结了一下文中提到的内容:MySQL 用户权限在数据表和内存中的存在形式、grant 和 revoke 命令的执行逻辑、规范地使用 grant 和 revoke 语句时不需要后跟 flush privileges 语句、flush privileges 语句本身会用数据表的数据重建一份内存权限数据。