一文带你了解MySQL之用户和权限原理

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
日志服务 SLS,月写入数据量 50GB 1个月
简介: 在学习这一章节的时候,我们可以先了解一下SQL语言,SQL语言共分为四大类:数据查询语言DQL(Data QueryLanguage):select 等数据操纵语言DML(database manage language):insert update delete 等数据定义语言DDL(Data Definition Language): create drop alter runcate 等数据控制语言DCL(Data Control Language): grant revoke commit rollback 等

一、用户权限管理

MySQL数据库对于对象的操作级别分为:全局、数据库、表、字段等。粒度从粗到细。如果粗的粒度的权限满足了,将不再检验细粒度的级别,也就是说全局权限满足了,就不会校验数据库、表和字段,依次类推。


1.1 权限粒度

权限相关的表 描述

user 用户账号,全局权限,连接权限

db 数据库级别权限

tables_priv 表级别权限

columns_priv 列级别权限

procs_priv 存储过程,函数级别权限

proxies_priv 代理用户权限


1.2 显示用户非权限属性

mysql> show create user 'grant'@'localhost' \G;

*************************** 1. row ***************************

CREATE USER for grant@localhost: CREATE USER 'grant'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK

1 row in set (0.00 sec)

ERROR:

No query specified


1.3 全局级权限

我们创建‘grant’@'localhost'用户进行权限的学习


mysql> create user 'grant'@'localhost' identified by '123456';

Query OK, 0 rows affected (0.00 sec)

使用show grants for查询用户权限,可以看到刚才创建的用户拥有USAGE权限

mysql> show grants for 'grant'@'localhost' \G;

*************************** 1. row ***************************

Grants for grant@localhost: GRANT USAGE ON *.* TO 'grant'@'localhost'

1 row in set (0.00 sec)

ERROR:

No query specified

授予用户replication client 和 replication slave用户级权限后进行用户权限的查询

mysql> grant replication client , replication slave on *.* to 'grant'@'localhost';

Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

mysql> show grants for 'grant'@'localhost' \G;

*************************** 1. row ***************************

Grants for grant@localhost: GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'grant'@'localhost'

1 row in set (0.00 sec)

ERROR:

No query specified

查询用户权限,全局级权限对应的mysql.user表

mysql> select * from mysql.user where user='grant' \G;

*************************** 1. row ***************************

                 Host: localhost

                 User: grant

          Select_priv: N

          Insert_priv: N

          Update_priv: N

          Delete_priv: N

          Create_priv: N

            Drop_priv: N

          Reload_priv: N

        Shutdown_priv: N

         Process_priv: N

            File_priv: N

           Grant_priv: N

      References_priv: N

           Index_priv: N

           Alter_priv: N

         Show_db_priv: N

           Super_priv: N

Create_tmp_table_priv: N

     Lock_tables_priv: N

         Execute_priv: N

      Repl_slave_priv: Y

     Repl_client_priv: Y

     Create_view_priv: N

       Show_view_priv: N

  Create_routine_priv: N

   Alter_routine_priv: N

     Create_user_priv: N

           Event_priv: N

         Trigger_priv: N

Create_tablespace_priv: N

             ssl_type:

           ssl_cipher:

          x509_issuer:

         x509_subject:

        max_questions: 0

          max_updates: 0

      max_connections: 0

 max_user_connections: 0

               plugin: mysql_native_password

authentication_string: *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9

     password_expired: N

password_last_changed: 2023-04-20 22:37:57

    password_lifetime: NULL

       account_locked: N

1 row in set (0.00 sec)

ERROR:

No query specified

1.4 库级别权限

这里创建一个数据库,模拟测试库级别权限,在这里我们回顾一下字符集的设置创建表的时候没有指定字符集,默认使用数据库,如果数据库也没有设置,就默认使用server的字符集。


mysql> show variables like 'character%';

+--------------------------+----------------------------------------------------------------+

| Variable_name            | Value                                                          |

+--------------------------+----------------------------------------------------------------+

| character_set_client     | utf8                                                           |

| character_set_connection | utf8                                                           |

| character_set_database   | utf8                                                           |

