KingbaseES 参数设置优先级别

Oracle的参数可以设置system和session级别,当设置了session级别的参数时,会覆盖值system级别。
KingbaseES除了该两个级别外,还有database级别、user/role级别、user/role+database组合级别。

下面针对这几个级别的参数优先级问题,进行测试验证,测试以参数 idle_in_transaction_session_timeout 为例子。

查询默认配置

[kingbase@singlekbdb data]$ grep idle_in_transaction_session_timeout kingbase.conf 
#idle_in_transaction_session_timeout = 0        # in milliseconds, 0 is disabled

system用户登录数据库查询,可以看到参数值的来源是default,未修改继承默认系统设置。
test1=# select name,setting,context,source from sys_settings where name ='idle_in_transaction_session_timeout';
                name                 | setting | context | source  
-------------------------------------+---------+---------+---------
 idle_in_transaction_session_timeout | 0       | user    | default

测试一:设置user级别参数,测试对比user级别和system级别的优先级。

test1=#  alter user u1 set idle_in_transaction_session_timeout=10;
ALTER ROLE
test1=# \c - u1
您现在已经连接到数据库 "test1",用户 "u1".
test1=>  select name,setting,context,source from sys_settings where name ='idle_in_transaction_session_timeout';
                name                 | setting | context | source 
-------------------------------------+---------+---------+--------
 idle_in_transaction_session_timeout | 10      | user    | user
(1 行记录)

登录u1用户,看到参数值已变更为10,参数值来源是是user级别,所以user级别的优先于system级别。

测试二、设置database级别参数
对比database和system级别、database和user级别的参数优先级。

test1=# alter database test1 set idle_in_transaction_session_timeout = 20;
ALTER DATABASE
test1=# \c -
您现在已经连接到数据库 "test1",用户 "system".
test1=#  select name,setting,context,source from sys_settings where name ='idle_in_transaction_session_timeout';
                name                 | setting | context |  source  
-------------------------------------+---------+---------+----------
 idle_in_transaction_session_timeout | 20      | user    | database

test1=# \c - u1
您现在已经连接到数据库 "test1",用户 "u1".
test1=>  select name,setting,context,source from sys_settings where name ='idle_in_transaction_session_timeout';
                name                 | setting | context | source 
-------------------------------------+---------+---------+--------
 idle_in_transaction_session_timeout | 10      | user    | user
(1 行记录)

修改配置后system会话的值已变更为20,参数来源是database。 u1用户的会话还是保持之前的设置不变。
所以,database级别优先于system级别,而user级别优先于database级别。

测试三、设置user+database级别参数

test1=> \c - system
您现在已经连接到数据库 "test1",用户 "system".
test1=# alter user u1 in database test1 set idle_in_transaction_session_timeout=30;
ALTER ROLE
test1=# \c - u1 
您现在已经连接到数据库 "test1",用户 "u1".
test1=>  select name,setting,context,source from sys_settings where name ='idle_in_transaction_session_timeout';
                name                 | setting | context |    source     
-------------------------------------+---------+---------+---------------
 idle_in_transaction_session_timeout | 30      | user    | database user
(1 行记录)

用户u1登录test1的会话,参数idle_in_transaction_session_timeout使用了user+database组合级别的参数值:30。
所以,user+database组合级别优先于user级别。

test1=> set idle_in_transaction_session_timeout=40;
SET
test1=>  select name,setting,context,source from sys_settings where name ='idle_in_transaction_session_timeout';
                name                 | setting | context | source  
-------------------------------------+---------+---------+---------
 idle_in_transaction_session_timeout | 40      | user    | session
(1 行记录)

直接set session级别参数值,覆盖前面的所有级别。

总结
KingbaseES 参数级别的优先顺序为:

1.默认情况下,session会继承system级别参数值;
2.在设置了database级别参数的情况下,database级别的参数值优先于system级别;
3.在设置了user/role级别参数的情况下,user级别的参数值优先于database级别;
4.在设置了user+database级别参数的情况下,该组合级别的参数值优先于user级别;
5.在当前session给会话直接set parameter=value的情况下,该参数值最优先。

posted @ 2023-03-02 16:14  KINGBASE研究院  阅读(73)  评论(0编辑  收藏  举报