Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


7.1.16 资源组

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

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

例如,DBA 可以创建一个Batch资源组,并根据服务器的繁忙程度调整优先级。 (可能在白天,批处理作业分配到组中,运行在较低优先级;在夜晚,运行在较高优先级。) DBA 还可以调整组中的可用 CPU 数量。组可以启用或禁用,以控制线程是否可以分配到组中。

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

Important

在某些平台或 MySQL 服务器配置中,资源组可能不可用或有限制。特别是 Linux 系统可能需要手动步骤来安装某些方法。详细信息,请见资源组限制

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

  • SQL 语句使得可以创建、修改和删除资源组,并将线程分配到资源组中。optimizer 提示使得可以将单个语句分配到资源组中。

  • 资源组权限提供了对用户可以执行资源组操作的控制。

  • 信息_schema RESOURCE_GROUPS 表公开了资源组定义的信息,而性能_schema threads 表显示了每个线程的资源组分配。

  • 状态变量提供了每个管理 SQL 语句的执行次数。

资源组具有定义组的属性。所有属性都可以在组创建时设置。一些属性在创建时是固定的,其他的可以在任何时候修改。

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

  • 每个组都有一个名称。资源组名称是标识符,如表和列名称,不需要在SQL语句中加引号,除非名称包含特殊字符或是保留字。组名称不区分大小写且最长64个字符。

  • 每个组都有一个类型,类型是SYSTEMUSER。资源组类型影响了组的优先级范围,因为后者将影响系统线程和用户线程的优先级。

    系统线程和用户线程对应于背景线程和前台线程,如性能_schemathreads表中所列。

这些属性是在资源组创建时定义的且可以在任何时候修改:

  • CPU亲和力是资源组可以使用的虚拟CPU集。亲和力可以是可用的CPU的非空子集。如果组没有亲和力,它可以使用所有可用的CPU。

  • 线程优先级是分配给资源组的线程的执行优先级。优先级范围从-20(最高优先级)到19(最低优先级)。默认优先级是0,系统和用户组都相同。

    系统组允许的优先级范围是-20到0,而用户组的优先级范围是0到19。

    • 每个组都可以启用或禁用,管理员可以控制线程分配。线程只能分配给启用的组。

    • 默认情况下,有一个系统组和一个用户组,名为SYS_defaultUSR_default,它们不能被删除且不能修改。每个默认组都没有CPU亲和力和优先级0。

  • 新创建的系统和用户线程将被分配到SYS_defaultUSR_default组中。

对于自定义资源组,所有属性都是在组创建时设置的。组创建后,属性可以修改,除了名称和类型属性。

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

CREATE RESOURCE GROUP创建一个新的组。见Section 15.7.2.2, “CREATE RESOURCE GROUP Statement”

For user-defined resource groups, all attributes are assigned at group creation time. After a group has been created, its attributes can be modified, with the exception of the name and type attributes.

To create and manage user-defined resource groups, use these SQL statements:

这些语句需要RESOURCE_GROUP_ADMIN特权。

为了管理资源组分配,使用这些能力:

这些操作需要RESOURCE_GROUP_ADMINRESOURCE_GROUP_USER特权。

资源组定义存储在resource_groups数据字典表中,以便组在服务器重启后仍然存在。因为resource_groups是数据字典的一部分,因此用户不能直接访问。资源组信息可以使用信息SchemaRESOURCE_GROUPS表获取,该表实现为数据字典表的视图。见第28.3.26节,“The INFORMATION_SCHEMA RESOURCE_GROUPS Table”

初始,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

The THREAD_PRIORITY values are 0, indicating the default priority. The VCPU_IDS values show a range comprising all available CPUs. For the default groups, the displayed value varies depending on the system on which the MySQL server runs.

Earlier discussion mentioned a scenario involving a resource group named Batch to manage execution of batch jobs that need not execute with high priority. To create such a group, use a statement similar to this:

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

To verify that the resource group was created as expected, check the RESOURCE_GROUPS table:

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,请检查您的平台或系统配置是否限制了资源组的能力;见资源组限制

要将线程分配到Batch组中,请执行以下操作:

SET RESOURCE GROUP Batch FOR thread_id;

然后,在命名线程中执行的语句将使用Batch组资源。

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

SET RESOURCE GROUP Batch;

然后,在会话中执行的语句将使用Batch组资源。

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

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

分配到Batch组的线程将使用其资源,可以根据需要进行修改:

  • 在系统高度负载时,减少分配给组的CPU数量,降低优先级或(如图所示)同时执行:

    ALTER RESOURCE GROUP Batch
      VCPU = 3
      THREAD_PRIORITY = 19;
  • 在系统轻负载时,增加分配给组的CPU数量,提高优先级或(如图所示)同时执行:

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

资源组复制

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

在某些平台或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). |
    +---------+------+-------------------------------------------------------------+
  • 在Linux上,资源组线程优先级被忽略,除非设置了CAP_SYS_NICE能力。授予CAP_SYS_NICE能力可以启用一系列权限;请参阅http://man7.org/linux/man-pages/man7/capabilities.7.html以获取完整列表。请小心启用此能力。

    在Linux平台上使用systemd和kernel支持 Ambient Capabilities(Linux 4.3或更高版本),启用CAP_SYS_NICE能力的推荐方法是修改MySQL服务文件,并保持mysqld二进制文件不变。要调整MySQL服务文件,请执行以下步骤:

    1. 运行适用于您的平台的命令:

      • Oracle Linux、Red Hat和Fedora系统:

        $> sudo systemctl edit mysqld
      • 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
    Important

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

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

    表7.6 Windows 资源组线程优先级

    Priority Range Windows Priority Level
    -20 to -10 THREAD_PRIORITY_HIGHEST
    -9 to -1 THREAD_PRIORITY_ABOVE_NORMAL
    0 THREAD_PRIORITY_NORMAL
    1 to 10 THREAD_PRIORITY_BELOW_NORMAL
    11 to 19 THREAD_PRIORITY_LOWEST