MySQL 权限
2023-09-14 09:14:49 时间
MySQL 权限
创建用户 :
- 用户 :
'ua'@'%'
,密码 : pa
create user 'ua'@'%' identified by 'pa';
该命令的内部操作 :
- 磁盘上,往
mysql.user
表里插入一行,而没有指定权限,权限的字段都是 N - 内存里,往数组 acl_users 里插入 acl_user 对象,该对象的 access 为 0
用户在 user 表的状态 :
select * from mysql.user where user = 'ua';
全局权限
全局权限 : 作用于整个 MySQL,这些权限信息保存在 mysql 库的 user 表中
用户 ua 给最高权限 :
grant all privileges on *.* to 'ua'@'%' with grant option;
命令的内部操作 :
- 磁盘上,将
mysql.user
表里,用户'ua'@'%'
的所有权限都修改为'Y'
- 内存里,从数组 acl_users 的该用户的
access
(权限位) 改为全1
小结 :
- grant 会同时更新磁盘和内存 , 之后的新连接会用新权限
- 对已存在的连接,它的全局权限不受
grant
影响
回收 grant 给的权限 :
revoke all privileges on *.* from 'ua'@'%';
命令的内部操作 :
- 磁盘上,将
mysql.user
表里,用户'ua'@'%'
的所有权限都改为N
- 内存里,从数组acl_users中找到这个用户对应的对象,将access的值修改为0
db权限
ua 有库 db1 的所有权限 :
- 库的权限记录保存在
mysql.db
表中 - 还记录在内存的数组
acl_dbs
中
grant all privileges on db1.* to 'ua'@'%' with grant option;
该命令的内部操作 :
- 磁盘上,往
mysql.db
表中插入记录,所有权限都为Y
- 内存里,增加对象到数组
acl_dbs
中,该对象的权限位为全1
用户 ua 在 db表的状态 :
select * from mysql.db where user = 'ua';
grant 对已连接 (全局权限 , 基于 db 的权限) 的影响区别 :
set global sync_binlog
要super
权限- T3 : 用户 ua 的 super 权限 , 通过
revoke
回收 - T4 :
set global
时,权限验证还是通过了。原因 : super 是全局权限,该权限信息在线程对象中,而 revoke 影响不到该线程对象 - T5 : 去掉 ua 对 db1 库的所有权限
- T6 : session B 再操作 db1 库的表,就报错。原因 :
acl_dbs
是全局数组,所有线程都会判断 db 权限,revoke
会马上影响到 session B - T6 : session C 和 session B 对表 t 的操作是一样的。但 session B 报错,而 session C 能执行成功。原因 : session C 在 T2 时 use db1,拿到该库的权限,只要没切出db1 库,session C 对该库就一直有权限
session A | session B | session C | |
---|---|---|---|
T1 | connect(root, root) create database db1; create user 'ua'@'%' identified by 'pa'; grant super on *.* to 'ua'@'%'; grant all privileges on db1.* to 'ua'@'%'; | ||
T2 | connect(ua, pa) set global sync_binlog =1; (Query OK) create table db1.t(c int); (Query OK) | connect(ua, pa) use db1; | |
T3 | revoke super on *.* from 'ua'@'%'; | ||
T4 | set global sync_binlog = 1; alter table db1.t engine=innode; (Query OK) | alter table t engine=innodb; (Query OK) | |
T5 | revoke all privileges on db1.* from 'ua'@'%'; | ||
T6 | set global sync_binlog=1; (Query OK) alter table db1.t engine=innodb; (ALTER command denied) | alter table t engine=innodb; (Query OK) |
表/列权限
MySQL 支持表权限和列权限 :
- 表权限定义在表
mysql.tables_priv
中 - 列权限定义在表
mysql.columns_priv
中 - 俩权限结合 , 在内存的 hash 结构
column_priv_hash
中
表列权限的赋权 :
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
会清空 acl_users 数组,并从 mysql.user
表中读取数据重新加载,重新构造 acl_users
数组
- 当内存的权限数据和磁盘数据表相同时,就不用
flush privileges
flush privileges
当数据表中的权限数据与内存中的权限数据不一致时,用 flush privileges
重建内存数据,达到一致状态
DML 操作系统权限表 :
- T3 : 用 delete 删除用户 ua ,但 T4 还能用 ua 连接成功。原因 : 内存中 acl_users 数组中还有该用户,系统认为用户还存在
- T5 : 执行
flush
后,内存更新,T6 用 ua 登录时,就会报错
client A | client B | |
---|---|---|
T1 | connet(root, root) create user 'ua'@'%'identified by 'pa'; | |
T2 | connect(ua, pa) (connect ok) disconnet | |
T3 | delete from mysql.user where user = ‘ua’; | |
T4 | connect(ua, pa) (connect ok) disconnet | |
T5 | flush privileges; | |
T6 | connect(ua, pa) (Access Denied) |
不规范权限操作 :
- T3 : 直接删除数据表,而内存的数据还存在
- T4 : 给用户 ua 赋权限失败,因为
mysql.user
表中找不到该记录 - T5 : 重新创建该用户也不行,因为做内存判断时,会认为该用户还存在
client A | |
---|---|
T1 | connect(root, root) create user 'ua'@'%' identified by 'pa'; |
T2 | delete from mysql.user where user = 'ua'; |
T3 | grant super on *_.* to _'ua'@'%' with grent option; ERROR 1133(42000): Can’t find any matching row in the user table |
T4 | create user 'ua'@'%' identified by 'pa'; ERROR 1396 (HY000): Operation CREATE USER failed for ‘ua’@‘%’ |
相关文章
- MySQL Error number: MY-010594; Symbol: ER_RPL_SLAVE_NEXT_LOG_IS_INACTIVE; SQLSTATE: HY000 报错 故障修复 远程处理
- MySQL Error number: MY-013338; Symbol: ER_LDAP_AUTH_GRP_OBJECT_HAS_USER_INFO; SQLSTATE: HY000 报错 故障修复 远程处理
- MySQL Error number: MY-013844; Symbol: ER_PERSISTED_VARIABLES_ENCRYPTION_FAILED; SQLSTATE: HY000 报错 故障修复 远程处理
- MySQL数据库搭建: 从无到有的简单步骤(搭建mysql数据库)
- MySQL批量更新: 一步到位(mysql批量更新)
- MySQL数据库技术备案(mysql温备)
- MySQL 锁定与释放的有效解决方案(mysql释放锁)
- 据MySQL统计:记录数据进展(mysql统计记录数)
- MySQL解析器:让数据库运作更加高效(mysql解析器)
- 的处理MySQL中处理重复数据的方法(mysql数据重复)
- MySQL查询:掌握关键字,缩短搜索时间。(mysql查询关键字)
- 清晰明了:如何使用MySQL的Clear命令清除数据?(mysql的clear)
- 如何用MySQL语句删除数据库 一步步教你实现(mysql语句删除数据库)
- 气MySQL查询:发现最受欢迎的人!(mysql查最高的人)
- 解决MySQL无法删除数据库问题(mysql无法删除数据库)
- MySQL中mod的含义及用法(mysql中mod的意思)
- 从MySQL烹饪美食的尝试(cook mysql)
- MySQL数据表行数快速查询的C语言实现(c mysql数据表行数)
- 绑定MySQL让你的数据库管理更简单(bind mysql)
- 官方称作使用3306端口的MySQL官方推荐(3306端口被mysql)
- MySQL数据库中的三个主表详解(mysql三张主表)
- MySQL数据表扩容应对一千万行的挑战(mysql 一千万行)
- MySQL实现一主多双主多从架构,提高数据库的可用性和性能(mysql一主多双主多从)
- 解决MySQL访问视图出错问题(mysql不能访问视图)
- MySQL路径无法自定义必知问题(mysql不能自定义路径)
- MySQL无法显示全部数据库(mysql不能显示所有库)