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/
公衆號:歡迎關注