一、用户权限管理
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)