数据库自治服务DAS(Database Autonomy Service)提供SQL限流功能。您可以通过SQL限流来控制数据库请求访问量和SQL并发量,保障服务的可用性。本文将介绍如何使用SQL限流功能。
前提条件
支持的数据库引擎为:
- RDS MySQL 5.6、5.7、8.0。 
- RDS PostgreSQL 13及以上。 说明- PostgreSQL 13:内核小版本需为20250430或以上。 
- PostgreSQL 14或15:内核小版本需为20230330或以上。 
- PostgreSQL 15以上:内核小版本无要求。 
 
- PolarDB MySQL版 5.6、5.7、8.0。 
- PolarDB-X 2.0。 
限流提示
目标SQL限流规则创建后,如果应用端使用了包含所有关键词的SQL或者符合模板限流规则的SQL,限流生效时,根据不同的实例版本,数据库系统将会给出对应提示。
| 最大并发度 | 实例版本 | 错误码 | 错误提示 | 
| 0或者正整数 | 
 | 1317 | 
 | 
| 正整数 | RDS MySQL 5.7(小版本大于等于20200630) | 5041 | 
 说明  最大并发度为正整数,相关SQL会处于 | 
| RDS MySQL 8.0 | 7534 | ||
| PolarDB MySQL版 5.7 | 3277 | ||
| PolarDB MySQL版 8.0 | 7533 | ||
| 0 | RDS MySQL 5.7(小版本大于等于20200630) | 5042 | 
 说明  最大并发度为0,直接报错返回。 | 
| RDS MySQL 8.0 | 7535 | ||
| PolarDB MySQL版 5.7 | 3278 | ||
| PolarDB MySQL版 8.0 | 7534 | 
- 通过DAS限流时,若参数 - ccl_max_waiting_count值为0,DAS会将其值设置为DAS的默认值(当前默认值为10);若设置值大于0,则直接使用设置值。
- RDS MySQL 5.7(小版本大于等于20200630)和 RDS MySQL 8.0 实例,当设置了 - ccl_wait_timeout参数(如果实例版本支持该参数),处于- Concurrency control waiting状态的SQL超过此限制后,SQL会继续执行,不再被限流。
- PolarDB MySQL版 8.0 实例可以设置 - ccl_mode参数(如果实例版本支持该参数),控制超出并发数量时SQL语句的行为。- WAIT(默认):排队等待。 
- REFUSE:不等待,直接报错。 
 
应用场景
| 场景 | 说明 | 
| 某类SQL并发急剧上升 | 例如缓存穿透或异常调用,可能会导致SQL并发量突然上升。 | 
| 有数据倾斜SQL | 例如大促时高频查询某些热点数据,导致整体系统繁忙。 | 
| 未创建索引表 | 例如SQL调用量特别大,且没有创建索引表,导致整体系统繁忙。 | 
限流模式
| 模式 | 说明 | 支持的数据库 | 
| 关键词限流 | 根据SQL语句中的关键词进行匹配从而限流。 说明  不支持针对某个具体的SQL语句进行限流。 | 
 | 
| SQL模板限流 | 输入SQL样本,将SQL样本进行模板化处理获取对应的SQL模板,对该类型SQL进行限流。 | 
 | 
| 对SQL模板ID进行匹配从而限流。SQL模板ID可从SQL日志、会话、EXPLAIN执行结果中获得。 说明  SQL模板ID是长度为8的十六进制字符串。 | PolarDB-X 2.0企业版 | |
| 执行耗时限流 | 根据SQL执行时间进行限流。创建了该类限流模式的规则后,当指定类型SQL的执行时间超过设定的阈值时,该类型SQL所属的模板ID会被自动加入到限流规则中,SQL会按照规则指定的并发度执行。 说明  您可以同时设置限流SQL模板ID数量上限,达到上限后,便不再自动对其他SQL创建限流规则。 | PolarDB-X 2.0企业版 | 
操作步骤
- 登录DAS控制台。 
- 在左侧导航栏中,单击智能运维中心 > 实例监控。 
- 找到目标实例,单击实例ID,进入目标实例详情页。 
- 在左侧导航栏,单击实例会话。 
- 在会话管理页面,单击SQL限流。 
- 在弹出窗中单击创建限流规则。 
- 在弹出的创建限流规则对话框中,根据不同的数据库引擎配置如下参数。 
- 限流模式为关键词限流时,需要配置此参数。 
- 仅以下数据库引擎支持限流INSERT类型: - RDS MySQL 8.0 
- PolarDB MySQL版 5.7、8.0 
- PolarDB-X 2.0 
 