| character_set_filesystem | binary                                                         |

| character_set_results    | utf8                                                           |

| character_set_server     | utf8                                                           |

| character_set_system     | utf8                                                           |

| character_sets_dir       | /opt/mysql/mysql-5.7.39-linux-glibc2.12-x86_64/share/charsets/ |

+--------------------------+----------------------------------------------------------------+

8 rows in set (0.00 sec)

创建数据库,默认字符集utf8


mysql> create database testdb default character set utf8;

Query OK, 1 row affected (0.00 sec)

1

2

授予‘grant’@'localhost'用户testdb 库级的权限

mysql> grant select,insert,update,delete,create,alter,lock tables,show view,trigger on tesdb.* to 'grant'@'localhost';

Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

查询用户权限

mysql> show grants for 'grant'@'localhost' \G;

*************************** 1. row ***************************

Grants for grant@localhost: GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'grant'@'localhost'

*************************** 2. row ***************************

Grants for grant@localhost: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, LOCK TABLES, SHOW VIEW, TRIGGER ON `tesdb`.* TO 'grant'@'localhost'

2 rows in set (0.00 sec)

ERROR:

No query specified

查询库级别权限,库级别权限对应的表是mysql.db表

mysql> select * from mysql.db where user='grant' \G;

*************************** 1. row ***************************

                Host: localhost

                  Db: tesdb

                User: grant

         Select_priv: Y

         Insert_priv: Y

         Update_priv: Y

         Delete_priv: Y

         Create_priv: Y

           Drop_priv: N

          Grant_priv: N

     References_priv: N

          Index_priv: N

          Alter_priv: Y

Create_tmp_table_priv: N

    Lock_tables_priv: Y

    Create_view_priv: N

      Show_view_priv: Y

 Create_routine_priv: N

  Alter_routine_priv: N

        Execute_priv: N

          Event_priv: N

        Trigger_priv: Y

1 row in set (0.00 sec)

ERROR:

No query specified


1.5 表级权限

我们创建一张表,进行权限的学习


mysql> use testdb;

Database changed

mysql> create table test1 (id int, name varchar(20));

Query OK, 0 rows affected (0.01 sec)

mysql> show tables;

+------------------+

| Tables_in_testdb |

+------------------+

| test1            |

+------------------+

1 row in set (0.00 sec)

授予‘grant’@'localhost'用户testdb.test1 表级别的权限


mysql> grant  select,insert,update,delete,create,alter  on testdb.test1 to 'grant'@'localhost';

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

查询用户权限


mysql> show grants for 'grant'@'localhost' \G;

*************************** 1. row ***************************

Grants for grant@localhost: GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'grant'@'localhost'

*************************** 2. row ***************************

Grants for grant@localhost: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, LOCK TABLES, SHOW VIEW, TRIGGER ON `tesdb`.* TO 'grant'@'localhost'

*************************** 3. row ***************************

Grants for grant@localhost: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER ON `testdb`.`test1` TO 'grant'@'localhost'

3 rows in set (0.00 sec)

ERROR:

No query specified

查询表级别权限,表级别对应的mysql.tables_priv表

mysql> select *  from mysql.tables_priv where table_name='test1'\G;

*************************** 1. row ***************************

      Host: localhost

        Db: testdb

      User: grant

Table_name: test1

   Grantor: root@localhost

 Timestamp: 0000-00-00 00:00:00

Table_priv: Select,Insert,Update,Delete,Create,Alter

Column_priv:

1 row in set (0.00 sec)

ERROR:

No query specified

1.6 列级权限

我们授予授予‘grant’@'localhost'用户testdb.test1 表id字段查询权限,name字段更新权限


mysql> grant select(id),update(name) on testdb.test1 to 'grant'@'localhost';

Query OK, 0 rows affected (0.04 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)


查询用户权限


mysql> show grants for 'grant'@'localhost' \G;

*************************** 1. row ***************************

Grants for grant@localhost: GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'grant'@'localhost'

*************************** 2. row ***************************

Grants for grant@localhost: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, LOCK TABLES, SHOW VIEW, TRIGGER ON `tesdb`.* TO 'grant'@'localhost'

