您可以加入RDS PostgreSQL插件交流钉钉群(103525002795),进行咨询、交流和反馈,获取更多关于插件的信息。
前提条件
RDS PostgreSQL实例需满足以下要求:
实例大版本 | 内核小版本 |
PostgreSQL16、17 | 无小版本限制 |
PostgreSQL 14、15 | 20230330或以上 |
PostgreSQL 13 | 20250430或以上 |
已完成以下参数配置:
已创建高权限账号。
注意事项
实例重启或主备切换后,需要手动加载SQL限流规则。
配置不合理的限流规则(如并发数设置过低)可能影响正常业务,请在配置前充分评估业务负载。
限流规则在主实例创建,若需对只读实例生效,规则的node_tag
参数必须包含只读节点,且需在只读实例上单独加载SQL限流规则。
通过数据库自治服务DAS的SQL限流中创建限流规则时,系统会默认将该插件安装在目标数据库的information_schema中。该规则不支持通过SQL命令进行调用,仅能在DAS的SQL限流中使用。
创建和删除插件
通过控制台创建和删除插件
访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
在左侧导航栏单击插件管理。
在插件市场页面中,找到rds_ccl插件,并单击安装。

您也可以在管理插件页面,搜索rds_ccl插件,并单击操作列的安装。
在弹出的窗口中选择目标数据库和高权限账号后,单击确认安装,将插件安装至目标数据库。
当实例的状态由维护实例中变为运行中时,表示插件已成功安装。
说明 在管理插件页面的已安装插件页签,单击目标插件操作列的卸载,卸载目标插件。
使用示例
创建SQL限流规则
使用场景
该函数只能在主实例中调用,用于创建一个SQL限流规则。
语法
语法一:根据设置的SQL语句进行限流。
SELECT rds_add_ccl_rule(
query_string varchar,
node_tag int,
max_concurrency int,
max_waiting int,
is_enabled boolean,
comment varchar, -- 可选
search_path varchar -- 可选
);
语法二:根据设置的query_id进行限流。
SELECT rds_add_ccl_rule_with_query_id(
query_id bigint,
node_tag int,
max_concurrency int,
max_waiting int,
is_enabled boolean,
query_string varchar, -- 可选
comment varchar, -- 可选
search_path varchar -- 可选(1.2及之后版本支持)
);
参数解释
参数 | 类型 | 说明 |
query_string | varchar | 需要限流的SQL语句。 配置时,使用$$ 或$<任意字符>$ 包裹限流SQL语句,更多信息,请参见Dollar-Quoted String Constants。 例如: -- 使用$$包裹SQL语句
$$SELECT * FROM my_table;$$
-- SQL语句中已存在$$,使用$ccl$包裹SQL语句
$ccl$SELECT * FROM my_table WHERE my_column = $$hello$$;$ccl$
该函数根据query_string取值计算query_id,再根据query_id匹配同类SQL进行限流。query_id的更多信息,请参见query_id简介。 |
query_id | bigint | 需要限流的SQL语句的query_id,更多信息,请参见query_id简介。 |
node_tag | int | 限流的节点。 1:仅限制主实例。 2:仅限制只读实例。 3:限制主实例和只读实例。
说明 创建SQL限流规则函数中,此参数仅表示规则可应用的范围,不会自动在只读实例中生效。如果您想要此规则在只读实例中发挥SQL限流作用,需要手动加载,具体操作,请参见加载SQL限流规则。 |
max_concurrency | int | 限制此类SQL的最大并发数。 取值范围:0~100000 |
max_waiting | int | 限制此类SQL的最大等待数,超过设置上限时,新的SQL会导致PostgreSQL内核触发ABORT,终止并回滚事务。 取值范围:0~100000 |
is_enabled | boolean | 该规则是否生效。 |
comment | varchar | 规则描述。 |
search_path | varchar | 目标限流SQL运行时的模式搜索路径(search_path),如果配置为空字符串('' ),将使用默认search_path,您可以使用SHOW search_path; 命令查询。 |
注意事项
SQL示例
在主实例的ccl_test数据库中,有数据表ccl_tbl,创建SQL限流规则:
对所有的SELECT * FROM ccl_tbl
语句(假设其query_id=1
)进行限流。
最多允许3条此类SQL并发执行。
最多允许2个此类SQL等待。
规则创建成功后立即生效。
语法一:
SELECT rds_add_ccl_rule(
$$SELECT * FROM ccl_tbl;$$, -- 待限流的SQL语句,使用$$包裹
1, -- 仅限制主实例
3, -- 最多允许3条此类SQL并发执行
2, -- 最多允许2个此类SQL等待
true, -- 规则立即生效
'limit constant select', -- 规则描述
'' -- 使用默认的search_path
);
语法二:
SELECT rds_add_ccl_rule_with_query_id(
1, -- 待限流的SQL语句的query_id
1, -- 仅限制主实例
3, -- 最多允许3条此类SQL并发执行
2, -- 最多允许2个此类SQL等待
true, -- 规则立即生效
'' -- SQL语句的文本,本示例不填写
'limit constant select', -- 规则描述
'public' -- search_path
);
查询SQL限流规则
使用场景
该命令可以在主实例或只读实例中使用,用于查询已创建的SQL限流规则。
语法
使SQL限流规则生效
使用场景
该函数只能在主实例中调用,适用于以下场景:
语法
SELECT rds_enable_ccl_rule(ccl_id int);
参数解释
参数 | 类型 | 说明 |
ccl_id | int | SQL限流规则ID,如何查询SQL限流规则ID,请参见查询SQL限流规则。 |
注意事项
无
SQL示例
SELECT rds_enable_ccl_rule(1);
加载SQL限流规则
使用场景
该函数可以在主实例或只读实例中调用,用于加载SQL限流规则,只有被加载的规则才会发挥SQL限流作用。
适用于以下场景:
语法
SELECT rds_load_ccl_rule(ccl_id int);
参数解释
参数 | 类型 | 说明 |
ccl_id | int | SQL限流规则ID,如何查询SQL限流规则ID,请参见查询SQL限流规则。 |
注意事项
SQL示例
SELECT rds_load_ccl_rule(1);
变更SQL限流规则
使用场景
该函数只能在主实例中调用,用于变更SQL限流规则中的最大并发数和最大等待数。
语法
SELECT rds_update_ccl_rule(
ccl_id int,
new_max_concurrency int,
new_max_waiting int
);
参数解释
参数 | 类型 | 说明 |
ccl_id | int | SQL限流规则ID,如何查询SQL限流规则ID,请参见查询SQL限流规则。 |
new_max_concurrency | int | 变更后最大并发数。 |
new_max_waiting | int | 变更后最大等待数。 |
注意事项
SQL示例
SELECT rds_update_ccl_rule(
2, -- ccl_id
4, -- 新的最大并发数为4
5 -- 新的最大等待数为5
);
使SQL限流规则失效
使用场景
该函数只能在主实例中调用,用于使某条SQL限流规则失效,该规则不再发挥SQL限流作用。
语法
参数解释
参数 | 类型 | 说明 |
ccl_id | int | SQL限流规则ID,如何查询SQL限流规则ID,请参见查询SQL限流规则。 |
注意事项
SQL示例
SELECT rds_disable_ccl_rule(1);
卸载SQL限流规则
使用场景
该函数可以在主实例或只读实例中调用,用于卸载SQL限流规则,被卸载的规则不会再发挥SQL限流作用。
适用于以下场景:
语法
SELECT rds_unload_ccl_rule(ccl_id int, db_name varchar default '');
参数解释
参数 | 类型 | 说明 |
ccl_id | int | SQL限流规则ID,如何查询SQL限流规则ID,请参见查询SQL限流规则。 |
db_name | varchar | 默认为空字符串,表示当前数据库。您也可以指定其他数据库,将其他数据库下的SQL限流规则卸载。 |
注意事项
规则卸载后,不再发挥SQL限流作用,如需再次使用,需要重新加载,更多信息,请参见加载SQL限流规则。
SQL示例
SELECT rds_unload_ccl_rule(1,'');
删除SQL限流规则
使用场景
该函数只能在主实例中调用,用于删除某条SQL限流规则。规则删除时,自动从主实例卸载。
语法
SELECT rds_del_ccl_rule(ccl_id int);
参数解释
参数 | 类型 | 说明 |
ccl_id | int | SQL限流规则ID,如何查询SQL限流规则ID,请参见查询SQL限流规则。 |
注意事项
无。
SQL示例
SELECT rds_del_ccl_rule(1);
返回结果:
rds_del_ccl_rule
----------------------
-7851264404688445170
(1 row)
说明 返回结果为query_id。
如果规则不存在,则删除报错。
附录
query_id简介
query_id是PostgreSQL中SQL的特殊标识,同类SQL的query_id相同。
例如:
-- 以下两个sql的query_id相同
SELECT * FROM tbl WHERE a = 1;
SELECT * FROM tbl WHERE a = 2;
query_id包含有SQL中对象的信息(即oid信息),不同数据库下的同名表不是同一个对象,不同schema下的同名表也不是同一个对象。所以相同的SQL,如果其包含的查询对象不同,那么query_id就不相同。
如果是SQL中的访问对象的是全局表,或是全局函数,query_id相同。
调用函数场景下,当参数类型变化或是有无FROM子句时,query_id会发生变化。
例如,同样调用pg_sleep
函数,不同情况下返回query_id
结果不同。
无FROM子句:
SELECT rds_get_query_id($$SELECT pg_sleep(1);$$);
返回结果:
rds_get_query_id
--------------------
440101247839410938
(1 row)
有FROM子句:
SELECT rds_get_query_id($$SELECT * FROM pg_sleep(1);$$);
返回结果:
rds_get_query_id
----------------------
-3404018605099167039
(1 row)
参数类型变化:
select rds_get_query_id($$SELECT * FROM pg_sleep(1.0);$$);
返回结果:
rds_get_query_id
---------------------
3073869725037049158
(1 row)