文章目录

  • Mysql 的权限分类
  • 权限数据的存储
  • 每种权限的修改策略和作用范围
  • 刷新权限
  • MySQL 提供的操作权限
  • 授权语法格式
  • 参考示例
    • 授予用户拥有某个数据库的全部权限
    • 授予用户拥有所有数据库的全部权限
    • 授予用户拥有某个数据库的部分权限
    • 授予用户拥有某个数据库中的某个表的部分权限
    • 授予用户也具有给其它用户授权的权限
    • 授予用户操作表外键的权限
    • 授予用户创建临时表的权限
    • 授予用户操作索引的权限
    • 授予用户创建视图的权限
    • 授予用户查看视图源代码的权限
    • 授予创建存储过程和函数的权限
    • 授予用户 file 权限
    • 授予用户 super 权限
    • 授予用户 process 权限
    • 授予修改/删除存储过程和函数的权限
    • 授予执行/调用存储过程和函数的权限
    • 授予用户只能查询某个表的特定列
    • 授予用户执行指定存储过程的权限
    • 授予用户执行指定函数的权限
    • 授予某个用户拥有所有数据库的全部权限,且拥有授权给其它账户的权限
  • 查看用户所拥有的权限

Mysql 的权限分类

分为以下四种:

1.全局权限

mysql> grant all privileges on *.* to 'test'@'%' with grant option; # 赋予全部的权限
mysql> grant select on *.* to 'test'@'%'; # 赋予查询的权限
mysql> revoke all privileges on *.* from 'test'@'%'; # 撤销全部的权限

说明:通过通配符 *.* 赋予权限,会往 mysql.user 表插入一条记录。

2.db权限

mysql> grant all privileges on testdb.* to 'test'@'%' with grant option;
mysql> revoke all privileges on testdb.* from 'test'@'%';
mysql> grant select on testdb.* to 'test'@'%';
mysql> revoke select on testdb.* from 'test'@'%';

说明:通过 db_name.* 授予权限,会往 mysql.db 表插入一条记录。

3.表权限

mysql> grant all privileges on testdb.student to 'test'@'%' with grant option;
mysql> grant select on testdb.student to 'test'@'%';

说明:上述的授权语句,会往 mysql.tables_priv 表插入一条记录。

4.列权限

mysql> grant select(id), insert(id,a) on testdb.student to 'test'@'%' with grant option;

说明:上述的授权语句,会往 mysql.columns_priv 表插入一条记录。

权限数据的存储

每种权限的数据都会在磁盘和内存中存储,具体的存储位置为:

1.全局权限
磁盘:表 mysql.user
内存:数组 acl_user

2.db权限
磁盘:表 mysql.db
内存:数组 acl_dbs

3.表权限
磁盘:表 mysql.tables_priv
内存:和列权限组成的 hash 结构 column_priv_hash

4.列权限
磁盘:表 mysql.columns_priv
内存:和表权限组成的 hash 结构 column_priv_hash

每种权限的修改策略和作用范围

1.全局权限

策略:已存在的连接不生效,新建立连接立即生效。即已经存在的会话不会起作用,必须重新创建会话权限才会生效。

范围:当前线程,即重启服务后就失效了

2.db权限

策略:所有连接立即生效,但是已经存在的会话必须执行 use db_name 后权限才会生效。因为会话在执行 use db_name 数据库的相关权限会保存在会话变量中,即使之后别的会话 revoke 或者 grant 权限,也不会影响到该会话,在切换出该 db 之前该会话会一直持有原来的权限

范围:全局,即重启服务后依旧有效

3.表权限

策略:所有连接立即生效,即已经存在的会话也会立刻生效

范围:全局,即重启服务后依旧有效

4.列权限
策略:所有连接立即生效,即已经存在的会话也会立刻生效

范围:全局 ,即重启服务后依旧有效

刷新权限

对于全局权限,FLUSH PRIVILEGES 操作会清空 acl_user 数组,acl_dbs 数组,column_priv_hash 集合,然后从 mysql.user 表, mysql.db 表,mysql.table_priv 表,mysql.columns_priv 表读取数据到对应的内存对象中。所以说如果内存中的权限数据和磁盘表中的数据一致的话,FLUSH PRIVILEGES 其实是可以不用做的。

使用 GRANT、REVOKE、SET PASSWORD、RENAME USER 等命令来更改用户的权限,内存和磁盘中的数据都是同步更新的,即 MySQL 服务器会注意到这些变化并立即将更新后的用户数据和权限数据加载至内存中,所以执行上述这些命令后是不需要 FLUSH PRIVILEGES 的。

FLUSH PRIVILEGES 的使用场景:

如果使用 INSERT、UPDATE、DELETE 等 DML 语句直接修改权限表(mysql.user、mysql.db、mysql.tables_priv、mysql.columns_priv),内存中的权限数据是不会同步更新的,此时我们就需要重启服务器(当 MySQL 启动时,所有的权限都会被加载到内存中)或者使用 FLUSH PRIVILEGES 命令来更新内存权限数据。即权限需在重启服务器或者 FLUSH PRIVILEGES 之后方可生效。

MySQL 提供的操作权限


另请参见官方文档:https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html

授权语法格式

给用户授权的语法格式:

mysql> GRANT permission1, permission2, ... ON database_name.table_name TO 'user_name'@'host';
mysql> GRANT ALL PRIVILEGES ON database_name.table_name TO 'user_name'@'host' WITH GRANT OPTION;

说明:
1.GRANT 表示授予的含义
2.permission1, permission2, ... 表示授予的具体权限,如 SELECTINSERTUPDATE 等,权限之间使用逗号分隔;如果要授予所的权限则使用 ALL PRIVILEGES 或者 ALL
3.ON 表示这些权限对哪些数据库和表生效,格式:【数据库名.表名】,这里写 *.* 表示所有数据库的所有表。如果要指定将权限应用到test 库的 user 表中,可以这么写:test.user
4.database_name 数据库名
5.table_name 表名
6.TO 将权限授予哪个用户。格式:【用户名@登录IP或域名】
7.user_name 是用户名;host 是主机名,主机名可以指定为 %,表示没有限制,在任何主机都可以登录;也可以指定为 192.168.0.%,表示在 192.168.0.0 ~ 192.168.0.255 这个网段的主机上远程登录数据库服务器
8.user_namehost 可以使用单引号或者双引号引起来,也可以直接省略掉
9.identified by 用来指定用户的登录密码
10.with grant option 表示允许用户将自己的权限授权给其它用户
11.对同一个用户多次添加权限时,会和已有权限合并,不会覆盖已有权限。即权限会自动叠加,不会覆盖之前授予的权限,比如你先给用户添加一个 SELECT 权限,后来又给用户添加了一个 INSERT 权限,那么该用户就同时拥有了 SELECTINSERT 权限。

参考示例

授予用户拥有某个数据库的全部权限

mysql> GRANT ALL PRIVILEGES ON database_name.* TO 'user_name'@'host';

注:
1.星号 * 是通配符,表示匹配全部的表
2.PRIVILEGES 关键词可以省略

授予用户拥有所有数据库的全部权限

mysql> GRANT ALL PRIVILEGES ON *.* TO 'user_name'@'host';

注:星号是通配符。第一个星号表示匹配任意的数据库,第二个星号表示匹配任意的表。

授予用户拥有某个数据库的部分权限

mysql> GRANT SELECT, INSERT, DELETE ON database_name.* TO 'user_name'@'host';
mysql> grant select,update on test.* to lwx@37.114.28.114;

注:用户表中虽然 userhost 是两个字段,但是授权的时候必须通过 user@host 来指定被授权的用户,因为这个两个字段是联合主键,两个字段联合起来必须唯一。

授予用户拥有某个数据库中的某个表的部分权限

例如,授予用户 pig@% 拥有数据库 test 中的表 user 的查询、插入权限:

mysql> GRANT SELECT, INSERT ON test.user TO 'pig'@'%';

授予用户也具有给其它用户授权的权限

语法格式:

mysql> GRANT permission1, permission2, ... ON database_name.table_name TO 'user_name'@'host' WITH GRANT OPTION;

例如,授予用户 liaowenxiong@% 可以给其它用户授予针对数据库 test 中的表 student 的查询、插入的权限的权限:

mysql> GRANT select,insert ON test.student TO 'liaowenxiong'@'%' WITH GRANT OPTION;

授予用户操作表外键的权限

mysql> grant references on qydpw.* to ‘lwx’@‘192.168.0.%’;

授予用户创建临时表的权限

mysql> grant create temporary tables on qydpw.* to ‘lwx’@‘192.168.0.%’;

授予用户操作索引的权限

mysql> grant index on qydpw.* to ‘developer’@‘192.168.0.%’;

授予用户创建视图的权限

mysql> grant create view on qydpw.* to ‘developer’@‘192.168.0.%’;

授予用户查看视图源代码的权限

mysql> grant show view on qydpw.* to ‘developer’@‘192.168.0.%’;

授予创建存储过程和函数的权限

mysql> grant create routine on qydpw.* to ‘developer’@‘192.168.0.%’;
mysql> grant create routine on qydpw.* to ‘lwx’@‘127.0.0.1’;

授予用户 file 权限

拥有 file 权限才可以执行 select into outfileload data infile 语句。

mysql> grant file on *.* to ‘lwx’@‘localhost’;

授予用户 super 权限