*************************** 3. row ***************************

Grants for grant@localhost: GRANT SELECT, SELECT (id), INSERT, UPDATE, UPDATE (name), DELETE, CREATE, ALTER ON `testdb`.`test1` TO 'grant'@'localhost'

3 rows in set (0.00 sec)

ERROR:

No query specified


查询列级别权限


列级别对应的mysql.tables_priv表或者columns_priv表,但是我们查询mysql.tables_priv表发现列级别权限有更查询和更新权限,但不知道是哪一列


mysql> select * from mysql.tables_priv where table_name = 'test1' \G;

*************************** 1. row ***************************

      Host: localhost

        Db: testdb

      User: grant

Table_name: test1

   Grantor: root@localhost

 Timestamp: 0000-00-00 00:00:00

Table_priv: Select,Insert,Update,Delete,Create,Alter

Column_priv: Select,Update

1 row in set (0.00 sec)


ERROR:

No query specified


查询mysql.columns_priv表可以明确看出哪一列有什么权限


mysql> select * from mysql.columns_priv where table_name = 'test1' \G;

*************************** 1. row ***************************

      Host: localhost

        Db: testdb

      User: grant

Table_name: test1

Column_name: id

 Timestamp: 0000-00-00 00:00:00

Column_priv: Select

*************************** 2. row ***************************

      Host: localhost

        Db: testdb

      User: grant

Table_name: test1

Column_name: name

 Timestamp: 0000-00-00 00:00:00

Column_priv: Update

2 rows in set (0.00 sec)

ERROR:

No query specified

1.7 权限回收

查询用户权限


mysql> show grants for 'grant'@'localhost' \G;

*************************** 1. row ***************************

Grants for grant@localhost: GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'grant'@'localhost'

*************************** 2. row ***************************

Grants for grant@localhost: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, LOCK TABLES, SHOW VIEW, TRIGGER ON `tesdb`.* TO 'grant'@'localhost'

*************************** 3. row ***************************

Grants for grant@localhost: GRANT SELECT, SELECT (id), INSERT, UPDATE, UPDATE (name), DELETE, CREATE, ALTER ON `testdb`.`test1` TO 'grant'@'localhost'

3 rows in set (0.00 sec)

ERROR:

No query specified


1.7.1 回收部分权限

使用revoke 进行权限的回收


mysql> revoke select(id), update(name) ON  testdb.test1 from 'grant'@'localhost';

Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

在这里,我们需要知道MySQL权限机制中,在一个数据库上多次赋予权限,权限会自动合并;


mysql> show grants for 'grant'@'localhost' \G;

*************************** 1. row ***************************

Grants for grant@localhost: GRANT USAGE ON *.* TO 'grant'@'localhost'

*************************** 2. row ***************************

Grants for grant@localhost: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, LOCK TABLES, SHOW VIEW, TRIGGER ON `tesdb`.* TO 'grant'@'localhost'

2 rows in set (0.00 sec)

ERROR:

No query specified

1.7.2 回收部分权限(MySQL 8.0 新特性)

MySQL 数据库对于对象的操作级别分为:全局、数据库、表、字段等。粒度从粗到细。如果粗的粒度的权限满足了,将不再检验细粒度的级别,这种验证方式有的时候不方便,例如需要把 100 个数据库中除了某一个数据库外的访问权限赋予某个用户,需要进行 99 次赋权。从 MySQL 8.0.16 开始,MySQL 推出了一种部分权限回收(Partial Revokes)的功能,可以将粗粒度赋予的权限在细粒度上回收。


可以使用下面的命令将这个参数打开


mysql> SET PERSIST partial_revokes = ON;

Query OK, 0 rows affected (0.00 sec)


我们创建一个'test'@'localhost'用户


mysql> create user 'test'@'localhost' identified by '123456';

Query OK, 0 rows affected (0.01 sec)


下面的命令赋予用户 'test'@'localhost'对除了 mysql 之外的所有数据库和下面的表的 select 权限:


mysql> grant select on *.* to 'test'@'localhost';

