MySQL资源组的创建、修改和删除(附带实例)
MySQL 中有一个资源组功能,用于调控线程优先级以及绑定 CPU。MySQL 用户需要有 RESOURCE_GROUP_ADMIN 权限才能创建、修改、删除资源组。
注意,在 Linux 环境下,MySQL 进程需要有 CAP_SYS_NICE 权限才能使用资源组的完整功能:
MySQL 默认提供两个资源组,分别是 USR_default 和 SYS_default。下面来讲述资源组的常用操作。
1) 创建名称为“my_resouce_group”的资源组,SQL 语句如下:
2) 将当前线程加入资源组,SQL 语句如下:
3) 查看资源组my_resouce_group中包含的线程,SQL 语句如下:
4) 资源组里有线程时,删除资源组会报错:
5) 修改资源组的 SQL 语句如下:
6) 把资源组里的线程移出到默认资源组 USR_default 中,SQL 语句如下:
7) 删除资源组的 SQL 语句如下:
如果需要指定线程的 ID,可以使用以下语句:
8) 查询线程 ID 的方法如下:
注意,在 Linux 环境下,MySQL 进程需要有 CAP_SYS_NICE 权限才能使用资源组的完整功能:
[root@localhost~]# sudo setcap cap_sys_nice+ep /usr/local/mysql 9.0/bin/mysqld [root@localhost~]# getcap /usr/local/mysql 9.0/bin/mysqld /usr/local/mysql 9.0/bin/mysqld = cap_sys_nice+ep
MySQL 默认提供两个资源组,分别是 USR_default 和 SYS_default。下面来讲述资源组的常用操作。
1) 创建名称为“my_resouce_group”的资源组,SQL 语句如下:
mysql> CREATE RESOURCE GROUP my_resouce_group type=USER vcpu=0, 1 thread_priority=5;
2) 将当前线程加入资源组,SQL 语句如下:
mysql> SET RESOURCE GROUP my_resouce_group;
3) 查看资源组my_resouce_group中包含的线程,SQL 语句如下:
mysql> SELECT * FROM Performance_schema.threads WHERE RESOURCE_GROUP='my_resouce_group'; +-----------+---------------------------+------------+----------------+------------------+------------------+----------------+---------------------+------------------+-------------------+----------------------------------------------------------------------------------+------------------+------+--------------+---------+-----------------+--------------+------------------+ | THREAD_ID | NAME | TYPE | PROCESSLIST_ID |PROCESSLIST_USER | PROCESSLIST_HOST | PROCESSLIST_DB | PROCESSLIST_COMMAND | PROCESSLIST_TIME|PROCESSLIST_STATE | PROCESSLIST_INFO |PARENT_THREAD_ID | ROLE | INSTRUMENTED | HISTORY | CONNECTION_TYPE | THREAD_OS_ID |RESOURCE_GROUP | +-----------+---------------------------+------------+----------------+------------------+------------------+----------------+---------------------+------------------+-------------------+----------------------------------------------------------------------------------+------------------+------+--------------+---------+-----------------+--------------+------------------+ | 48 | thread/sql/one_connection | FOREGROUND | 9 | root| localhost | mysql | Query | 0 | Sending data| SELECT * FROM Performance_Schema.threads WHERE RESOURCE_GROUP='my_resouce_group' |NULL | NULL | YES | YES | SSL/TLS | 1352 | my_resouce_group | +-----------+---------------------------+------------+----------------+------------------+------------------+----------------+---------------------+------------------+-------------------+----------------------------------------------------------------------------------+------------------+------+--------------+---------+-----------------+--------------+------------------+
4) 资源组里有线程时,删除资源组会报错:
mysql> DROP RESOURCE GROUP my_resouce_group; ERROR 3656 (HY000): Resource group test_resouce_group is busy.
5) 修改资源组的 SQL 语句如下:
mysql> ALTER RESOURCE GROUP my_resouce_group vcpu = 2,3 THREAD_PRIORITY = 8; Query OK, 0 rows affected (0.10 sec)
6) 把资源组里的线程移出到默认资源组 USR_default 中,SQL 语句如下:
mysql> SET RESOURCE GROUP USR_default FOR 48; Query OK, 0 rows affected (0.00 sec)
7) 删除资源组的 SQL 语句如下:
mysql> DROP RESOURCE group my_resouce_group; Query OK, 0 rows affected (0.08 sec)
如果需要指定线程的 ID,可以使用以下语句:
SET RESOURCE GROUP my_resouce_group FOR thread_id;这里的 thread_id 为线程的 ID。
8) 查询线程 ID 的方法如下:
SELECT thread_id FROM Performance_Schema.threads;例如,将 ID 为 20 的线程加入资源组 my_resouce_group 中,SQL 语句如下:
SET RESOURCE GROUP test_resouce_group FOR 20;