MySQL是单进程多线程的程序,MySQL线程包括后台线程(Master Thread、IO Thread、Purge Thread等),以及用户线程。在8.0以前,全部线程的优先级都是同样的,而且全部的线程的资源都是共享的。可是在MySQL8.0以后,因为Resource Group特性的引入,咱们能够来经过资源组的方式修改线程的优先级以及所能使用的资源,能够指定不一样的线程使用特定的资源。 在目前版本中DBA只能操控CPU资源,而且控制的最小力度为vCPU,即操做系统逻辑CPU核数(能够经过lscpu
命令查看可控制CPU总数)。 DBA常常会遇到须要执行跑批任务的需求,这种跑批的SQL通常都是很复杂、运行时间长、消耗资源多的SQL。因此不少跑批任务都是在业务低峰期的时候执行,而且在从库上执行,尽量下降对业务产生影响。可是对于一些数据一致性比较高的跑批任务,须要在主库上执行,在跑批任务运行的过程当中很容易影响到其余线程的运行。那么如今Resource Group就是DBA的福音了,咱们能够对跑批任务指定运行的资源组,限制任务使用的资源,减小对其余线程的影响。mysql
INFORMATION_SCHEMA库下的RESOURCE_GROUPS表中记录了全部定义的资源组的状况:git
mysql> select * from information_schema.resource_groups;
+---------------------+---------------------+------------------------+----------+-----------------+
| RESOURCE_GROUP_NAME | RESOURCE_GROUP_TYPE | RESOURCE_GROUP_ENABLED | VCPU_IDS | THREAD_PRIORITY |
+---------------------+---------------------+------------------------+----------+-----------------+
| USR_default | USER | 1 | 0-23 | 0 |
| SYS_default | SYSTEM | 1 | 0-23 | 0 |
+---------------------+---------------------+------------------------+----------+-----------------+
2 rows in set (0.00 sec)
复制代码
MySQL8.0默认会建立两个资源组,一个是USR_default
另外一个是SYS_default
。github
PERFORMANCE_SCHEMA库下的THREADS表中,能够查看当前线程使用资源组的状况:sql
mysql> mysql> select * from performance_schema.threads limit 5;
+-----------+------------------------------+------------+----------------+------------------+------------------+----------------+---------------------+------------------+-------------------+------------------+------------------+------+--------------+---------+-----------------+--------------+----------------+
| 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 |
+-----------+------------------------------+------------+----------------+------------------+------------------+----------------+---------------------+------------------+-------------------+------------------+------------------+------+--------------+---------+-----------------+--------------+----------------+
| 1 | thread/sql/main | BACKGROUND | NULL | NULL | NULL | mysql | NULL | 96053 | NULL | NULL | NULL | NULL | YES | YES | NULL | 9130 | SYS_default |
| 3 | thread/innodb/io_ibuf_thread | BACKGROUND | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | YES | YES | NULL | 9135 | SYS_default |
| 4 | thread/innodb/io_log_thread | BACKGROUND | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | YES | YES | NULL | 9136 | SYS_default |
| 5 | thread/innodb/io_read_thread | BACKGROUND | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | YES | YES | NULL | 9138 | SYS_default |
| 6 | thread/innodb/io_read_thread | BACKGROUND | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | YES | YES | NULL | 9137 | SYS_default |
+-----------+------------------------------+------------+----------------+------------------+------------------+----------------+---------------------+------------------+-------------------+------------------+------------------+------+--------------+---------+-----------------+--------------+----------------+
5 rows in set (0.00 sec)
复制代码
其中RESOURCE_GROUP
字段显示线程使用的是哪一个资源组。shell
假设咱们如今须要对跑批任务建立一个资源组。数据库
mysql> CREATE RESOURCE GROUP Batch
-> TYPE = USER
-> VCPU = 2-3
-> THREAD_PRIORITY = 10;
Query OK, 0 rows affected (0.03 sec)
mysql> select * from information_schema.resource_groups;
+---------------------+---------------------+------------------------+----------+-----------------+
| RESOURCE_GROUP_NAME | RESOURCE_GROUP_TYPE | RESOURCE_GROUP_ENABLED | VCPU_IDS | THREAD_PRIORITY |
+---------------------+---------------------+------------------------+----------+-----------------+
| USR_default | USER | 1 | 0-23 | 0 |
| SYS_default | SYSTEM | 1 | 0-23 | 0 |
| Batch | USER | 1 | 2-3 | 10 |
+---------------------+---------------------+------------------------+----------+-----------------+
3 rows in set (0.00 sec)
复制代码
将建立的Batch资源组绑定到执行的线程上,有两种方式:bash
查看须要绑定须要的线程的THREAD_ID:多线程
mysql> select * from performance_schema.threads where TYPE='FOREGROUND';
+-----------+--------------------------------+------------+----------------+------------------+------------------+----------------+---------------------+------------------+-------------------+------------------------------------------------------------------+------------------+------+--------------+---------+-----------------+--------------+----------------+
| 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 |
+-----------+--------------------------------+------------+----------------+------------------+------------------+----------------+---------------------+------------------+-------------------+------------------------------------------------------------------+------------------+------+--------------+---------+-----------------+--------------+----------------+
| 61 | thread/sql/compress_gtid_table | FOREGROUND | 5 | NULL | NULL | NULL | Daemon | 96613 | Suspending | NULL | 1 | NULL | YES | YES | NULL | 9211 | SYS_default |
| 65 | thread/sql/one_connection | FOREGROUND | 10 | root | localhost | NULL | Query | 0 | Sending data | select * from performance_schema.threads where TYPE='FOREGROUND' | NULL | NULL | YES | YES | Socket | 9741 | USR_default |
+-----------+--------------------------------+------------+----------------+------------------+------------------+----------------+---------------------+------------------+-------------------+------------------------------------------------------------------+------------------+------+--------------+---------+-----------------+--------------+----------------+
2 rows in set (0.00 sec)
复制代码
绑定将线程与Batch资源组绑定:ui
SET RESOURCE GROUP Batch FOR 65;
复制代码
查看绑定结果:spa
mysql> select THREAD_ID,NAME,TYPE,PROCESSLIST_ID,RESOURCE_GROUP from performance_schema.threads where TYPE='FOREGROUND';
+-----------+--------------------------------+------------+----------------+----------------+
| THREAD_ID | NAME | TYPE | PROCESSLIST_ID | RESOURCE_GROUP |
+-----------+--------------------------------+------------+----------------+----------------+
| 61 | thread/sql/compress_gtid_table | FOREGROUND | 5 | SYS_default |
| 65 | thread/sql/one_connection | FOREGROUND | 10 | Batch |
+-----------+--------------------------------+------------+----------------+----------------+
2 rows in set (0.00 sec)
复制代码
采用Optimizer Hints的方式指定SQL使用的资源组:
SELECT /*+ RESOURCE_GROUP(Batch) */ * FROM t2 ;
复制代码
可能跑批任务使用CPU资源不够,那就须要修改资源组的配置。
ALTER RESOURCE GROUP Batch VCPU = 10-20;
复制代码
修改资源组优先级:
ALTER RESOURCE GROUP Batch THREAD_PRIORITY = 5;
复制代码
禁止使用资源组:
ALTER RESOURCE GROUP Batch DISABLE FORCE;
复制代码
对于不用的资源组能够删除
DROP RESOURCE GROUP Batch;
复制代码
检查mysqld进程是否开启CAP_SYS_NICE特性
[root@qdata-sto3 /root]
#getcap /home/mysql/program/mysql8.0/bin/mysqld
给mysqld进程开启CAP_SYS_NICE特性
[root@qdata-sto3 /root]
#setcap cap_sys_nice+ep /home/mysql/program/mysql8.0/bin/mysqld
检查是否开启成功
[root@qdata-sto3 /root]
#getcap /home/mysql/program/mysql8.0/bin/mysqld
/home/mysql/program/mysql8.0/bin/mysqld = cap_sys_nice+ep
复制代码
Resource Group是MySQL在8.0中增长的资源管理的特性,从一个DBA的角度,能够更加灵活、便捷的管理数据库使用的资源,这是一个使人眼前一亮的特性。Oracle在10g的时候已经推出了Resource Manager的特性,MySQL的Resource Group目前还很简单只能控制CPU的资源,可是相信后续Resource Group能操控的资源类型会愈来愈多。期待MySQL8.0早日成为一个成熟稳定的版本。
博客地址:win-man.github.io/
公众号:欢迎关注