Query OK, 0 rows affected (0.01 sec)

mysql> revoke select on mysql.* from 'test'@'localhost';

Query OK, 0 rows affected (0.01 sec)


赋权完成后可以使用 show grants 命令进行检查:


mysql> show grants for 'test'@'localhost';

+----------------------------------------------------+

| Grants for test@localhost                          |

+----------------------------------------------------+

| GRANT SELECT ON *.* TO `test`@`localhost`          |

| REVOKE SELECT ON `mysql`.* FROM `test`@`localhost` |

+----------------------------------------------------+

2 rows in set (0.00 sec)


权完成后在 mysql.user 表里面的 User_attributes 会有 Restrictions 的属性:


mysql> select  User_attributes from mysql.user where user='test';

+---------------------------------------------------------------------+

| User_attributes                                                     |

+---------------------------------------------------------------------+

| {"Restrictions": [{"Database": "mysql", "Privileges": ["SELECT"]}]} |

+---------------------------------------------------------------------+

1 row in set (0.00 sec)


回收部分权限回收功能可以再次赋予部分权限,例如:


mysql> grant select on *.* to 'test'@'localhost';

Query OK, 0 rows affected (0.01 sec)

mysql> show grants for 'test'@'localhost';

+----------------------------------------------------+

| Grants for test@localhost                          |

+----------------------------------------------------+

| GRANT SELECT ON *.* TO `test`@`localhost`          |

+----------------------------------------------------+

1 rows in set (0.00 sec)


也可以从粗粒度上回收权限,这样细粒度的回收当然没有必要存在了


mysql> revoke all privileges on *.* from 'test'@'localhost';

Query OK, 0 rows affected (0.00 sec)

mysql> show grants for 'test'@'localhost';

+------------------------------------------+

| Grants for test@localhost                |

+------------------------------------------+

| GRANT USAGE ON *.* TO `test`@`localhost` |

+------------------------------------------+

1 row in set (0.00 sec)


1.7.3 回收全部权限

mysql> revoke all privileges on *.* from 'grant'@'localhost';

Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)


查询用户权限


mysql> show grants for 'grant'@'localhost' \G;

*************************** 1. row ***************************

Grants for grant@localhost: GRANT USAGE ON *.* TO 'grant'@'localhost'

*************************** 2. row ***************************

Grants for grant@localhost: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, LOCK TABLES, SHOW VIEW, TRIGGER ON `tesdb`.* TO 'grant'@'localhost'

2 rows in set (0.00 sec)

ERROR:


是不是很意外,按照我们的思路,'grant'@'localhost'用户应该没有权限,但是在这里revoke说它干不了这活,加钱也干不了。。。查阅了很多资料:MySQL权限机制中,在一个数据库上多次赋予权限,权限会自动合并;但在多个库上多次赋予权限,每个库上都会认为是单独的一组权限。若要收回,必须单独对相应的库使用revoke命令。看来 revoke也有划水摸鱼的时候。但是在8.0 版本中,好像被优化了。我们只能再次回收库级别权限


mysql> revoke select, insert, update, delete, create, alter, lock tables, show view, trigger on tesdb.* from 'grant'@'localhost';

Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

mysql> show grants for 'grant'@'localhost' \G;

*************************** 1. row ***************************

Grants for grant@localhost: GRANT USAGE ON *.* TO 'grant'@'localhost'

1 row in set (0.00 sec)

ERROR:

No query specified


1.8 MySQL权限(MySQL 8.0 新特性)

权限列表大体分为服务级别和表级别,列级别以及大而广的角色(也是MySQL 8.0 新增)存储程序等权限。我们看到有一个特殊的 SUPER 权限,可以做好多个操作。比如 SET 变量,在从机重新指定相关主机信息以及清理二进制日志等。那这里可以看到,SUPER 有点太过强大,导致了仅仅想实现子权限变得十分困难,比如用户只能 SET 变量,其他的都不想要。那么 MySQL 8.0 之前没法实现,权限的细分不够明确,容易让非法用户钻空子。那么 MySQL 8.0 把权限细分为静态权限和动态权限


1.8.1 mysql 8.0 静态权限汇总

