MySQL · 源码分析 · 无法revoke单库或单表权限

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 现象对于拥有全局权限的用户,无法revoke单库或单表的权限,示例如下mysql> grant select on *.* to 'xx1'@'localhost';Query OK, 0 rows affected (0.00 sec)mysql> revoke select * test.* from 'xx1'@'localhost';ERROR 1141 (420

现象

对于拥有全局权限的用户,无法revoke单库或单表的权限,示例如下

mysql> grant select on *.* to 'xx1'@'localhost';
Query OK, 0 rows affected (0.00 sec)

mysql> revoke select * test.* from 'xx1'@'localhost';
ERROR 1141 (42000): There is no such grant defined for user 'xx1' on host 'localhost'

mysql> revoke select * test.t1 from 'xx1'@'localhost';
ERROR 1141 (42000): There is no such grant defined for user 'xx1' on host 'localhost'

分析

根据报错信息,确定revoke select * test.* from 'xx1'@'localhost'报错在函数replace_db_table里面,调用栈如下

    0  replace_db_table () at /home/xijia.xj/rds_5518/sql/sql_acl.cc:2662
    1  0x00000000005ebf44 in mysql_grant () at /home/xijia.xj/rds_5518/sql/sql_acl.cc:4230
    2  0x00000000006ac74e in mysql_execute_command () at /home/xijia.xj/rds_5518/sql/sql_parse.cc:4255
    3  0x00000000006b630c in mysql_parse () at /home/xijia.xj/rds_5518/sql/sql_parse.cc:6591
    4  0x000000000069ed9a in dispatch_command () at /home/xijia.xj/rds_5518/sql/sql_parse.cc:1214
    5  0x000000000069d072 in do_command () at /home/xijia.xj/rds_5518/sql/sql_parse.cc:837
    6  0x000000000081d9c1 in do_handle_one_connection () at /home/xijia.xj/rds_5518/sql/sql_connect.cc:1426
    7  0x000000000081d19b in handle_one_connection () at /home/xijia.xj/rds_5518/sql/sql_connect.cc:1332
    8  0x00007fd0c16fa851 in start_thread () from /lib64/libpthread.so.0
    9  0x0000003330ce767d in clone () from /lib64/libc.so.6 

报错条件是如下,操作是revoke,且mysql.db中找不到对应权限

screenshot
screenshot

grant select on *.* to 'xx1'@'localhost'调用栈如下

0  replace_user_table () at /home/xijia.xj/rds_5518/sql/sql_acl.cc:2361
1  0x00000000005ebf44 in mysql_grant () at /home/xijia.xj/rds_5518/sql/sql_acl.cc:4220
2  0x00000000006ac74e in mysql_execute_command () at /home/xijia.xj/rds_5518/sql/sql_parse.cc:4255
3  0x00000000006b630c in mysql_parse () at /home/xijia.xj/rds_5518/sql/sql_parse.cc:6591
4  0x000000000069ed9a in dispatch_command () at /home/xijia.xj/rds_5518/sql/sql_parse.cc:1214
5  0x000000000069d072 in do_command () at /home/xijia.xj/rds_5518/sql/sql_parse.cc:837
6  0x000000000081d9c1 in do_handle_one_connection () at /home/xijia.xj/rds_5518/sql/sql_connect.cc:1426
7  0x000000000081d19b in handle_one_connection () at /home/xijia.xj/rds_5518/sql/sql_connect.cc:1332
8  0x00007fd0c16fa851 in start_thread () from /lib64/libpthread.so.0
9  0x0000003330ce767d in clone () from /lib64/libc.so.6 

可以看出grant select on *.* to 'xx1'@'localhost'只修改了mysql.user表
revoke select * test.* from 'xx1'@'localhost' 需要删除mysql.db表中相应记录,所以会报错

小结

mysql权限分三个粒度,全局权限, db权限,table权限,分别保存在mysql.user, mysql.db. mysql.tables_priv(存储过程,和proxy权限有单独的表)

grant/revoke privilege on *.* 修改mysql.user表
grant/revoke privilege on db.* 修改mysql.db表
grant/revoke privilege on db.table 修改mysql.table表
三种操作互不影响,赋予一个用户大粒度的权限,并不能收回小粒度的权限

执行drop user操作后,会调用sql/sql_acl.cc:handle_grant_data修改上述三个表中,所有与被drop用户相关的记录

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
8天前
|
SQL 关系型数据库 MySQL
使用Python的pymysql库连接MySQL,执行CRUD操作
使用Python的pymysql库连接MySQL,执行CRUD操作:安装pymysql,然后连接(host='localhost',user='root',password='yourpassword',database='yourdatabase'),创建游标。查询数据示例:`SELECT * FROM yourtable`;插入数据:`INSERT INTO yourtable...`;更新数据:`UPDATE yourtable SET...`;删除数据:`DELETE FROM yourtable WHERE...`。
21 0
|
8天前
|
存储 关系型数据库 MySQL
linux安装MySQL8.0,密码修改权限配置等常规操作详解
linux安装MySQL8.0,密码修改权限配置等常规操作详解
|
9天前
|
Java 关系型数据库 MySQL
【JDBC编程】基于MySql的Java应用程序中访问数据库与交互数据的技术
【JDBC编程】基于MySql的Java应用程序中访问数据库与交互数据的技术
|
12天前
|
安全 关系型数据库 MySQL
node实战——后端koa结合jwt连接mysql实现权限登录(node后端就业储备知识)
node实战——后端koa结合jwt连接mysql实现权限登录(node后端就业储备知识)
22 3
|
14天前
|
存储 SQL 关系型数据库
不停止MySQL服务增加从库的两种方式
不停止MySQL服务增加从库的两种方式
|
22天前
|
SQL 关系型数据库 MySQL
用MySQL创建公司资料库表格
创建了员工、分支、客户及工作关系的数据库表格。员工与分支间有works_with表记录销售数据,外键关联并处理删除操作(set null或cascade)。插入数据后,通过SQL查询获取员工、客户信息,使用聚合函数、通配符、联合查询和JOIN操作。子查询用于复杂条件筛选。数据库设计确保了数据完整性和参照完整性。
20 0
|
23天前
|
SQL 关系型数据库 MySQL
DDL语言之库和表的管理(mysql)
DDL语言之库和表的管理(mysql)
|
23天前
|
关系型数据库 MySQL
MySQL全局库表查询准确定位字段
information_schema.COLUMNS 详细信息查询
213 4
|
26天前
|
SQL 关系型数据库 MySQL
MySql创建用户并配置权限
MySql创建用户并配置权限
18 0
|
29天前
|
SQL 关系型数据库 MySQL
mysql 库、表增删改
mysql 库、表增删改

相关产品

  • 云数据库 RDS MySQL 版