Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >mysql权限控制

mysql权限控制

作者头像
AsiaYe
发布于 2019-11-06 08:50:25
发布于 2019-11-06 08:50:25
3K00
代码可运行
举报
文章被收录于专栏:DBA随笔DBA随笔
运行总次数:0
代码可运行

mysql权限控制 作为一名DBA,想必大家对MySQL中的权限都不陌生,MySQL中对于权限的控制分为三个层面:

  • 全局性的管理权限,作用于整个MySQL实例级别
  • 数据库级别的权限,作用于某个指定的数据库上或者所有的数据库上
  • 数据库对象级别的权限,作用于指定的数据库对象上(表、视图等)或 者所有的数据库对象上

这里,我们将mysql中的所有权限列出来,最后给出一个特殊的案例来反应mysql权限控制中的一个小bug。首先来看权限列表,权限的顺序按照首字母的顺序进行排列:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
•All/All Privileges
该权限代表全局或者全数据库对象级别的所有权限
•Alter
该权限代表允许修改表结构的权限,但必须要求有create和insert权限配合。
如果是rename表名,则要求有alter和drop原表,create和insert新表的权限
•Alter routine
该权限代表允许修改或者删除存储过程、函数的权限
•Create
该权限代表允许创建新的数据库和表的权限
•Create routine
该权限代表允许创建存储过程、函数的权限
•Create tablespace
该权限代表允许创建、修改、删除表空间和日志组的权限
•Create temporary tables
该权限代表允许创建临时表的权限
•Create user
该权限代表允许创建、修改、删除、重命名user的权限
•Create view
该权限代表允许创建视图的权限
•Delete
该权限代表允许删除行数据的权限
•Drop
该权限代表允许删除数据库、表、视图的权限,包括truncate table命令
•Event
该权限代表允许查询,创建,修改,删除MySQL事件
•Execute
该权限代表允许执行存储过程和函数的权限
•File
该权限代表允许在MySQL可以访问的目录进行读写磁盘文件操作,
可使用的命令包括load data infile,select ... into outfile,load file()函数
•Grant option
该权限代表是否允许此用户授权或者收回给其他用户你给予的权 限
•Index
该权限代表是否允许创建和删除索引
•Insert
该权限代表是否允许在表里插入数据,同时在执行analyze table,optimize table,repair table语句的时候也需要insert权限
•Lock
该权限代表允许对拥有select权限的表进行锁定,以防止其他链接对此表的读或写
•Process
该权限代表允许查看MySQL中的进程信息,比如执行showprocesslist,
•Reference
该权限是在5.7.6版本之后引入,代表是否允许创建外键
•Reload
该权限代表允许执行flush命令,指明重新加载权限表到系统内存中,refresh命令代表关闭和重新开启日志文件并刷新所有的表
•Replication client
该权限代表允许执行show master status,show slave status,show binary logs命令
•Replication slave
该权限代表允许slave主机通过此用户连接master以便建立主从复制关系
•Select
该权限代表允许从表中查看数据,而且select权限在执行update/delete 语句中含有where条件的情况下也是需要的
•Show databases
该权限代表通过执行show databases命令查看所有的数据库名
•Show view
该权限代表通过执行show create view命令查看视图创建的语句mysqladmin processlist, show engine等命令
•Shutdown
该权限代表允许关闭数据库实例,执行语句包括mysqladmin shutdown
•Super
该权限代表允许执行一系列数据库管理命令,包括kill强制关闭某个连接 命令,change master to创建复制关系命令,以及create/alter/drop server等命 令
•Trigger
该权限代表允许创建,删除,执行,显示触发器的权限
•Update
该权限代表允许修改表中的数据的权限
•Usage
该权限是创建一个用户之后的默认权限,其本身代表连接登录权限

权限系统表

权限存储在mysql库的user,db, tables_priv, columns_priv, and procs_priv这几个系统表中,待MySQL实例启动后就加载到内存中 • User表:

存放用户账户信息以及全局级别(所有数据库)权限,决定了 来自哪些主机的哪些用户可以访问数据库实例,如果有全局权限则意味 着对所有数据库都有此权限 • Db表:

存放数据库级别的权限,决定了来自哪些主机的哪些用户可以访 问此数据库 • Tables_priv表:

存放表级别的权限,决定了来自哪些主机的哪些用户可以 访问数据库的这个表 • Columns_priv表:

存放列级别的权限,决定了来自哪些主机的哪些用户可 以访问数据库表的这个字段 • Procs_priv表:

存放存储过程和函数级别的权限

MySQL修改权限之后的生效方法

