Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL资源组

详解MySQL资源组的使用方法

作者:icysmile131

MySQL支持创建和管理资源组,并允许将服务器内运行的线程分配给特定的组,本文主要介绍了详解MySQL资源组的使用方法,具有一定的参考价值,感兴趣的可以了解一下

MySQL支持创建和管理资源组,并允许将服务器内运行的线程分配给特定的组,以便线程根据组可用的资源执行。组属性允许控制其资源,以启用或限制组中线程的资源消耗。DBA可以针对不同的工作负载适当地修改这些属性。

目前,CPU时间是一种可管理的资源,以“虚拟CPU”的概念表示,该概念包括CPU核心、超线程、硬件线程等。服务器在启动时确定有多少虚拟CPU可用,具有适当权限的数据库管理员可以将这些CPU与资源组相关联,并将线程分配给组。

例如,为了管理不需要以高优先级执行的批处理作业的执行,DBA可以创建一个批处理资源组,并根据服务器的繁忙程度调整其优先级。可以启用或禁用组来控制线程是否可分配给它们。

以下部分描述了MySQL中资源组使用的各个方面:

1 资源组元素

这些功能为MySQL中的资源组管理提供了SQL接口:

2 资源组属性

资源组具有定义该组的属性。所有属性都可以在组创建时设置。某些属性在创建时是固定的;其他可以在此后的任何时间进行修改。

这些属性是在创建资源组时定义的,不能修改:

系统和用户线程对应于性能模式线程表中列出的后台和前台线程。

这些属性是在资源组创建时定义的,此后可以随时修改:

允许系统组的优先级高于用户组,确保用户线程的优先级永远不会高于系统线程:

(1)对于系统资源组,允许的优先级范围为-20到0。

(2)对于用户资源组,允许的优先级范围为0到19。

3 资源组管理

默认情况下,有一个系统组和一个用户组,分别命名为SYS_default和USR_default。不能删除这些默认组,也不能修改它们的属性。每个默认组都没有CPU相关性,优先级为0。

新创建的系统线程和用户线程分别分配给SYS_default和USR_default组。

对于用户定义的资源组,所有属性都在组创建时指定。创建组后,可以修改其属性,但名称和类型属性除外。

要创建和管理用户定义的资源组,请使用以下SQL语句:

这些语句需要RESOURCE_GROUP_ADMIN权限。

要管理资源组分配,请使用以下功能:

这些操作需要RESOURCE_GROUP_ADMIN或RESOURCE-GROUP_USER权限。

资源组定义存储在Resource_groups数据字典表中,以便组在服务器重新启动时保持不变。因为resource_groups是数据字典的一部分,所以用户无法直接访问它。使用信息模式Resource_GROUPS表可以获得资源组信息,该表被实现为数据字典表上的视图。

最初,RESOURCE_GROUPS表中有以下行描述默认组:

mysql> SELECT * FROM INFORMATION_SCHEMA.RESOURCE_GROUPS\G
*************************** 1. row ***************************
   RESOURCE_GROUP_NAME: USR_default
   RESOURCE_GROUP_TYPE: USER
RESOURCE_GROUP_ENABLED: 1
              VCPU_IDS: 0-3
       THREAD_PRIORITY: 0
*************************** 2. row ***************************
   RESOURCE_GROUP_NAME: SYS_default
   RESOURCE_GROUP_TYPE: SYSTEM
RESOURCE_GROUP_ENABLED: 1
              VCPU_IDS: 0-3
       THREAD_PRIORITY: 0

THREAD_PRIORITY值为0,表示默认优先级。VCPU_IDS值显示了包括所有可用CPU的范围。对于默认组,显示的值因MySQL服务器运行的系统而异。

前面的讨论提到了一个场景,该场景涉及一个名为Batch的资源组来管理不需要高优先级执行的批处理作业的执行。要创建这样一个组,请使用类似以下的语句:

CREATE RESOURCE GROUP Batch
  TYPE = USER
  VCPU = 2-3            -- assumes a system with at least 4 CPUs
  THREAD_PRIORITY = 10;

要验证资源组是否按预期创建,请检查resource_GROUPS表:

