{"id":2493,"date":"2018-09-07T12:03:57","date_gmt":"2018-09-07T12:03:57","guid":{"rendered":"http:\/\/kedar.nitty-witty.com\/?p=2493"},"modified":"2023-04-28T04:51:56","modified_gmt":"2023-04-28T04:51:56","slug":"mysql-8-resource-group-introduction-and-dynamic-allocation","status":"publish","type":"post","link":"https:\/\/kedar.nitty-witty.com\/blog\/mysql-8-resource-group-introduction-and-dynamic-allocation","title":{"rendered":"MySQL 8 Resource Group &#8211; introduction and dynamic allocation"},"content":{"rendered":"\r\n<p>MySQL 8 is GA and it has a variety of new features. Recently, we happened to work with resource groups to restrict resource utilization for a MySQL thread.<\/p>\r\n\r\n\r\n\r\n<p>That\u2019s why I thought of writing this blog post: to give you a quick introduction to resource groups, an idea of how to dynamically allocate them and to discuss a related bug report.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">Introduction To Resource Groups:<\/h3>\r\n\r\n\r\n\r\n<p>A resource group, a\u00a0new feature in MySQL 8, is the entity that defines the allowed resources consumption for threads pertaining to that group. Group attributes enable control over resources and hence the database threads get\u00a0restricted with those limits.<\/p>\r\n\r\n\r\n\r\n<p>Resource groups introduce\u00a0the following associated components:<br \/>1. SQL to manage the resource groups (create, alter, assign, drop).<br \/>2. Resource groups related privileges.<br \/>3. The information_schema.resource_groups table, which holds groups details.<br \/>4. A new column was added to the performance_schema.threads table to show us the assignments of threads to respective resource groups.<\/p>\r\n\r\n\r\n\r\n<p><!--more--><\/p>\r\n\r\n\r\n\r\n<p>We have two types of resource group: SYSTEM and USER:<br \/>The\u00a0SYSTEM type applies to background threads, with priority values ranging from -20 (highest) to 0 (normal).<br \/>The\u00a0USER type applies to foreground threads, with priority values ranging from 0 to 19 (lowest).<\/p>\r\n\r\n\r\n\r\n<p>Keep in mind that USER resource groups can only be assigned to user threads (foreground threads) and their priority should be in the 0-19 range. On the other hand, SYSTEM groups can only be assigned to background threads and their priority can\u2019t exceed 0, and can\u2019t be lower than -20.<\/p>\r\n\r\n\r\n\r\n<p>For example, creating a USER type resource group with -20 priority results in error:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\"><span class=\"pln\">CREATE RESOURCE GROUP <\/span><span class=\"typ\">Batch<\/span><span class=\"pln\">\r\nTYPE <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> USER\r\nTHREAD_PRIORITY <\/span><span class=\"pun\">=<\/span> <span class=\"pun\">-<\/span><span class=\"lit\">20<\/span><\/pre>\r\n\r\n\r\n\r\n<p>Error:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\"><span class=\"com\">#3654 - Invalid thread priority value -20 for User resource group Batch. Allowed range is [0, 19].<\/span><\/pre>\r\n\r\n\r\n\r\n<p>Assigning a USER type resource group to a SYSTEM thread causes the following error:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\"><span class=\"pln\">UNKNOWN_CODE_PLEASE_REPORT<\/span><span class=\"pun\">:<\/span> <span class=\"typ\">Unable<\/span><span class=\"pln\"> to bind resource <\/span><span class=\"kwd\">group<\/span> <span class=\"typ\">Batch<\/span> <span class=\"kwd\">with<\/span><span class=\"pln\"> thread id <\/span><span class=\"pun\">(<\/span><span class=\"lit\">4<\/span><span class=\"pun\">).(<\/span><span class=\"typ\">Resource<\/span> <span class=\"kwd\">group<\/span><span class=\"pln\"> type <\/span><span class=\"kwd\">and<\/span><span class=\"pln\"> thread type doesn<\/span><span class=\"str\">'t match.).<\/span><\/pre>\r\n\r\n\r\n\r\n<p>The resource groups defined can be seen in the information_schema.resource_groups table. Initially, we have two default resource groups:\u00a0<u>SYS_default<\/u>\u00a0and\u00a0<u>USR_default<\/u>. Both default groups hold normal priority and have no CPU restrictions.<\/p>\r\n\r\n\r\n\r\n<p><strong>In regards to grants, two new user privileges were introduced:<\/strong><br \/>The RESOURCE_GROUP_ADMIN is for\u00a0creating, altering and dropping operations along with resource group assignments.<br \/>The RESOURCE_GROUP_USER is for the assignment of threads to resource groups.<\/p>\r\n\r\n\r\n\r\n<p><b>Creating a RESOURCE GROUP<\/b><\/p>\r\n\r\n\r\n\r\n<p>The following is a sample create statement for resource group:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\"><span class=\"pln\">CREATE RESOURCE GROUP rg1\r\nTYPE <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> USER\r\nVCPU <\/span><span class=\"pun\">=<\/span> <span class=\"lit\">5<\/span><span class=\"pun\">-<\/span><span class=\"lit\">7<\/span><span class=\"pln\">\r\nTHREAD_PRIORITY <\/span><span class=\"pun\">=<\/span> <span class=\"lit\">19<\/span><span class=\"pun\">;<\/span><\/pre>\r\n\r\n\r\n\r\n<p>Here, rg1 is a USER resource group with CPU affinity of 5 to 7 (only those CPUs can be used) and with THREAD_PRIORITY 19 (lowest). If we do not specify the VCPU option, all CPUs can be used and we can only consider specifying the priority.<\/p>\r\n\r\n\r\n\r\n<p>The details about the RESOURCE GROUP are exposed via information_schema.resource_group table.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\"><span class=\"pln\">mysql<\/span><span class=\"pun\">&gt;<\/span><span class=\"pln\"> SELECT <\/span><span class=\"pun\">*<\/span><span class=\"pln\"> FROM INFORMATION_SCHEMA<\/span><span class=\"pun\">.<\/span><span class=\"pln\">RESOURCE_GROUPS\\G\r\n<\/span><span class=\"pun\">***************************<\/span> <span class=\"lit\">1.<\/span><span class=\"pln\"> row <\/span><span class=\"pun\">***************************<\/span><span class=\"pln\">\r\nRESOURCE_GROUP_NAME<\/span><span class=\"pun\">:<\/span><span class=\"pln\"> USR_default\r\nRESOURCE_GROUP_TYPE<\/span><span class=\"pun\">:<\/span><span class=\"pln\"> USER\r\nRESOURCE_GROUP_ENABLED<\/span><span class=\"pun\">:<\/span> <span class=\"lit\">1<\/span><span class=\"pln\">\r\nVCPU_IDS<\/span><span class=\"pun\">:<\/span> <span class=\"lit\">0<\/span><span class=\"pun\">-<\/span><span class=\"lit\">0<\/span><span class=\"pln\">\r\nTHREAD_PRIORITY<\/span><span class=\"pun\">:<\/span> <span class=\"lit\">0<\/span>\r\n<span class=\"pun\">***************************<\/span> <span class=\"lit\">2.<\/span><span class=\"pln\"> row <\/span><span class=\"pun\">***************************<\/span><span class=\"pln\">\r\nRESOURCE_GROUP_NAME<\/span><span class=\"pun\">:<\/span><span class=\"pln\"> SYS_default\r\nRESOURCE_GROUP_TYPE<\/span><span class=\"pun\">:<\/span><span class=\"pln\"> SYSTEM\r\nRESOURCE_GROUP_ENABLED<\/span><span class=\"pun\">:<\/span> <span class=\"lit\">1<\/span><span class=\"pln\">\r\nVCPU_IDS<\/span><span class=\"pun\">:<\/span> <span class=\"lit\">0<\/span><span class=\"pun\">-<\/span><span class=\"lit\">0<\/span><span class=\"pln\">\r\nTHREAD_PRIORITY<\/span><span class=\"pun\">:<\/span> <span class=\"lit\">0<\/span>\r\n<span class=\"pun\">***************************<\/span> <span class=\"lit\">3.<\/span><span class=\"pln\"> row <\/span><span class=\"pun\">***************************<\/span><span class=\"pln\">\r\nRESOURCE_GROUP_NAME<\/span><span class=\"pun\">:<\/span><span class=\"pln\"> rg1\r\nRESOURCE_GROUP_TYPE<\/span><span class=\"pun\">:<\/span><span class=\"pln\"> USER\r\nRESOURCE_GROUP_ENABLED<\/span><span class=\"pun\">:<\/span> <span class=\"lit\">1<\/span><span class=\"pln\">\r\nVCPU_IDS<\/span><span class=\"pun\">:<\/span> <span class=\"lit\">5<\/span><span class=\"pun\">-<\/span><span class=\"lit\">7<\/span><span class=\"pln\">\r\nTHREAD_PRIORITY<\/span><span class=\"pun\">:<\/span> <span class=\"lit\">19<\/span><\/pre>\r\n\r\n\r\n\r\n<p><strong>Enabling and assigning resource groups<\/strong><\/p>\r\n\r\n\r\n\r\n<p>To set the resource group for your current session, we can execute the following command:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\"><span class=\"pln\">SET RESOURCE GROUP rg1<\/span><span class=\"pun\">;<\/span><\/pre>\r\n\r\n\r\n\r\n<p>Or we can assign it to a specific thread as follows:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\"><span class=\"pln\">SET RESOURCE GROUP rg1 FOR <\/span><span class=\"str\">&lt;thread_id&gt;<\/span><span class=\"pun\">;<\/span><\/pre>\r\n\r\n\r\n\r\n<p>There is currently no way to allocate resource groups to a specific user, and hence, to all threads created by that account. However, there is a way to assign them to queries using hints as follows:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\"><span class=\"pln\">INSERT <\/span><span class=\"com\">\/*+ RESOURCE_GROUP(rg1) *\/<\/span><span class=\"pln\"> INTO sample_table VALUES<\/span><span class=\"pun\">(<\/span><span class=\"lit\">2<\/span><span class=\"pun\">);<\/span><\/pre>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">Dynamically Assigning Resource Groups To Threads<\/h3>\r\n\r\n\r\n\r\n<p>Resource groups give the DBA control over CPU utilization and prioritization of threads so we can better manage the workloads. For example, for a batch process, the THREAD_PRIORITY can be lowered while for user transactions it can be increased.<\/p>\r\n\r\n\r\n\r\n<p>In such a scenario, the attempt was made to set the resource groups dynamically based on the logic provided in a stored procedure.<\/p>\r\n\r\n\r\n\r\n<p>Consider the following user_rg table:<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-table\">\r\n<table>\r\n<tbody>\r\n<tr>\r\n<td><strong>_user<\/strong><\/td>\r\n<td><strong>_resource_group<\/strong><\/td>\r\n<\/tr>\r\n<tr>\r\n<td>reports<\/td>\r\n<td>rg1<\/td>\r\n<\/tr>\r\n<tr>\r\n<td>qa_users<\/td>\r\n<td>rg2<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/figure>\r\n\r\n\r\n\r\n<p>The idea is that a process will call a stored procedure to set the resource group for that specific session before executing queries.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\"><span class=\"pln\">SELECT _resource_group <\/span><span class=\"kwd\">into<\/span><span class=\"pln\"> rg_name <\/span><span class=\"kwd\">from<\/span><span class=\"pln\"> user_rg <\/span><span class=\"kwd\">where<\/span><span class=\"pln\"> _user<\/span><span class=\"pun\">=<\/span><span class=\"pln\">current_user<\/span><span class=\"pun\">();<\/span><span class=\"pln\">\r\nSET <\/span><span class=\"lit\">@cmd<\/span> <span class=\"pun\">=<\/span><span class=\"pln\"> CONCAT<\/span><span class=\"pun\">(<\/span><span class=\"str\">\"SET RESOURCE GROUP \"<\/span><span class=\"pun\">,<\/span> <span class=\"lit\">@rg_name<\/span> <span class=\"pun\">);<\/span><span class=\"pln\">\r\nPREPARE stmt FROM <\/span><span class=\"lit\">@cmd<\/span><span class=\"pun\">;<\/span><span class=\"pln\">\r\nEXECUTE stmt<\/span><span class=\"pun\">;<\/span><\/pre>\r\n\r\n\r\n\r\n<p>This should work, but it doesn\u2019t ! Let\u2019s see how the manual execution goes:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\"><span class=\"pln\">mysql<\/span><span class=\"pun\">&gt;<\/span> <span class=\"kwd\">select<\/span> <span class=\"lit\">@rg_name<\/span><span class=\"pun\">;<\/span>\r\n<span class=\"pun\">+-----------+<\/span>\r\n<span class=\"pun\">|<\/span> <span class=\"lit\">@rg_name<\/span>  <span class=\"pun\">|<\/span>\r\n<span class=\"pun\">+-----------+<\/span>\r\n<span class=\"pun\">|<\/span><span class=\"pln\"> rg1       <\/span><span class=\"pun\">|<\/span>\r\n<span class=\"pun\">+-----------+<\/span>\r\n<span class=\"lit\">1<\/span><span class=\"pln\"> row <\/span><span class=\"kwd\">in<\/span> <span class=\"kwd\">set<\/span> <span class=\"pun\">(<\/span><span class=\"lit\">0.00<\/span><span class=\"pln\"> sec<\/span><span class=\"pun\">)<\/span><span class=\"pln\">\r\n\r\nmysql<\/span><span class=\"pun\">&gt;<\/span><span class=\"pln\"> SET <\/span><span class=\"lit\">@cmd<\/span> <span class=\"pun\">=<\/span><span class=\"pln\"> CONCAT<\/span><span class=\"pun\">(<\/span><span class=\"str\">\"SET RESOURCE GROUP \"<\/span><span class=\"pun\">,<\/span> <span class=\"lit\">@rg_name<\/span> <span class=\"pun\">);<\/span>\r\n<span class=\"typ\">Query<\/span><span class=\"pln\"> OK<\/span><span class=\"pun\">,<\/span> <span class=\"lit\">0<\/span><span class=\"pln\"> rows affected <\/span><span class=\"pun\">(<\/span><span class=\"lit\">0.00<\/span><span class=\"pln\"> sec<\/span><span class=\"pun\">)<\/span><span class=\"pln\">\r\n\r\nmysql<\/span><span class=\"pun\">&gt;<\/span><span class=\"pln\"> PREPARE stmt FROM <\/span><span class=\"lit\">@cmd<\/span><span class=\"pun\">;<\/span><span class=\"pln\">\r\nERROR <\/span><span class=\"lit\">1295<\/span> <span class=\"pun\">(<\/span><span class=\"pln\">HY000<\/span><span class=\"pun\">):<\/span> <span class=\"typ\">This<\/span><span class=\"pln\"> command <\/span><span class=\"kwd\">is<\/span> <span class=\"kwd\">not<\/span><span class=\"pln\"> supported <\/span><span class=\"kwd\">in<\/span><span class=\"pln\"> the prepared statement protocol yet\r\nmysql<\/span><span class=\"pun\">&gt;<\/span> <span class=\"kwd\">select<\/span> <span class=\"lit\">@cmd<\/span><span class=\"pun\">;<\/span>\r\n<span class=\"pun\">+------------------------+<\/span>\r\n<span class=\"pun\">|<\/span> <span class=\"lit\">@cmd<\/span>                   <span class=\"pun\">|<\/span>\r\n<span class=\"pun\">+------------------------+<\/span>\r\n<span class=\"pun\">|<\/span><span class=\"pln\"> SET RESOURCE GROUP rg1 <\/span><span class=\"pun\">|<\/span>\r\n<span class=\"pun\">+------------------------+<\/span>\r\n<span class=\"lit\">1<\/span><span class=\"pln\"> row <\/span><span class=\"kwd\">in<\/span> <span class=\"kwd\">set<\/span> <span class=\"pun\">(<\/span><span class=\"lit\">0.00<\/span><span class=\"pln\"> sec<\/span><span class=\"pun\">)<\/span><\/pre>\r\n\r\n\r\n\r\n<p>We receive an optimistic error conveying\u00a0<em>\u201cThis command is not supported\u00a0<strong>yet!<\/strong>\u201d<\/em>\u00a0That derails our plan to dynamically allocate the resource groups.<\/p>\r\n\r\n\r\n\r\n<p>But wait, the solution is simple. We just have to use IF\u2026ELSE:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\"><span class=\"typ\">If<\/span> <span class=\"pun\">(<\/span><span class=\"lit\">@rg_name<\/span> <span class=\"pun\">=<\/span> <span class=\"str\">'rg1'<\/span><span class=\"pun\">)<\/span> <span class=\"kwd\">then<\/span>\r\n<span class=\"kwd\">set<\/span><span class=\"pln\"> resource <\/span><span class=\"kwd\">group<\/span><span class=\"pln\"> rg1<\/span><span class=\"pun\">;<\/span>\r\n<span class=\"kwd\">else<\/span>\r\n<span class=\"kwd\">set<\/span><span class=\"pln\"> resource <\/span><span class=\"kwd\">group<\/span><span class=\"pln\"> rg2<\/span><span class=\"pun\">;<\/span>\r\n<span class=\"kwd\">end<\/span> <span class=\"kwd\">if<\/span><span class=\"pun\">;<\/span><\/pre>\r\n\r\n\r\n\r\n<p>See a sample procedure here that explains the idea:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\"><span class=\"pln\">mysql<\/span><span class=\"pun\">&gt;<\/span><span class=\"pln\"> delimiter <\/span><span class=\"com\">\/\/<\/span><span class=\"pln\">\r\nmysql<\/span><span class=\"pun\">&gt;<\/span><span class=\"pln\"> drop procedure <\/span><span class=\"kwd\">if<\/span><span class=\"pln\"> exists testproc<\/span><span class=\"com\">\/\/<\/span>\r\n<span class=\"typ\">Query<\/span><span class=\"pln\"> OK<\/span><span class=\"pun\">,<\/span> <span class=\"lit\">0<\/span><span class=\"pln\"> rows affected <\/span><span class=\"pun\">(<\/span><span class=\"lit\">0.08<\/span><span class=\"pln\"> sec<\/span><span class=\"pun\">)<\/span><span class=\"pln\">\r\n\r\nmysql<\/span><span class=\"pun\">&gt;<\/span><span class=\"pln\"> CREATE PROCEDURE testproc <\/span><span class=\"pun\">(<\/span><span class=\"pln\">in_user varchar<\/span><span class=\"pun\">(<\/span><span class=\"lit\">20<\/span><span class=\"pun\">))<\/span>\r\n<span class=\"pun\">-&gt;<\/span> <span class=\"kwd\">BEGIN<\/span>\r\n<span class=\"pun\">-&gt;<\/span> <span class=\"kwd\">set<\/span> <span class=\"lit\">@val<\/span><span class=\"pun\">=<\/span><span class=\"str\">''<\/span><span class=\"pun\">;<\/span>\r\n<span class=\"pun\">-&gt;<\/span> <span class=\"kwd\">select<\/span><span class=\"pln\"> _resource_group <\/span><span class=\"kwd\">into<\/span> <span class=\"lit\">@val<\/span> <span class=\"kwd\">from<\/span><span class=\"pln\"> user_rg <\/span><span class=\"kwd\">where<\/span><span class=\"pln\"> _user<\/span><span class=\"pun\">=<\/span><span class=\"pln\">in_type<\/span><span class=\"pun\">;<\/span>\r\n<span class=\"pun\">-&gt;<\/span> <span class=\"kwd\">if<\/span> <span class=\"pun\">(<\/span><span class=\"lit\">@val<\/span><span class=\"pun\">=<\/span><span class=\"str\">'rg1'<\/span><span class=\"pun\">)<\/span> <span class=\"kwd\">then<\/span>\r\n<span class=\"pun\">-&gt;<\/span> <span class=\"kwd\">select<\/span> <span class=\"str\">\"setting resource group RG1\"<\/span><span class=\"pun\">;<\/span>\r\n<span class=\"pun\">-&gt;<\/span><span class=\"pln\"> elseif <\/span><span class=\"pun\">(<\/span><span class=\"lit\">@val<\/span><span class=\"pun\">=<\/span><span class=\"str\">'rg2'<\/span><span class=\"pun\">)<\/span> <span class=\"kwd\">then<\/span>\r\n<span class=\"pun\">-&gt;<\/span> <span class=\"kwd\">select<\/span> <span class=\"str\">\"setting resource group RG2\"<\/span><span class=\"pun\">;<\/span>\r\n<span class=\"pun\">-&gt;<\/span> <span class=\"kwd\">else<\/span> <span class=\"kwd\">select<\/span> <span class=\"str\">\"Ignoring resource group changes.\"<\/span><span class=\"pun\">;<\/span>\r\n<span class=\"pun\">-&gt;<\/span> <span class=\"kwd\">end<\/span> <span class=\"kwd\">if<\/span><span class=\"pun\">;<\/span>\r\n<span class=\"pun\">-&gt;<\/span> <span class=\"kwd\">END<\/span><span class=\"com\">\/\/<\/span><span class=\"pln\">\r\ndelimiter <\/span><span class=\"pun\">;<\/span><span class=\"pln\">\r\nmysql<\/span><span class=\"pun\">&gt;<\/span><span class=\"pln\"> delimiter <\/span><span class=\"pun\">;<\/span><span class=\"pln\">\r\nmysql<\/span><span class=\"pun\">&gt;<\/span><span class=\"pln\"> call testproc<\/span><span class=\"pun\">(<\/span><span class=\"str\">'reports'<\/span><span class=\"pun\">);<\/span>\r\n<span class=\"pun\">+----------------------------+<\/span>\r\n<span class=\"pun\">|<\/span><span class=\"pln\"> setting resource <\/span><span class=\"kwd\">group<\/span><span class=\"pln\"> RG1 <\/span><span class=\"pun\">|<\/span>\r\n<span class=\"pun\">+----------------------------+<\/span>\r\n<span class=\"pun\">|<\/span><span class=\"pln\"> setting resource <\/span><span class=\"kwd\">group<\/span><span class=\"pln\"> RG1 <\/span><span class=\"pun\">|<\/span>\r\n<span class=\"pun\">+----------------------------+<\/span>\r\n<span class=\"lit\">1<\/span><span class=\"pln\"> row <\/span><span class=\"kwd\">in<\/span> <span class=\"kwd\">set<\/span> <span class=\"pun\">(<\/span><span class=\"lit\">0.00<\/span><span class=\"pln\"> sec<\/span><span class=\"pun\">)<\/span>\r\n\r\n<span class=\"typ\">Query<\/span><span class=\"pln\"> OK<\/span><span class=\"pun\">,<\/span> <span class=\"lit\">0<\/span><span class=\"pln\"> rows affected <\/span><span class=\"pun\">(<\/span><span class=\"lit\">0.00<\/span><span class=\"pln\"> sec<\/span><span class=\"pun\">)<\/span><span class=\"pln\">\r\n\r\nmysql<\/span><span class=\"pun\">&gt;<\/span><span class=\"pln\"> call testproc<\/span><span class=\"pun\">(<\/span><span class=\"str\">'qa_users'<\/span><span class=\"pun\">);<\/span>\r\n<span class=\"pun\">+----------------------------+<\/span>\r\n<span class=\"pun\">|<\/span><span class=\"pln\"> setting resource <\/span><span class=\"kwd\">group<\/span><span class=\"pln\"> RG2 <\/span><span class=\"pun\">|<\/span>\r\n<span class=\"pun\">+----------------------------+<\/span>\r\n<span class=\"pun\">|<\/span><span class=\"pln\"> setting resource <\/span><span class=\"kwd\">group<\/span><span class=\"pln\"> RG2 <\/span><span class=\"pun\">|<\/span>\r\n<span class=\"pun\">+----------------------------+<\/span>\r\n<span class=\"lit\">1<\/span><span class=\"pln\"> row <\/span><span class=\"kwd\">in<\/span> <span class=\"kwd\">set<\/span> <span class=\"pun\">(<\/span><span class=\"lit\">0.00<\/span><span class=\"pln\"> sec<\/span><span class=\"pun\">)<\/span>\r\n\r\n<span class=\"typ\">Query<\/span><span class=\"pln\"> OK<\/span><span class=\"pun\">,<\/span> <span class=\"lit\">0<\/span><span class=\"pln\"> rows affected <\/span><span class=\"pun\">(<\/span><span class=\"lit\">0.00<\/span><span class=\"pln\"> sec<\/span><span class=\"pun\">)<\/span><span class=\"pln\">\r\n\r\nmysql<\/span><span class=\"pun\">&gt;<\/span><span class=\"pln\"> call testproc<\/span><span class=\"pun\">(<\/span><span class=\"str\">'different_user'<\/span><span class=\"pun\">)<\/span>\r\n<span class=\"pun\">+-----------------------------------+<\/span>\r\n<span class=\"pun\">|<\/span> <span class=\"typ\">Ignoring<\/span><span class=\"pln\"> resource <\/span><span class=\"kwd\">group<\/span><span class=\"pln\"> changes<\/span><span class=\"pun\">.<\/span>  <span class=\"pun\">|<\/span>\r\n<span class=\"pun\">+-----------------------------------+<\/span>\r\n<span class=\"pun\">|<\/span> <span class=\"typ\">Ignoring<\/span><span class=\"pln\"> resource <\/span><span class=\"kwd\">group<\/span><span class=\"pln\"> changes<\/span><span class=\"pun\">.<\/span>  <span class=\"pun\">|<\/span>\r\n<span class=\"pun\">+-----------------------------------+<\/span>\r\n<span class=\"lit\">1<\/span><span class=\"pln\"> row <\/span><span class=\"kwd\">in<\/span> <span class=\"kwd\">set<\/span> <span class=\"pun\">(<\/span><span class=\"lit\">0.00<\/span><span class=\"pln\"> sec<\/span><span class=\"pun\">)<\/span>\r\n\r\n<span class=\"typ\">Query<\/span><span class=\"pln\"> OK<\/span><span class=\"pun\">,<\/span> <span class=\"lit\">0<\/span><span class=\"pln\"> rows affected<\/span><span class=\"pun\">,<\/span> <span class=\"lit\">1<\/span><span class=\"pln\"> warning <\/span><span class=\"pun\">(<\/span><span class=\"lit\">0.00<\/span><span class=\"pln\"> sec<\/span><span class=\"pun\">)<\/span><\/pre>\r\n\r\n\r\n\r\n<p>In above example, in_user could be current_user() and thus we can actually execute the SET RESOURCE GROUP command.<\/p>\r\n\r\n\r\n\r\n<p>Note that as per the documentation and in my experience, the SET command does work for PREPARE but the SET RESOURCE GROUP command fails. We have filed the following bug report for the error:\u00a0<a href=\"https:\/\/bugs.mysql.com\/bug.php?id=91876\" target=\"_blank\" rel=\"noopener\">https:\/\/bugs.mysql.com\/bug.php?id=91876<\/a><\/p>\r\n\r\n\r\n\r\n<p>As such,\u00a0resource group is a new feature and presently the only resource that is manageable is CPU. It would have been a good idea to allow allocating resource groups to system users and thus threads created by them.<\/p>\r\n\r\n\r\n\r\n<p>That\u2019s it for now, folks, go explore the resource groups and the brand new MySQL 8!<\/p>\r\n\r\n\r\n\r\n<p><em>PS: This article was originally published on The Pythian Blog <a href=\"https:\/\/blog.pythian.com\/resource-groups-mysql-8-dynamic-allocation\/\" target=\"_blank\" rel=\"noopener\">here.<\/a><\/em><\/p>\r\n","protected":false},"excerpt":{"rendered":"Introduction to resource groups in MySQL 8 and dynamical allocation to threads\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[8,377],"tags":[467,468,427,469,470,471],"class_list":{"0":"post-2493","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-mysql","7":"category-mysql-articles","8":"tag-dynamically-allocating-resource-groups","9":"tag-introduction-to-resource-groups","10":"tag-mysql","11":"tag-mysql-8","12":"tag-mysql-resource-group","13":"tag-resource-group"},"aioseo_notices":[],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/kedar.nitty-witty.com\/blog\/wp-json\/wp\/v2\/posts\/2493","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kedar.nitty-witty.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kedar.nitty-witty.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kedar.nitty-witty.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/kedar.nitty-witty.com\/blog\/wp-json\/wp\/v2\/comments?post=2493"}],"version-history":[{"count":4,"href":"https:\/\/kedar.nitty-witty.com\/blog\/wp-json\/wp\/v2\/posts\/2493\/revisions"}],"predecessor-version":[{"id":3265,"href":"https:\/\/kedar.nitty-witty.com\/blog\/wp-json\/wp\/v2\/posts\/2493\/revisions\/3265"}],"wp:attachment":[{"href":"https:\/\/kedar.nitty-witty.com\/blog\/wp-json\/wp\/v2\/media?parent=2493"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kedar.nitty-witty.com\/blog\/wp-json\/wp\/v2\/categories?post=2493"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kedar.nitty-witty.com\/blog\/wp-json\/wp\/v2\/tags?post=2493"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}