• 执行Grant,revoke,setpassword,renameuser命令修改权限之后,MySQL会自动将修改后的权限信息同步加载到系统内存中 • 如果执行insert/update/delete操作上述的系统权限表之后,则必须再执行刷 新权限命令才能同步到系统内存中,刷新权限命令包括:flush privileges/mysqladmin flush-privileges/mysqladmin reload • 如果是修改tables和columns级别的权限,则客户端的下次操作新权限就会生效 • 如果是修改database级别的权限,则新权限在客户端执行use database命令后生效 • 如果是修改global级别的权限,则需要重新创建连接新权限才能生效 • --skip-grant-tables可以跳过所有系统权限表而允许所有用户登录,只在特殊情况下暂时使用

赋予权限与回收权限

赋予权限的时候通常使用grant语句,以查询为例,具体如下:

grant select on db_name.table_name to user@host;

其中,如果对一个账号授予数据库中的所有表的权限,需要将上述语句中的table_name改为*,如果对数据库中所有数据库中的所有表授予权限,则需要将db_name和table_name都改为*

回收权限通常使用revoke语法,它的使用方法如下,以查询为例:

revoke select on db_name.table_name from user@host;

需要注意的是,它与grant不同之处在于语句最后面由to改为了from。

一个特殊例子

今天在处理线上业务的时候,有这样一个开权限的需求,想从workbench客户端查看存储过程,我当时的第一反应就是直接给execute权限,结果给了execute权限之后,业务方反应还是无法查看存储过程,我过去看了下,连接上数据库之后,显示如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| AAA                |
+--------------------+
2 rows in set (0.00 sec)
mysql> use AAA
Database changed
mysql> show procedure status\G
*************************** 1. row ***************************
                  Db: CVS
                Name: ba_get_grow
                Type: PROCEDURE
             Definer: dba_admin@127.0.0.1
            Modified: 2019-02-26 ::
             Created: 2019-02-26 ::
       Security_type: DEFINER
             Comment:
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci

mysql> show create procedure ba_get_grow\G
*************************** 1. row ***************************
           Procedure: ba_get_grow
            sql_mode:
    Create Procedure: NULL
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
 row in set (0.00 sec)

可以看到,第29行的create procedure的值是NULL,而没有显示出来procedure的内容,当然也就无法查看procedure了,这种情况怎么办呢?

想到了mysql.proc表里面包含存储过程的信息,于是通过下面的方法给了mysql.proc表一个只读的权限:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql@127.0.0.1:(none) 22:35:07>>grant select on `mysql`.proc to 'user'@'host';
Query OK, 0 rows affected (0.00 sec)