拥有 super 权限,用户可以终止任何查询,使用 set 语句修改系统变量,使用 CHANGE MASTER 和 PURGE MASTER LOGS。

mysql> grant super on *.* to ‘lwx’@‘localhost’;

授予用户 process 权限

通过这个权限,用户可以执行 SHOW PROCESSLIST 和 KILL 命令。默认情况下,每个用户都可以执行 SHOW PROCESSLIST 命令,但是只能查询本用户的进程。

mysql> SHOW PROCESSLIST;
+------+-------+---------------------+------------+---------+------+----------+------------------+
| Id   | User  | Host                | db         | Command | Time | State    | Info             |
+------+-------+---------------------+------------+---------+------+----------+------------------+
| 2515 | root  | localhost           | qydpw      | Query   |    0 | starting | SHOW PROCESSLIST |
| 2596 | qydpw | 47.114.59.224:46182 | qydpw      | Sleep   | 1779 |          | NULL             |
| 2597 | qydpw | 47.114.59.224:46192 | qydpw      | Sleep   | 1689 |          | NULL             |
| 2598 | qydpw | 47.114.59.224:46194 | qydpw      | Sleep   | 1686 |          | NULL             |
| 2599 | qydpw | 47.114.59.224:46196 | production | Sleep   | 1648 |          | NULL             |
| 2600 | qydpw | 47.114.59.224:46208 | production | Sleep   | 1505 |          | NULL             |
| 2601 | qydpw | 47.114.59.224:46212 | qydpw      | Sleep   | 1444 |          | NULL             |
| 2602 | qydpw | 47.114.59.224:46218 | qydpw      | Sleep   | 1333 |          | NULL             |
| 2603 | qydpw | 47.114.59.224:46230 | production | Sleep   | 1104 |          | NULL             |
| 2604 | qydpw | 47.114.59.224:46234 | production | Sleep   | 1066 |          | NULL             |
| 2605 | qydpw | 47.114.59.224:46244 | qydpw      | Sleep   |  833 |          | NULL             |
| 2606 | qydpw | 47.114.59.224:46246 | qydpw      | Sleep   |  814 |          | NULL             |
| 2607 | qydpw | 47.114.59.224:46250 | production | Sleep   |  792 |          | NULL             |
| 2608 | qydpw | 47.114.59.224:46252 | production | Sleep   |  788 |          | NULL             |
| 2609 | qydpw | 47.114.59.224:46256 | production | Sleep   |  727 |          | NULL             |
| 2610 | qydpw | 47.114.59.224:46258 | qydpw      | Sleep   |  692 |          | NULL             |
| 2611 | qydpw | 47.114.59.224:46268 | production | Sleep   |  489 |          | NULL             |
| 2612 | qydpw | 47.114.59.224:46270 | qydpw      | Sleep   |  480 |          | NULL             |
| 2613 | qydpw | 47.114.59.224:46274 | qydpw      | Sleep   |  416 |          | NULL             |
| 2614 | qydpw | 47.114.59.224:46280 | production | Sleep   |  323 |          | NULL             |
| 2615 | qydpw | 47.114.59.224:46290 | production | Sleep   |   90 |          | NULL             |
+------+-------+---------------------+------------+---------+------+----------+------------------+

注意:superprocessfile 等权限不能够指定某个数据库,on 后面必须跟 *.*,如下示例:

mysql> grant super on pyt.* to lwx@localhost;
ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
mysql> grant super on *.* to lwx@localhost;
Query OK, 0 rows affected (0.01 sec)

授予修改/删除存储过程和函数的权限

mysql> grant alter routine on qydpw.* to developer@192.168.0.%;

授予执行/调用存储过程和函数的权限

mysql> grant execute on qydpw.* to developer@192.168.0.%;

授予用户只能查询某个表的特定列

mysql> grant select(advice_id,user_id) on qydpw.tf_advice to lwx@localhost;

授予用户执行指定存储过程的权限

例如,授予用户执行存储过程 sys.diagnostics 的权限:

mysql> grant execute on procedure sys.diagnostics to lwx@127.0.0.1;

授予用户执行指定函数的权限

例如,授予用户执行函数 sys.ps_thread_account 的权限:

mysql> grant execute on function sys.ps_thread_account to lwx@127.0.0.1;

授予某个用户拥有所有数据库的全部权限,且拥有授权给其它账户的权限

GRANT ALL PRIVILEGES ON *.* TO 'user_name'@'host' WITH GRANT OPTION;

查看用户所拥有的权限

查看其它用户的权限:

mysql> SHOW GRANTS FOR 'user_name'@'host';

例如,查看用户 liaowenxiong@% 所拥有的权限:

