文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


7.1.16 资源组

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

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

例如,为了管理不需要高优先级执行的批处理作业,DBA 可以创建一个名为“Batch”的资源组,并根据服务器的繁忙程度向上或向下调整其优先级。(也许分配给该组的批处理作业应该在白天以较低的优先级运行,而在晚上以较高的优先级运行。)DBA 还可以调整该组可用的 CPU 集。可以启用或禁用组来控制是否可以将线程分配给它们。

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

重要

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

资源组元素

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

  • SQL 语句支持创建、更改和删除资源组,并支持将线程分配给资源组。优化器提示支持将单个语句分配给资源组。

  • 资源组权限控制哪些用户可以执行资源组操作。

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

  • 状态变量为每个管理 SQL 语句提供执行计数。

资源组属性

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

这些属性在资源组创建时定义,以后不能修改

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

  • 每个组都有一个类型,可以是 SYSTEMUSER。资源组类型会影响可分配给组的优先级值的范围,如下所述。此属性以及允许的优先级的差异使得可以识别系统线程,从而防止它们与用户线程争夺 CPU 资源。

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

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

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

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

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

    • 对于系统资源组,允许的优先级范围是 -20 到 0。

    • 对于用户资源组,允许的优先级范围是 0 到 19。

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

资源组管理

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

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

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

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

这些语句需要 RESOURCE_GROUP_ADMIN 权限。

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

这些操作需要 RESOURCE_GROUP_ADMINRESOURCE_GROUP_USER 权限。

资源组定义存储在 resource_groups 数据字典表中,以便组在服务器重新启动后仍然存在。因为 resource_groups 是数据字典的一部分,所以用户无法直接访问。可以使用信息架构 RESOURCE_GROUPS 表获取资源组信息,该表是数据字典表上的视图。请参阅第 28.3.26 节“INFORMATION_SCHEMA 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,请检查您的平台或系统配置是否限制了资源组功能;请参阅资源组限制

要将线程分配给 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 上不可用,因为它没有提供用于将 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。启用此功能时请务必小心。

    在使用 systemd 和内核支持环境功能(Linux 4.3 或更高版本)的 Linux 平台上,启用 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
    重要

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

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

    表 7.6 Windows 上的资源组线程优先级

    优先级范围 Windows 优先级级别
    -20 到 -10 THREAD_PRIORITY_HIGHEST
    -9 到 -1 THREAD_PRIORITY_ABOVE_NORMAL
    0 THREAD_PRIORITY_NORMAL
    1 到 10 THREAD_PRIORITY_BELOW_NORMAL
    11 到 19 THREAD_PRIORITY_LOWEST