数据库在面临突发流量、资源消耗过高的SQL或访问模型变化时,可能会导致性能下降甚至服务不可用。PolarDB-X标准版提供了并发控制(Concurrency Control,CCL)功能,允许您针对特定的SQL模式设置并发阈值,从而主动管理数据库负载,保障实例的持续稳定运行。
适用范围
实例版本为PolarDB-X标准版,引擎为MySQL 8.0。
功能简介
CCL功能通过匹配SQL语句的特征来识别并限制其并发执行数量。当一条SQL命中您设定的规则,且当前并发数已达到上限时,该SQL将进入等待队列,直到有执行资源被释放或等待超时。
CCL规则主要通过以下三个维度来匹配SQL:
SQL命令类型:如
SELECT、UPDATE、INSERT、DELETE。操作对象:SQL操作的具体数据库(Schema)或表(Table)。
关键字:SQL语句文本中包含的一个或多个关键字。
注意事项
生效范围:CCL操作不产生日志,因此仅在当前实例生效,不会通过日志同步到备库、只读实例或灾备实例。
死锁规避:为防止因DML持有事务锁而导致的死锁,进入等待队列的SQL会正常响应事务超时和
KILL命令。规则优先级:CCL规则的优先级由其ID决定,ID越大,优先级越高。当一条SQL同时匹配多条规则时,将应用ID最大的那条规则。
配置系统参数
您可以通过修改以下全局参数来调整CCL的全局行为。
参数 | 说明 |
| 单条CCL规则下,允许处于等待状态的SQL最大数量。超过此限制后,SQL将执行失败并返回错误码 |
| 等待队列中的SQL最长等待时间,超过此时长后,SQL将不再受CCL限制并继续执行。
|
操作指南
PolarDB-X将CCL规则存储在系统表mysql.concurrency_control中,并提供了一个内置工具包DBMS_CCL,推荐您使用此工具包中的存储过程来管理规则。
管理CCL规则
您可以通过调用DBMS_CCL包中的存储过程来创建、删除和刷新规则。
存储过程 | 说明 |
| 添加一条CCL规则。
|
| 添加规则并返回其生成的ID,参数与 说明 仅在存储节点版本为20251105及以上版本支持。 |
| 根据ID删除一条CCL规则。 |
| 根据ID列表批量删除规则。 说明 仅在存储节点版本为20251105及以上版本支持。 |
| 删除所有CCL规则。 说明 仅在存储节点版本为20251105及以上版本支持。 |
| 重新从系统表加载所有CCL规则到内存。如果您直接修改了 |
示例1:添加规则
-- 限制对test.sbtest1表的所有SELECT操作并发数为3
CALL dbms_ccl.add_ccl_rule('SELECT', 'test', 'sbtest1', 3, '');
-- 限制所有包含关键字'key1'的SELECT操作并发数为20
CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 20, 'key1');示例2:删除规则
-- 删除ID为15的规则
CALL dbms_ccl.del_ccl_rule(15);如果删除的规则不存在,系统会报相应的警告,您可以使用show warnings;查看警告内容。
show warnings;
+---------+------+---------------------------------------------------+
| Level | Code | Message |
+---------+------+---------------------------------------------------+
| Warning | 7536 | Concurrency control rule 15 is not found in table |
| Warning | 7536 | Concurrency control rule 15 is not found in cache |
+---------+------+---------------------------------------------------+查看CCL规则状态
您可以使用show_ccl_rule()存储过程查看当前内存中生效的所有CCL规则及其运行状态。
CALL dbms_ccl.show_ccl_rule();
+------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+------------------+------------+----------+
| ID | TYPE | SCHEMA | TABLE | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITTING | CONCURRENCY_PEEK | KILLED_NUM | KEYWORDS |
+------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+------------------+------------+----------+
| 1 | SELECT | test | sbtest1 | Y | N | 3 | 0 | 0 | 0 | 0 | 0 | |
| 2 | SELECT | | | Y | N | 20 | 0 | 0 | 0 | 0 | 0 | key1 |
+------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+------------------+------------+----------+输出列说明
列名 | 说明 |
| 规则ID。 |
| SQL命令类型。 |
| 匹配的数据库名。 |
| 匹配的表名。 |
| 规则状态。 |
| 关键字是否按顺序匹配。 |
| 设置的并发数阈值。 |
| 该规则自加载以来累计匹配到的SQL数量。 |
| 当前正在执行的、匹配该规则的SQL数量。 |
| 当前正在等待执行的、匹配该规则的SQL数量。 |
| 历史并发峰值。 说明 仅在存储节点版本为20251105及以上版本支持。 |
| 因等待超时或被 说明 仅在存储节点版本为20251105及以上版本支持。 |
| 匹配的关键字,多个关键字用分号(;)分隔。 |