- 不支持限流 - INSERT...SELECT...类型的SQL语句。
- 限流模式为关键词限流时,需要配置此参数。 
- 若您设置多个关键词,则SQL语句中需要同时包含这些关键词才会触发限流规则,多个关键词间用波浪线(~)分隔,且无顺序限制。 - 例如原始语句为: - SELECT min(id), max(id) FROM task_event WHERE gmt_modified < '2020-06-21' AND begin_time > '2020-07-09' AND source IN (527) AND id >= 15673 AND id <= 8015673。- 对应限流关键词为: - SELECT~min~id~max~id~FROM~task_event~WHERE~gmt_modified~AND~begin_time~AND~source~IN~AND~id~AND~id。
- 不支持仅设置 - SELECT、INSERT、UPDATE、DELETE为限流关键词,且关键词大小写敏感(部分早期版本实例不区分)。
- 限流模式为SQL模板限流时,需要配置此参数。 
- 在SQL较为复杂情况下,DAS会保证最终SQL模板不变的情况下,对SQL样本进行优化,优化后限流效果不会受到影响。 - 例如输入为: - select name from das where name = `das` and age = 21 limit 20。- 模板化为: - select name from das where name = ? and age = ? limit ?。- 改写为: - select name from das where name = `param0` and age = `param1` limit 20。
- 限流模式为SQL模板限流时,需要配置此参数。 
- 在SQL较为复杂情况下,DAS会对SQL样本在保证SQL模板不变的情况下进行模板化,转换后限流效果不会受到影响。 - 例如输入为: - select name from das where name = "das" and age = 21 limit 20。- 模板化为: - select name from das where name = ? and age = ? limit ?。- 改写为: - select name from das where name = "param0" and age = "param1" limit 20。
- 当前仅以下数据库引擎支持限流 - INSERT类型:- RDS MySQL 8.0 
- PolarDB MySQL版 5.7、8.0 
- PolarDB-X 2.0 
 
- 不支持限流 - INSERT...SELECT...类型的SQL语句。
- 限流模式为关键词限流时,需要配置此参数。 
- 若您设置多个关键词,则SQL语句中需要同时包含这些关键词才会触发限流规则,多个关键词间用波浪线(~)分隔,且无顺序限制。 - 例如原始语句为: - SELECT min(id), max(id) FROM task_event WHERE gmt_modified < '2020-06-21' AND begin_time > '2020-07-09' AND source IN (527) AND id >= 15673 AND id <= 8015673。- 对应限流关键词为: - SELECT~min~id~max~id~FROM~task_event~WHERE~gmt_modified~AND~begin_time~AND~source~IN~AND~id~AND~id。
- 不支持仅设置SELECT、INSERT、UPDATE、DELETE为限流关键词,且关键词大小写敏感(部分早期版本实例不区分)。 
- 限流模式为SQL模板限流时,需要配置此参数。 
- 在SQL较为复杂情况下,DAS会对SQL样本在保证SQL模板不变的情况下进行模板化,转换后限流效果不会受到影响。 - 例如输入为: - select name from das where name = "das" and age = 21 limit 20。- 模板化为: - select name from das where name = ? and age = ? limit ?。- 改写为: - select name from das where name = "param0" and age = "param1" limit 20。
- 当前仅以下数据库引擎支持限流 - INSERT类型:- RDS MySQL 8.0 
- PolarDB MySQL版 5.7、8.0 
- PolarDB-X 2.0 
 
- 不支持限流 - INSERT...SELECT...类型的SQL语句。
- 限流模式为关键词限流时,需要配置此参数。 
- 若您设置多个关键词,则SQL语句中需要同时包含这些关键词才会触发限流规则,多个关键词间用波浪线(~)分隔,且无顺序限制。 - 例如原始语句为: - SELECT min(id), max(id) FROM task_event WHERE gmt_modified < '2020-06-21' AND begin_time > '2020-07-09' AND source IN (527) AND id >= 15673 AND id <= 8015673。- 对应限流关键词为: - SELECT~min~id~max~id~FROM~task_event~WHERE~gmt_modified~AND~begin_time~AND~source~IN~AND~id~AND~id。
- 不支持仅设置SELECT、INSERT、UPDATE、DELETE为限流关键词,且关键词大小写敏感(部分早期版本实例不区分)。 
- 单击提交,完成创建。 - SQL限流规则创建完成后,您可以在运行中页签查看SQL限流规则的相关信息。列表中的参数信息如下: 说明- 不同的数据库引擎和限流模式,列表中的参数略有差异。 - 参数 - 说明 - 限流模式 - 您所选择的模式。 - 限流规则 - 关键字限流:限流关键字配置信息。 
- SQL模板限流:该限流样本对应的模板ID信息。 
- 执行耗时限流:配置的执行耗时的执行时间阈值/限流模板SQL的数量。 
 - 最大并发度 - SQL最大并发数。 - 最大等待数 - 限流规则配置的最大等待数。 说明- 数据库实例为RDS PostgreSQL, 且限流模式为SQL模板限流时,展示此参数。 - 限流时间(分钟) - SQL限流的生效时间。 - 开始时间 - 限流规则配置时间(生效时间)。 - 剩余时间 - 限流规则失效的剩余时间。 - 限流SQL样本 - 限流SQL样本配置。 说明- 限流模式为SQL模板限流时,展示此参数。 - 限流模板ID - 限流SQL样本对应模板ID。 说明- 限流模式为SQL模板限流时,展示此参数。 - 状态 - 运行中规则为启用状态。 - 数据库 - 限流SQL数据库。 说明- 限流模式为SQL模板限流时,展示此参数。 - 搜索路径 - 限流SQL对应的搜索路径。 说明- 数据库实例为RDS PostgreSQL, 且限流模式为SQL模板限流时,展示此参数。 - 匹配SQL数量 - 限流规则配置下,匹配到的SQL数量。 说明- 限流模式为SQL模板限流时,展示此参数。 - 等待SQL数量 - 限流规则配置下,正在等待SQL数量。 说明- 限流模式为SQL模板限流时,展示此参数。 - 操作 - 关闭或修改限流规则的操作按钮。 