MySQL服务器内置了静态特权,下表描述了MySQL中可用的每个静态特权在这里我把权限划分为Server、Table、Column、Rose&User、Stored routine等


权限 对应user表中的字段 权限描述 权限划分 全局级权限 库级权限 表级权限 列级权限 备注

usag  该权限只能用于数据库登录,不能执行任何操作 Server     且该权限不能被回收,即使使用REVOKE也不能删除用户权限

All或者All privileges  所有的权限名 Server    × 影响除 with grant option 之外的所有权限

Super Super_priv 管理员级命令的使用,如change master to、kill、thread、mysqladmin、debug、purge master log 和set global等 Server √ × × × mysql 8.0中动态权限就是对 SUPER 权限的细分。 SUPER 权限在未来将会被废弃掉,授予管理员除外的用户存在严重的安全隐患

file File_priv 执行select …into outfile,load data infile…操作 Server √ × × × 授予管理员除外的用户存在严重的安全隐患

process Process_priv 查看所有用户线程和连接的权限 Server √ × × × 授予管理员除外的用户存在严重的安全隐患

reload Reload_priv 必须拥有reload权限,才能flush tables、logs、privileges Server √ × × ×

replication slave Repl_slave_priv 拥有此权限可以查看从服务器,从主服务器读取二进制日志 Server √ × × ×

replication client Repl_client_priv 允许执行show master status, show slave status, show binary logs Server √ × × ×

shutdown Shutdown_priv 关闭mysql的权限 Server √ × × ×

show database Show_db_priv 查看拥有的数据库 Server √ × × ×

event Event_priv 表示拥有创建,修改,执行和删除事件(event)的权限 Server √ √ × ×

lock tables Lock_tables_priv 锁表的权限 Server √ √ × ×

select Select_priv 查看表 Table √ √ √ √ 权限的后面需要加上列名列表 column-list

insert Insert_priv 插入权限 Table √ √ √ √ 权限的后面需要加上列名列表 column-list。

update Update_priv 修改表数据 Table √ √ √ √ 权限的后面需要加上列名列表 column-list。

delete Delete_priv 删除行权限 Table √ √ √ ×

create Create_priv 创建表的权限 Table √ √ √ ×

drop Drop_priv 删除库,表,索引,视图 Table √ √ √ ×

references References_priv 用户可以将其他的一个字段作为某一个表的外键约束 Table √ √ √ ×

index Index_priv 必须拥有index权限,才能执行create index或者drop index Table √ √ √ ×

alter Alter_priv 修改表的结构 Table √ √ √ ×

create view Create_view_priv 创建视图 Table √ √ √ ×

show view Show_view_priv 查看视图 Table √ √ √ ×

trigger Trigger_priv 允许创建,删除,执行,显示触发器的权限 Table √ √ √ ×

create temporay tables Create_tmp_table_priv 创建临时表 Table √ √ × ×

create routine Create_routine_priv 创建存储函数或者存储过程的权限 Stored routine √ √ × ×

alter routine Alter_routine_priv 更改或者删除存储函数或者存储过程 Stored routine √ √ × ×

excute Execute_priv 以用户执行存储过程的权限 Stored routine √ √ × ×

create user Create_user_priv 用户可以创建和删除新用户的权限 Rose&User √ × × ×

grant option Grant_priv 拥有grant option,就可以将自己拥有的权限授予给其他用户 Rose&User √ × × × 授予权限 语句后面跟with grant option

create role Create_role_priv 创建角色 Rose&User √ × × × MySQL 8.0 新特性

drop role Drop_role_priv 删除角色 Rose&User √ × × × MySQL 8.0 新特性

管理权限也就是全局权限(如 super, process, file等)不能够指定某个数据库,on后面必须跟 *.*

其实truncate权限就是create+drop,这点需要注意


1.8.2 动态权限汇总

与在服务器中内置的静态特权相反,动态特权是在运行时定义的。下表描述了MySQL中可用的每个动态特权。大多数动态特权是在服务器启动时定义的。其他特权由特定的服务器组件或插件定义,如特权描述中所述。在这种情况下,除非启用了定义特权的组件或插件,否则特权不可用。