再次登录客户端,可以发现存储过程的内容已经可以看到了,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| AAA                |
+--------------------+
2 rows in set (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| AAA              |
| mysql              |
+--------------------+
3 rows in set (0.00 sec)

mysql> show create procedure ba_get_grow\G
*************************** 1. row ***************************
           Procedure: ba_get_grow
            sql_mode:
    Create Procedure: CREATE DEFINER=`dba_admin`@`127.0.0.1` PROCEDURE `ba_get_grow`(
    in p_table_info varchar(),
    out out_retmsg varchar()
)
BEGIN
    XXXXXXXXX
    XXXXXXXXX
    XXXXXXXXX
    XXXXXXXXX
END
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
 row in set (0.00 sec)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
听说Mysql你很豪横?-------------分分钟带你玩转SQL高级查询语句(库函数,存储过程)
MySQL 数据库函数提供了能够实现各种功能的方法,使我们在查询记录时能够更高效的输出。MySQL 内建了很多函数,常用的包括数学函数、聚合函数、字符串函数和日期时间函数。
不吃小白菜
2020/09/03
2.5K0
听说Mysql你很豪横?-------------分分钟带你玩转SQL高级查询语句(库函数,存储过程)
【MySQL基础篇】十三、用户与权限管理
​ MySQL 中的用户管理是指通过创建、配置和管理用户帐户,控制用户对数据库服务器的访问权限。MySQL 数据库服务器允许管理员创建多个用户帐户,并对这些帐户的权限进行灵活配置,以确保数据库的安全性和数据的隐私。
利刃大大
2025/05/22
720
【MySQL基础篇】十三、用户与权限管理
MySQL用户管理及SQL语句详解
惨绿少年
2017/12/27
3.9K0
MySQL用户管理及SQL语句详解
第08期:有关 MySQL 字符集的注意事项
创建数据库时,显式指定字符集和排序规则,同时,当切换到当前数据库后,参数 character_set_database,collation_database 分别被覆盖为当前显式指定的字符集和排序规则。举个简单例子,创建数据库 ytt_new2,显式指定字符集为 latin1,同时排序规则为 latin1_bin。之后在切换到数据库 ytt_new2 后,对应的系统参数也被修改。
爱可生开源社区
2020/07/13
7510
MySQL 存储过程
存储过程(Stored Procedure)是一种存储在数据库中的程序,可供外部程序调用的一种数据库对象。
恋喵大鲤鱼
2023/10/12
7810
MySQL 存储过程
Mysql用户与权限操作
用户是数据库的使用者和管理者。 MySQL通过用户的设置来控制数据库操作人员的访问与操作范围。 服务器中名为mysqI的数据库,用于维护数据库的用户以及权限的控制和管理。 MySQL中的所有用户信息都保存在mysql.user数据表中。
海盗船长
2021/12/07
3.6K0
Mysql用户与权限操作
再见乱码:5 分钟读懂 MySQL 字符集设置
作者: 程序猿小卡_casper 原文:https://segmentfault.com/a/1190000012775484 一、内容概述 在MySQL的使用过程中,了解字符集、字符序的概念,以及不同设置对数据存储、比较的影响非常重要。不少同学在日常工作中遇到的“乱码”问题,很有可能就是因为对字符集与字符序的理解不到位、设置错误造成的。 本文由浅入深,分别介绍了如下内容: 字符集、字符序的基本概念及联系 MySQL支持的字符集、字符序设置级,各设置级别之间的联系 server、database、tabl
前端教程
2018/03/05
5.4K0
MySQL常用show命令使用总结
MySQL中有很多的基本命令,show命令也是其中之一,在很多使用者中对show命令的使用还容易产生混淆,本文汇集了show命令的众多用法。show命令可以提供关于数据库、表、列,或关于服务器的状态信息。
星哥玩云
2022/08/18
1.3K0
【MySQL基础篇】二、数据库的操作
​ 接下来学的数据库的操作以及表的结构操作,都是属于我们之前讲的 DDL 也就是数据定义语言,它负责的是对结构的管理,而不是对数据内容的管理!
利刃大大
2025/05/21
900
【MySQL基础篇】二、数据库的操作
mysql安全权限的讲解
MySQL 默认有个root用户,但是这个用户权限太大,一般只在管理数据库时候才用。如果在项目中要连接 MySQL 数据库,则建议新建一个权限较小的用户来连接。
张哥编程
2024/12/19
1240
mysql中的字符集和校验规则
在MySQL中,最常见的字符集有ASCII字符集、latin字符集、GB2312字符集、GBK字符集、UTF8字符集等,下面我们简单介绍下这些字符集:
AsiaYe
2019/11/06
2.4K0
mysql中的字符集和校验规则
MySQL自定义函数与存储过程示例
函数:可以完成特定功能的一段SQL集合。MySQL支持自定义函数来完成特定的业务功能。 创建自定义函数(User Defined Function 简称UDF)的语法如下:
星哥玩云
2022/08/17
1.8K0
Server层表级别对象字典表 | 全方位认识 information_schema
在上一篇《Server层统计信息字典表 | 全方位认识 information_schema》中,我们详细介绍了information_schema系统库的列、约束等统计信息字典表,本期我们将为大家带来系列第三篇《Server层表级别对象字典表 | 全方位认识information_schema》。
老叶茶馆
2020/11/26
1.1K0
MySQL 启动及关闭 MySQL 服务器
在 Windows 系统下,打开命令窗口(cmd),进入 MySQL 安装目录的 bin 目录。
用户4988085
2021/07/25
7.2K0
技术分享 | MySQL 隐式转换必知必会
作者:张洛丹,热衷于数据库技术,不断探索,期望未来能够撰写更有深度的文章,输出更有价值的内容!
爱可生开源社区
2024/05/22
1640
技术分享 | MySQL 隐式转换必知必会
Linux下Mysql数据库的基础操作
Mysql数据库是一种关系型数据库管理系统,具有的优点有体积小、速度快、总体成本低,开源,可移植性(跨平台,在不同系统中使用),可以和开发语结合,属于轻量级数据库。
江湖有缘
2023/11/11
3680
Server 层混杂信息字典表 | 全方位认识 information_schema(中)
该表提供查询关于语句性能分析的信息。其记录内容对应于SHOW PROFILES和SHOW PROFILE语句产生的信息
老叶茶馆
2020/11/26
4140
【MySql】数据库的增删改查
当我们创建数据没有指定字符集和校验规则时,系统使用默认字符集:utf8,校验规则:utf_general_ci;
平凡的人1
2023/10/15
5020
【MySql】数据库的增删改查
MySQL专题3之MySQL管理
-  如果MySQL已经启动,以上命令将输出mysql进程列表,如果mysql未启动,你可以使用以下命令使用来启动mysql服务器:
py3study
2020/01/14
5270
MySQL用户和权限管理(一)
第一部分:主要是MYSQL数据库的权限体系以及MYSQL访问控制的两个阶段;我们都知道,MYSQL初始化完成之后,自带四个默认的数据库;下面的内容主要涉及到的是mysql库中相关的内容;
SEian.G
2021/03/03
3.2K0
相关推荐
听说Mysql你很豪横?-------------分分钟带你玩转SQL高级查询语句(库函数,存储过程)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验