RDS MySQL
| 参数 | 说明 | 
| 限流模式 | 根据需要选择限流模式。 | 
| SQL类型 | 选择SQL类型,取值如下:SELECT、UPDATE、DELETE、INSERT。 说明  | 
| 数据库 | SQL限流的数据库。 说明  限流模式为SQL模板限流时,需要配置此参数。 | 
| 最大并发度 | SQL最大并发数,允许设置的最小值为0。 说明  当满足限流策略的SQL同时执行,并达到最大并发数时,触发SQL限流。 | 
| 限流时间 | SQL限流的生效时间。 重要  SQL限流是应急措施,建议您按实际需求设置限流时长,用完及时关闭。 | 
| SQL关键词 | 需要限流的SQL关键词。 说明  | 
| SQL样本 | 需要限流的样本SQL。 说明  | 
RDS PostgreSQL
| 参数 | 说明 | 
| 限流模式 | RDS PostgreSQL仅支持SQL模板限流。 | 
| 数据库 | 限流SQL的数据库。 | 
| 搜索路径 | 限流SQL的搜索路径。 说明  多个路径间用英文逗号 | 
| 最大并发度 | SQL最大并发数,允许设置的最小值为0。 说明  当满足限流策略的SQL同时执行,并达到最大并发数时,触发SQL限流。 | 
| 最大等待数 | 最大等待数。 | 
| 限流时间 | SQL限流的生效时间。 重要  SQL限流是应急措施,建议您按实际需求设置限流时长,用完及时关闭。 | 
| SQL样本 | 需要限流的样本SQL。 说明  | 
PolarDB MySQL版
| 参数 | 说明 | 
| 限流模式 | 根据需要选择限流模式。 | 
| SQL类型 | 选择SQL类型,取值如下: 说明  | 
| 最大并发度 | SQL最大并发数,允许设置的最小值为0。 说明  当满足限流策略的SQL同时执行,并达到最大并发数时,触发SQL限流。 | 
| 数据库 | 限流SQL的数据库。 说明  限流模式为SQL模板限流时,需要配置此参数。 | 
| 限流时间 | SQL限流的生效时间。 重要  SQL限流是应急措施,建议您按实际需求设置限流时长,用完及时关闭。 | 
| SQL关键词 | 需要限流的SQL关键词。 说明  | 
| SQL样本 | 需要限流的样本SQL。 说明  | 
PolarDB-X 2.0
| 参数 | 说明 | 
| 限流模式 | 根据需要选择限流模式。 | 
| SQL类型 | 选择SQL类型,取值如下: 说明  | 
| 最大并发度 | SQL最大并发数,允许设置的最小值为0。 说明  当满足限流策略的SQL同时执行,并达到最大并发数时,触发SQL限流。 | 
| 限流时间 | SQL限流的生效时间。 重要  SQL限流是应急措施,建议您按实际需求设置限流时长,用完及时关闭。 | 
| SQL关键词 | 需要限流的SQL关键词。 说明  | 
| SQL模板ID | 需要限流的SQL模板ID,模板ID为长度为8的十六进制字符串, 多个SQL模板ID间用英文逗号 说明  PolarDB-X为企业版,并且限流模式为SQL模板限流时,需要配置此参数。 | 
| 最小SQL执行耗时 | SQL执行时间的阈值,当SQL的执行时间大于设置的阈值时,系统会将该类型SQL所属的SQL模板ID加入到限流规则中。 说明  PolarDB-X为企业版,并且限流模式为执行耗时限流时,需要配置此参数。 | 
| 限流SQL ID数量上限 | 通过执行耗时限流的SQL模板ID数量上限,达到上限后,系统不再对其他执行时间大于设置阈值的SQL创建限流规则。 说明  PolarDB-X为企业版,并且限流模式为执行耗时限流时,需要配置此参数。 | 
| 被限流SQL的数据库账号 | 被限流SQL所属的数据库账号。 说明  限流模式为关键词限流或SQL模板限流时,需要配置此参数。 | 
相关文档
相关API
| API | 描述 | 
| 启用SQL限流。 | |
| 关闭指定限流规则。 | |
| 关闭全部正在执行的限流规则。 | |
| 获取正在执行的限流规则。 | |
| 获取正在执行或被触发过的限流规则。 | |
| 根据SQL语句生成限流关键词。 |