权限 权限描述

connection_admin 允许使用KILL语句或mysqladmin kill命令杀死属于其他帐户的线程

encryption_key_admin 启用InnoDB加密密钥轮换

firewall_exempt 免除用户防火墙限制。该权限由MYSQL_FIREWALL插件定义;

flush_optimizer_costs 启用优化程序成本重新加载

flush_status 启用状态指示灯刷新

flush_tables 启用表刷新

flush_user_resources 启用用户资源刷新

group_replication_admin 启动组复制

group_replication_stream 启用连接安全管理的通信堆栈

innodb_redo_log_archive 启用重做日志存档管理

innodb_redo_log_enable 启用或禁用重做日志记录

passwordless_user_admin 启用无密码用户帐户管理

persist_ro_variables_admin 启用持久化只读系统变量

replication_applier 允许该帐户充当PRIVILEGE_CHECKS_USER复制通道的帐户,并执行mysqlbinlog输出中的BINLOG语句

replication_slave_admin 启用常规复制控制,使帐户能够连接到主服务器,使用START SLAVE和STOP SLAVE语句启动和停止复制,以及使用CHANGE MASTER TO和CHANGE REPLICATION FILTER语句。

resource_group_admin 启用资源组管理,包括创建,更改和删除资源组,以及将线程和语句分配给资源组

resource_group_user 允许将线程和语句分配给资源组

role_admin 启用要授予或撤消的角色 with admin option

sensitive_variables_observer 可以性能模式系统变量表的权限

service_connection_admin 启用到仅允许管理连接的网络接口的连接

session_variables_admin 启用设置受限会话系统变量

set_user_id 启用设置非自身值

show_routine 启用对存储的例程定义的访问

system_user 将帐户指定为系统帐户

system_variables_admin 启用修改或保留全局系统变量

table_encryption_admin 启用覆盖默认加密设置

xa_recover_admin 启用 XA 恢复执行

这些权限只能后面慢慢测试了


1.8.2 权限授权和回收技巧

授予权限

grant 权限1…权限n on dbname.tablename to user;

回收权限

revoke 权限1…权限n on dbname.tablename from user;


也就是grant对应的revoke,to对应的from


二、角色管理(MySQL 8.0 新特性)

角色是在MySQL8.0中引入的新功能。在MySQL中,角色是权限的集合,可以为角色添加或移除权限。用户可以被赋予角色,同时也被授予角色包含的权限。对角色进行操作需要较高的权限。并且像用户账户一样,角色可以拥有授予和撤消的权限。引入角色的目的是方便管理拥有相同权限的用户。恰当的权限设定,可以确保数据的安全性,这是至关重要的。


2.1 创建角色并授予权限

我们使用create role创建角色


mysql> create role 'dba_role','write_role','read_role';

Query OK, 0 rows affected (0.02 sec)

授予权限

mysql> grant all on *.* to 'dba_role';

Query OK, 0 rows affected (0.01 sec)

mysql> grant select  on *.* to 'read_role';

Query OK, 0 rows affected (0.01 sec)

mysql> grant update,delete,insert  on *.* to 'write_role';

Query OK, 0 rows affected (0.01 sec)

将角色授予对应的用户

mysql> create user dba1 identified by '123456';

Query OK, 0 rows affected (0.01 sec)

mysql> grant 'dba_role' to 'dba1'@'%';

Query OK, 0 rows affected (0.01 sec)

在GRANT授权角色的语法和授权用户的语法不同:有一个ON来区分角色和用户的授权,有ON的为用户授权,而没有ON用来分配角色。由于语法不同,因此不能在同一语句中混合分配用户权限和角色。(允许为用户分配权限和角色,但必须使用单独的GRANT语句,每种语句的语法都要与授权的内容相匹配)

2.2 检查角色权限

要验证分配给用户的权限,使用 SHOW GRANTS,例如:

mysql> SHOW GRANTS FOR 'dba1'@'%';

+------------------------------------+

| Grants for dba1@%                  |

+------------------------------------+