mysql> SELECT * FROM INFORMATION_SCHEMA.RESOURCE_GROUPS
       WHERE RESOURCE_GROUP_NAME = 'Batch'\G
*************************** 1. row ***************************
   RESOURCE_GROUP_NAME: Batch
   RESOURCE_GROUP_TYPE: USER
RESOURCE_GROUP_ENABLED: 1
              VCPU_IDS: 2-3
       THREAD_PRIORITY: 10

如果THREAD_PRIORITY值为0而不是10,请检查您的平台或系统配置是否限制了资源组功能;请参阅资源组限制。

要将线程分配给批处理组,请执行以下操作:

SET RESOURCE GROUP Batch FOR thread_id;

此后,命名线程中的语句将使用批处理组资源执行。

如果会话自己的当前线程应该在Batch组中,请在会话中执行以下语句:

SET RESOURCE GROUP Batch;

此后,会话中的语句将使用批处理组资源执行。

要使用Batch组执行单个语句,请使用RESOURCE_group优化器提示:

INSERT /*+ RESOURCE_GROUP(Batch) */ INTO t2 VALUES(2);

分配给批处理组的线程使用其资源执行,可以根据需要进行修改:

ALTER RESOURCE GROUP Batch
  VCPU = 3
  THREAD_PRIORITY = 19;
ALTER RESOURCE GROUP Batch
  VCPU = 0-3
  THREAD_PRIORITY = 0;

4 资源组复制

资源组管理是发生该管理的服务器的本地管理。资源组SQL语句和对Resource_groups数据字典表的修改不会写入二进制日志,也不会被复制。

5 资源组限制

在某些平台或MySQL服务器配置上,资源组不可用或有限制:

如果安装了线程池插件,则资源组不可用。

资源组在macOS上不可用,macOS不提供将CPU绑定到线程的API。

在FreeBSD和Solaris上,资源组线程优先级被忽略。(实际上,所有线程都以优先级0运行。)尝试更改优先级会导致警告:

mysql> ALTER RESOURCE GROUP abc THREAD_PRIORITY = 10;
Query OK, 0 rows affected, 1 warning (0.18 sec)

mysql> SHOW WARNINGS;
+---------+------+-------------------------------------------------------------+
| Level   | Code | Message                                                     |
+---------+------+-------------------------------------------------------------+
| Warning | 4560 | Attribute thread_priority is ignored (using default value). |
+---------+------+-------------------------------------------------------------+

在使用systemd和内核支持Ambient Capabilities(Linux 4.3或更新版本)的Linux平台上,建议启用CAP_SYS_NICE功能的方法是修改MySQL服务文件并保持mysqld二进制文件不变。要调整MySQL的服务文件,请使用以下过程:

(1)为您的平台运行适当的命令:

a, Oracle Linux、Red Hat和Fedora系统:

$> sudo systemctl edit mysqld

b. SUSE、Ubuntu和Debian系统:

$> sudo systemctl edit mysql

(2)使用编辑器,将以下文本添加到服务文件中:

[Service]
AmbientCapabilities=CAP_SYS_NICE

(3)重新启动MySQL服务

如果不能像刚才描述的那样启用CAP_SYS_NICE功能,可以使用setcap命令手动设置它,指定mysqld可执行文件的路径名(这需要sudo访问权限)。您可以使用getcap检查功能。例如:

$> sudo setcap cap_sys_nice+ep /path/to/mysqld
$> getcap /path/to/mysqld
/path/to/mysqld = cap_sys_nice+ep

作为一项安全措施,将mysqld二进制文件的执行限制为root用户和具有mysql组成员身份的用户:

$> sudo chown root:mysql /path/to/mysqld
$> sudo chmod 0750 /path/to/mysqld

如果需要手动使用setcap,则必须在每次重新安装后进行。

在Windows上,线程以五个线程优先级之一运行。资源组线程优先级范围-20到19映射到下表所示的级别。

到此这篇关于详解MySQL资源组的使用方法的文章就介绍到这了,更多相关MySQL资源组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

您可能感兴趣的文章:
阅读全文