mysql> show grants for 'liaowenxiong'@'%';
+--------------------------------------------------------------------------+
| Grants for liaowenxiong@%                                                |
+--------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'liaowenxiong'@'%'                                 |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `testdb`.* TO 'liaowenxiong'@'%' |
+--------------------------------------------------------------------------+
2 rows in set (0.00 sec)

查看当前登录用户自己的权限:

mysql> show grants;

MySQL数据库的用户授权_查看权限相关推荐

  1. mysql数据库单用户模式_干掉一堆mysql数据库,仅需这样一个shell脚本(推荐)

    一大早就被电话吵醒了,云某项目数据库全挂了,启动不了(睡得太死,没听到报警短信),吓得不轻啊! 电话中说所有mysql数据库主库都启动不了,但从库正常,怀疑是主库去连其它阿里云的主库了.这些数据库,以 ...

  2. 查询mysql数据库表占用空间大小_查看 MySQL 数据库中每个表占用的空间大小-阿里云开发者社区...

    如果想知道MySQL数据库中每个表占用的空间.表记录的行数的话,可以打开MySQL的 information_schema 数据库.在该库中有一个 TABLES 表,这个表主要字段分别是: TABLE ...

  3. [SpringSecurity]web权限方案_用户授权_基于权限访问控制_基于角色访问控制_hasAuthority和hasAnyAuthority_hasRole和hasAnyRole

    基于角色或权限进行访问控制 hasAuthority 方法 如果当前的主体具有指定的权限,则返回 true,否则返回 false 在配置类设置当前访问地址有哪些 @Overrideprotected ...

  4. 第四篇:Mysql数据库的用户授权及撤销

    一,创建授权 1,mysql授权库和信息 2,grant配置授权

  5. 案例分享:Qt激光加工焊接设备信息化软件研发(西门子PLC,mysql数据库,用户权限控制,界面设计,参数定制,播放器,二维图,期限控制,参数调试等)

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/127669684 长期持续项目技术分享,有专业Qt需求请 ...

  6. MySQL数据库创建用户及授权

    MySQL数据库创建用户及授权 1.创建用户 命令 CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明 username:你将创建的用 ...

  7. mysql 限制单个用户资源_限制MySQL数据库单个用户最大连接数等的方法

    限制MySQL数据库单个用户最大连接数等的方法 最近经常有网友问我,他们的服务器上总有一些网站用户的连接数过大,而影响了其他的网站的正常使用,那么如何把某一条臭鱼限制在自己的一亩三分地呢?下面我来说一 ...

  8. 用命令创建表空间、用户,并为用户授权、收回权限。

    oracle中如何删除用户? Oracle中使用DROP USER来删除用户,如果使用DROP USER CASCADE那么用户的对象也同时被删除掉.为了达到删除用户的效果而又不影响对用户下的对象的使 ...

  9. lnmp下mysql创建新用户授权后登录报错 1045 Access denied for user 'name'@'localhost

    报错:1045 Access denied for user 'name'@"localhost' (using password: YES) 问题:mysql创建新用户授权后远程登录用户时 ...

最新文章

  1. 玩转Python!一文详述Python 的高性能使用技巧
  2. 利用MATLAB实现移动目标的TDOA/FDOA定位算法
  3. 力挺2007年国内原创音乐届最权威大赛!
  4. AQS理解之四—看看我们写的和 ReentrantLock 的公平不公平锁的区别
  5. 每天shell 之split
  6. 自定义parallelStream的thread pool
  7. 2019年3月4日 701. Insert into a Binary Search Tree
  8. 到底什么是“云网融合”?
  9. 华为交换机eth口作用_华为交换机口如何绑定端口号
  10. html中grid布局,CSS:玩转grid布局
  11. Direct3D 9学习笔记(3)基本顶点绘制
  12. 简单的方法完成项目上传到github
  13. k8s集群安装traefik 2.x (保证成功版)
  14. 电脑设置u盘启动方法
  15. jme-再现虎式坦克
  16. 密码学系列 - 多种签名方式
  17. iOS开发之语音朗读文字
  18. Sony相机型号对比
  19. 51单片机温度控制C语言程序详解,基于单片机的温度控制系统设计(附程序清单及原理图).doc...
  20. CSAPP深入理解计算机——bomblab(2018)

热门文章

  1. java 示例_功能Java示例 第3部分–不要使用异常来控制流程
  2. 新增操作 失败后重试_可重试的操作
  3. 摆脱冷气_摆脱匿名类
  4. hazelcast入门教程_Hazelcast入门指南第6部分
  5. JDK 14中的常规,安全和确定性外部内存访问
  6. JDK 12附带紧凑数字格式
  7. spring安全_Spring安全–幕后
  8. 结构为键值的map_在Java中增加Map值的最有效方法-只需搜索键一次
  9. java 断点_每个Java开发人员应拥有的持久断点
  10. Oracle JDBC中的PreparedStatement占位符过多