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

简介: 在学习这一章节的时候,我们可以先了解一下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)


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
5月前
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
3月前
|
Ubuntu 安全 关系型数据库
安装与配置MySQL 8 on Ubuntu,包括权限授予、数据库备份及远程连接指南
以上步骤提供了在Ubuntu上从头开始设置、配置、授权、备份及恢复一个基础但完整的MySQL环境所需知识点。
443 7
|
9月前
|
自然语言处理 搜索推荐 关系型数据库
MySQL实现文档全文搜索,分词匹配多段落重排展示,知识库搜索原理分享
本文介绍了在文档管理系统中实现高效全文搜索的方案。为解决原有ES搜索引擎私有化部署复杂、运维成本高的问题,我们转而使用MySQL实现搜索功能。通过对用户输入预处理、数据库模糊匹配、结果分段与关键字标红等步骤,实现了精准且高效的搜索效果。目前方案适用于中小企业,未来将根据需求优化并可能重新引入专业搜索引擎以提升性能。
428 5
|
5月前
|
SQL 关系型数据库 MySQL
MySQL group by 底层原理详解。group by 执行 慢 原因深度分析。(图解+秒懂+史上最全)
MySQL group by 底层原理详解。group by 执行 慢 原因深度分析。(图解+秒懂+史上最全)
MySQL group by 底层原理详解。group by 执行 慢 原因深度分析。(图解+秒懂+史上最全)
|
10月前
|
关系型数据库 MySQL 数据库
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
随着数据量增长和业务扩展,单个数据库难以满足需求,需调整为集群模式以实现负载均衡和读写分离。MySQL主从复制是常见的高可用架构,通过binlog日志同步数据,确保主从数据一致性。本文详细介绍MySQL主从复制原理及配置步骤,包括一主二从集群的搭建过程,帮助读者实现稳定可靠的数据库高可用架构。
582 9
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
|
10月前
|
SQL 存储 关系型数据库
MySQL主从复制 —— 作用、原理、数据一致性,异步复制、半同步复制、组复制
MySQL主从复制 作用、原理—主库线程、I/O线程、SQL线程;主从同步要求,主从延迟原因及解决方案;数据一致性,异步复制、半同步复制、组复制
1105 11
|
11月前
|
SQL 关系型数据库 MySQL
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
597 7
MySQL事务日志-Undo Log工作原理分析
|
10月前
|
存储 缓存 关系型数据库
MySQL进阶突击系列(08)年少不知BufferPool核心原理 | 大哥送来三条大金链子LRU、Flush、Free
本文深入探讨了MySQL中InnoDB存储引擎的buffer pool机制,包括其内存管理、数据页加载与淘汰策略。Buffer pool作为高并发读写的缓存池,默认大小为128MB,通过free链表、flush链表和LRU链表管理数据页的存取与淘汰。其中,改进型LRU链表采用冷热分离设计,确保预读机制不会影响缓存公平性。文章还介绍了缓存数据页的刷盘机制及参数配置,帮助读者理解buffer pool的运行原理,优化MySQL性能。
|
11月前
|
SQL 关系型数据库 MySQL
MySQL派生表合并优化的原理和实现
通过本文的详细介绍,希望能帮助您理解和实现MySQL中派生表合并优化,提高数据库查询性能。
302 16
|
11月前
|
SQL 关系型数据库 MySQL
MySQL派生表合并优化的原理和实现
通过本文的详细介绍,希望能帮助您理解和实现MySQL中派生表合并优化,提高数据库查询性能。
159 7