| GRANT USAGE ON *.* TO `dba1`@`%`   |

| GRANT `dba_role`@`%` TO `dba1`@`%` |

+------------------------------------+

2 rows in set (0.00 sec)

但是,它会显示每个授予的角色,而不会将其显示为角色所代表的权限。如果要显示角色权限,添加一个 USING来显示:


mysql> SHOW GRANTS FOR 'dba1'@'%'  USING 'dba_role' \G;

*************************** 1. row ***************************

Grants for dba1@%: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `dba1`@`%`

*************************** 2. row ***************************

Grants for dba1@%: GRANT APPLICATION_PASSWORD_ADMIN,AUDIT_ABORT_EXEMPT,AUDIT_ADMIN,AUTHENTICATION_POLICY_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,CLONE_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,FIREWALL_EXEMPT,FLUSH_OPTIMIZER_COSTS,FLUSH_STATUS,FLUSH_TABLES,FLUSH_USER_RESOURCES,GROUP_REPLICATION_ADMIN,GROUP_REPLICATION_STREAM,INNODB_REDO_LOG_ARCHIVE,INNODB_REDO_LOG_ENABLE,PASSWORDLESS_USER_ADMIN,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_APPLIER,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SENSITIVE_VARIABLES_OBSERVER,SERVICE_CONNECTION_ADMIN,SESSION_VARIABLES_ADMIN,SET_USER_ID,SHOW_ROUTINE,SYSTEM_USER,SYSTEM_VARIABLES_ADMIN,TABLE_ENCRYPTION_ADMIN,XA_RECOVER_ADMIN ON *.* TO `dba1`@`%`

*************************** 3. row ***************************

Grants for dba1@%: GRANT `dba_role`@`%` TO `dba1`@`%`

3 rows in set (0.00 sec)


2.3 撤消角色或角色权限

revoke 可以用于角色修改角色权限。这不仅影响角色本身权限,还影响任何授予该角色的用户权限。

假设让所有用户只读,使用revoke 从该dba_ro le角色中删除修改权限 :


mysql> revoke inster, update, delete on *.* from 'dba_role';

Query OK, 0 rows affected, 1 warning (0.02 sec)

正如可以授权某个用户的角色一样,可以从帐户中撤销这些角色:


mysql> revoke dba_role from dba1@'%';

Query OK, 0 rows affected (0.00 sec)

mysql> SHOW GRANTS FOR 'dba1'@'%';

+----------------------------------+

| Grants for dba1@%                |

+----------------------------------+

| GRANT USAGE ON *.* TO `dba1`@`%` |

+----------------------------------+

1 row in set (0.00 sec)


2.4 删除角色

要删除角色,请使用drop role:


mysql> drop role dba_role;

Query OK, 0 rows affected (0.01 sec)

删除角色会从授权它的每个帐户中撤消该角色


三、资源限制

资源限制可以从以下4个方面限制


帐户每小时可发出的查询数量

帐户每小时可以发布的更新次数

帐户每小时可以连接到服务器的次数

帐户同时连接到服务器的数量


3.1 用户创建指定配额

mysql> create user 'test4'@'localhost' identified by '123456' WITH MAX_QUERIES_PER_HOUR 2 MAX_UPDATES_PER_HOUR 10 MAX_CONNECTIONS_PER_HOUR 5 MAX_USER_CONNECTIONS 2;

Query OK, 0 rows affected (0.03 sec)

3.2 修改配额

mysql> alter user 'test4'@'localhost' with MAX_QUERIES_PER_HOUR 100;

