数据库运维
记录DBA学习成长历程

13.DCL数据控制语言与资源组管理

文章目录

1 用户及权限、角色管理

ALTER USER
CREATE ROLE
CREATE USER
DROP ROLE
DROP USER
GRANT
RENAME USER
REVOKE
SET DEFAULT ROLE
SET PASSWORD
SET ROLE

2 资源组管理(新特性)

—2.1 资源组介绍

MySQL是单进程多线程的程序,MySQL线程包括后台线程(Master Thread、IO Thread、 Purge Thread等),以及用户线程。在8.0之前,所有线程的优先级都是一样的,并且 所有的线程的资源都是共享的。但是在MySQL 8.0之后,由于Resource Group特性的引入,我们可以来通过资源组的方式修改线程的优先级以及所能使用的资源,可以指定不同的线程使用特定的资源。

在目前版本中DBA只能操控CPU资源,并且控制的最小力度为vCPU,即操作系统逻辑CPU核数(可以通过lscpu命令查看可控制CPU总数)。

DBA经常会遇到需要执行跑批任务的需求,这种跑批的SQL一般都是很 复杂、运行时间长、消耗资源多的SQL。

所以很多跑批任务都是在业务低峰期的时候执行,并且在从库上执行,尽可能降低对业务 产生影响。但是对于一些数据一致性比较高的跑批任务,需要在主库上执行,在跑批任务 运行的过程中很容易影响到其他线程的运行。那么现在Resource Group就是DBA的福音了, 我们可以对跑批任务指定运行的资源组,限制任务使用的资源,减少对其他线程的影响。

INFORMATION_SCHEMA库下的RESOURCE_GROUPS表中记录了所有定义的资源组的情况: 
mysql> select * from information_schema.resource_groups;
+---------------------+---------------------+------------------------+--------------------+-----------------+
| RESOURCE_GROUP_NAME | RESOURCE_GROUP_TYPE | RESOURCE_GROUP_ENABLED | VCPU_IDS | THREAD_PRIORITY |
+---------------------+---------------------+------------------------+--------------------+-----------------+
| USR_default | USER | 1 | 0x302D31 | 0 |
| SYS_default | SYSTEM | 1 | 0x302D31 | 0 |
+---------------------+---------------------+------------------------+--------------------+-----------------+
2 rows in set (0.00 sec)

MySQL8.0默认会创建两个资源组,一个是USR_default另一个是SYS_default。 
PERFORMANCE_SCHEMA库下的THREADS表中,可以查看当前线程使用资源组的情况: 
select * from performance_schema.threads limit 5;

—2.2 资源组创建

MySQL8.0.16版本中新增了一个system_user帐户类型,我们需要把权限给添加进去,使用下方的代码,此处的root可以是你当前使用的账户
grant system_user on *.* to 'root';
grant RESOURCE_GROUP_ADMIN on *.* to root@'%';

CREATE RESOURCE GROUP oldguo
TYPE = USER 
VCPU = 0 
THREAD_PRIORITY = 10;
说明: 
oldguo 为资源组名字
type=user 来源是用户端的慢SQL 
vcpu=0 给它分配到哪个CPU核上(你可以用cat /proc/cpuinfo | grep processor查看CPU有多少核), 或者使用top查看哪个核心较为空闲
thread_priority为优先级别,范围是0到19,19是最低优先级,0是最高优先级。

—2.3 资源组应用

将创建的oldguo资源组绑定到执行的线程上,有两种方式: 
方式一: 从PERFORMANCE_SCHEMA.THREADS表中查找需要绑定执行的线程ID 
mysql> select * from performance_schema.threads where TYPE='FOREGROUND'; 
SET RESOURCE GROUP oldguo FOR 65; 

方式二: 采用Optimizer Hints的方式指定SQL使用的资源组: 
SELECT /*+ RESOURCE_GROUP(oldguo) */ * FROM t2 ;

—2.4 资源组修改及删除

修改资源组配置: 
可能跑批任务使用CPU资源不够,那就需要修改资源组的配置。 
ALTER RESOURCE GROUP oldguo VCPU = 10-20; 

修改资源组优先级: 
ALTER RESOURCE GROUP oldguo THREAD_PRIORITY = 5; 

禁止使用资源组: 
ALTER RESOURCE GROUP oldguo DISABLE FORCE; 

删除资源组: 
对于不用的资源组可以删除 
DROP RESOURCE GROUP oldguo;

—2.5 资源组使用限制

Linux 平台上需要开启 CAP_SYS_NICE 特性才能使用RESOURCE GROUP 

检查mysqld进程是否开启CAP_SYS_NICE特性 
getcap /usr/local/mysql/bin/mysqld 
给mysqld进程开启CAP_SYS_NICE特性 
setcap cap_sys_nice+ep /usr/local/mysql/bin/mysqld

或者: 
systemctl edit mysqld 
[Service] 
AmbientCapabilities=CAP_SYS_NICE

另外: 
mysql 线程池开启后RG失效。 
freebsd,solaris 平台thread_priority 失效。 
目前只能绑定CPU,不能绑定其他资源。
赞(2)
MySQL学习笔记 » 13.DCL数据控制语言与资源组管理