Query OK, 0 rows affected (0.01 sec)


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
28天前
|
存储 关系型数据库 MySQL
MySQL主从复制原理和使用
本文介绍了MySQL主从复制的基本概念、原理及其实现方法,详细讲解了一主两从的架构设计,以及三种常见的复制模式(全同步、异步、半同步)的特点与适用场景。此外,文章还提供了Spring Boot环境下配置主从复制的具体代码示例,包括数据源配置、上下文切换、路由实现及切面编程等内容,帮助读者理解如何在实际项目中实现数据库的读写分离。
MySQL主从复制原理和使用
|
20天前
|
关系型数据库 MySQL Docker
docker环境下mysql镜像启动后权限更改问题的解决
在Docker环境下运行MySQL容器时,权限问题是一个常见的困扰。通过正确设置目录和文件的权限,可以确保MySQL容器顺利启动并正常运行。本文提供了多种解决方案,包括在主机上设置正确的权限、使用Dockerfile和Docker Compose进行配置、在容器启动后手动更改权限以及使用 `init`脚本自动更改权限。根据实际情况选择合适的方法,可以有效解决MySQL容器启动后的权限问题。希望本文对您在Docker环境下运行MySQL容器有所帮助。
35 1
|
1月前
|
缓存 算法 关系型数据库
Mysql(3)—数据库相关概念及工作原理
数据库是一个以某种有组织的方式存储的数据集合。它通常包括一个或多个不同的主题领域或用途的数据表。
56 5
Mysql(3)—数据库相关概念及工作原理
|
23天前
|
SQL NoSQL 关系型数据库
|
1月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1641 14
|
30天前
|
存储 关系型数据库 MySQL
基于案例分析 MySQL 权限认证中的具体优先原则
【10月更文挑战第26天】本文通过具体案例分析了MySQL权限认证中的优先原则,包括全局权限、数据库级别权限和表级别权限的设置与优先级。全局权限优先于数据库级别权限,后者又优先于表级别权限。在权限冲突时,更严格的权限将被优先执行,确保数据库的安全性与资源合理分配。
|
28天前
|
SQL 关系型数据库 MySQL
Mysql中搭建主从复制原理和配置
主从复制在数据库管理中广泛应用,主要优点包括提高性能、实现高可用性、数据备份及灾难恢复。通过读写分离、从服务器接管、实时备份和地理分布等机制,有效增强系统的稳定性和数据安全性。主从复制涉及I/O线程和SQL线程,前者负责日志传输,后者负责日志应用,确保数据同步。配置过程中需开启二进制日志、设置唯一服务器ID,并创建复制用户,通过CHANGE MASTER TO命令配置从服务器连接主服务器,实现数据同步。实验部分展示了如何在两台CentOS 7服务器上配置MySQL 5.7主从复制,包括关闭防火墙、配置静态IP、设置域名解析、配置主从服务器、启动复制及验证同步效果。
Mysql中搭建主从复制原理和配置
|
1月前
|
SQL 关系型数据库 MySQL
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
尼恩,一位40岁的资深架构师,通过其丰富的经验和深厚的技術功底,为众多读者提供了宝贵的面试指导和技术分享。在他的读者交流群中,许多小伙伴获得了来自一线互联网企业的面试机会,并成功应对了诸如事务ACID特性实现、MVCC等相关面试题。尼恩特别整理了这些常见面试题的系统化解答,形成了《MVCC 学习圣经:一次穿透MYSQL MVCC》PDF文档,旨在帮助大家在面试中展示出扎实的技术功底,提高面试成功率。此外,他还编写了《尼恩Java面试宝典》等资料,涵盖了大量面试题和答案,帮助读者全面提升技术面试的表现。这些资料不仅内容详实,而且持续更新,是求职者备战技术面试的宝贵资源。
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
|
1月前
|
存储 SQL 关系型数据库
mysql中主键索引和联合索引的原理与区别
本文详细介绍了MySQL中的主键索引和联合索引原理及其区别。主键索引按主键值排序,叶节点仅存储数据区,而索引页则存储索引和指向数据域的指针。联合索引由多个字段组成,遵循最左前缀原则,可提高查询效率。文章还探讨了索引扫描原理、索引失效情况及设计原则,并对比了InnoDB与MyISAM存储引擎中聚簇索引和非聚簇索引的特点。对于优化MySQL性能具有参考价值。
|
2月前
|
安全 关系型数据库 MySQL
Navicat工具设置MySQL权限的操作指南
通过上述步骤,您可以使用Navicat有效地为MySQL数据库设置和管理用户权限,确保数据库的安全性和高效管理。这个过程简化了数据库权限管理,使其既直观又易于操作。
373 4