暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

[金仓数据库征文]一篇文章聊透KingbaseES参数使用

原创 forever 2025-05-16
498

        数据库,作为信息系统的心脏,其性能与稳定性对于业务的连续性和数据的安全性至关重要。在数字化转型的浪潮中,人大金仓Kingbase凭借其出色的性能、高度的稳定性和丰富的功能,赢得了业界的广泛认可。Kingbase数据库的参数配置是其强大功能的基石,本文的核心Kingbase的参数使用,工欲善其事必先利其器

一、参数存储

KingbaseES数据库的配置参数都在Kingbase.conf 与 kingbase.auto.conf这两个参数文件中,对数据库需要持久化的参数修改都会保存再这两个参数文件中,用来控制数据库服务器的行为

  1. Kingbase.conf‌:这是金仓数据库的主要配置文件,包含了数据库的各种参数设置,用于手动配置和修改数据库的参数,以满足特定的性能需求或管理要求,文件一般存储在数据库数据目录下。

  2. kingbase.auto.conf‌:这是由ALTER SYSTEM命令自动生成的配置文件,用于保存通过ALTER SYSTEM命令修改的参数,确保通过ALTER SYSTEM命令进行的参数修改能够持久化,并在数据库重启后仍然有效。文件同kingbase.conf一样一般存储在数据库数据目录下。

注意:postgresql.auto.conf 文件里的内容,在执行 alter system reset all; 会全部清除,故若需要手动配置,最好不要放在 postgresql.auto.conf 里。

3.子配置文件:除了如上两个文件,我们还可以在kingbase.conf中可以添加include参数,用于加载子配置文件,它指定要读入和处理的另外自定义的参数文件,该参数需写绝对路径,不写绝对路径,则默认从data里查找。

子配置文件使用:

1)使用include ‘filename’ 引用单个子配置文件include的子配置文件不存在时,启动数据库时会失败  

在kingbase.conf文件中添加"include= ‘my.conf’",如有多个文件可以填写多个,重启生效

2)使用include_if_exists 'filename’引用单个子配置文件include_if_exists的子配置文件不存在时,仅仅记录一个错误消息,继续启动    

在kingbase.conf文件中添加"include_if_exists= ‘my.conf’",如有多个文件可以填写多个,重启生效

3)include_dir ‘directory’ 引用多个子配置文件以ASCII码的顺序调用.conf文件(数字>大写>小写)

在kingbase.conf文件中添加"include_dir= '/home/kingbase/myconf '",重启生效

例子:

vi Kingbase.conf‌

# These options allow settings to be loaded from files other than the
# default kingbase.conf. Note that these are directives, not variable
# assignments, so they can usefully be given more than once.

include_dir = ‘my.conf’ # include files ending in ‘.conf’ from
# a directory, e.g., ‘conf.d’
include_if_exists = ‘my.conf’ # include file only if it exists
include = ‘/home/kingbase/myconf’ # include file

文件优先级

  1. 对于kingbase.conf 与 kingbase.auto.conf文件,如果有相同条目,则以kingbase.auto.conf文件参数值为准(忽略 kingbase.conf 相同条目)。

  2. 读取先后顺序:数据库启动时先读取 kingbase.conf,再读取kingbase.auto.conf,如果二者相同条目,会忽略kingbase.conf文件的相同条目。

注意:子配置文件在kingbase.conf里优先级也低于kingbase.auto.conf文件

二、参数分类

金仓数据库的参数按生效场景可以分为:

  1. ‌internal(只读参数):

    • 这类参数是只读的,不能修改,部分参数是程序内置的,无法更改,另一部分参数在安装数据库时,通过intdb命令进行设置,之后也无法修改。
  2. kingbase‌:

    • 这类参数在修改后,需要重启数据库服务才能生效。
  3. sighup‌:

    • 修改这类参数无需重启数据库,但需要向kingbase进程发送sighup信号,以重新加载配置文件。
    • 这可以通过操作系统命令sys_ctl reload或在ksql中执行select sys_reload_conf();来生效。
  4. backend‌:

    • 修改这类参数同样无需重启数据库,向kingbase进程发送sighup信号后,新的配置参数将在之后的新连接中生效,已有连接中的这些参数值不会改变。
  5. ‌superuser(超级用户参数):

    • 这类参数可以由超级用户使用set命令进行修改,修改后的参数设置仅会影响超级用户自身的session配置,对其他用户无影响。
  6. ‌user(普通用户参数):

    • 这类参数可以由普通用户使用set命令进行修改,修改后的参数设置同样仅会影响用户自身的session配置,不会对其他用户产生影响。

可以通过查询sys_settings表的context字段值来查看参数类型,是否需要重启数据库生效。

select name,setting,context,pending_restart from sys_settings where name like ‘%connection%’;

select * from sys_file_settings where applied = true ;  —查看实际生效的配置项

select name,context,pending_restart from sys_settings where name like '%connection%';

修改完后可以通过查看sys_file_settings,查看你设置的参数是否生效。例如如果你设置了⼀个参数需要重启数据库才能生效或者设置错误,那么在此字典中会出现报错。

select * from sys_file_settings;

修改案例:

school=# select name,context,pending_restart from sys_settings where name like ‘%connection%’;

name | context | pending_restart
--------------------------------±------------------±----------------
connections_limit_per_user | sighup | f
log_connections | superuser-backend | f
log_disconnections | superuser-backend | f
max_connections | kingbase | f                   --kingbase类型参数需要重启
superuser_reserved_connections | kingbase | f
(5 rows)

school=# show max_connections;
max_connections
-----------------
10
(1 row)

school=# alter system set max_connections =100;
ALTER SYSTEM

school=# select * from sys_file_settings where name=‘max_connections’;
sourcefile | sourceline | seqno | name | setting | applied | error
-----------------------------------------±-----------±------±----------------±--------±--------±-----------------------------
/Kingbase/ES/V9/data/kingbase.conf | 64 | 3 | max_connections | 100 | f |

/Kingbase/ES/V9/data/kingbase.auto.conf | 3 | 29 | max_connections | 100 | f | setting could not be applied --提示未生效,需要重启

(2 rows)

school=# **show max_connections; ** --未生效
max_connections
-----------------
10
(1 row)

三、参数查看

1、通过文件查看

在金仓数据库中,参数查看可以登录数据库操作系统,通过参数文件Kingbase.conf‌,kingbase.auto.conf,子配置文件等参数文件来查看参数‌

Kingbase.conf‌,kingbase.auto.conf这两个文件存在于数据库data目录下,如找不到可以搜索

主配置文件/KingbaseES/V8/data/kingbase.conf

# 可通过find查找

find / -name kingbase.conf

辅助参数文件kingbase.auto.conf

# 可通过find查找
find / -name kingbase.auto.conf

如果以上文件没有找到参数,如果使用了子配置文件去自己创建的子配置文件查看

具体地址和文件名称可参照kingbase.conf里的include ,include_if_exists 关键字

# These options allow settings to be loaded from files other than the
# default kingbase.conf. Note that these are directives, not variable
# assignments, so they can usefully be given more than once.

#include_dir = ‘…’ # include files ending in ‘.conf’ from
# a directory, e.g., ‘conf.d’
#include_if_exists = ‘…’ # include file only if it exists
#include = ‘…’ # include file

2、通过命令查看

Kingbase系统中,可以使用show命令或current_setting函数查看具体参数的当前配置值:

#通过show来查看----在ksql下查询时可以用tab键补齐

show 参数名称 ;

show max_connections;

#查看所有参数

show all;

#通过函数查看 ----缺点是需要知道完整的参数名称

select current_setting(‘参数名称’);

select current_setting(‘max_connections’);

3、通过sys_settings查看

Kingbase提供sys_settings表,sys_settings表提供系统参数配置的全部参数,它还提供了show不能提供的关于每一个参数的一些限制,例如最大值和最小值。

select name,setting,context,pending_restart from sys_settings where name like ‘%参数名称%’;

表介绍:

name:运行时配置参数名
setting:参数的当前值
unit:存储参数的单位,如ms
category:参数的逻辑组
short_desc:参数的简短描述
extra_desc:附加的参数的详细描述
context:用于记录参数的类型,可根据该值判断参数修改是否需重启生效
vartype:参数类型 (bool, enum, integer, real, or string)
source:当前参数值的来源
min_val:参数的最小允许值(对非数字值为空)
max_val:参数的最大允许值(对非数字值为空)
enumvals:用于存储参数的可取值(对非数字值为空)
boot_val:如果参数没有被别的其他设置,此列为在服务器启动时设定的参数值
reset_val:在当前会话中,RESET将会设置的参数值
sourcefile:当前值被设置的配置文件(空值表示从非配置文件的其他来源设置,由不是超级用户也不是pg_read_all_settings成员的用户检查时也为空值),在配置文件中使用include指令时有用
sourceline:当前值被设置的配置文件中的行号(空值表示从非配置文件的其他来源设置,由不是超级用户也不是pg_read_all_settings成员的用户检查时也为空值)。
pending_restart:如果配置文件中修改了该值但需要重启,则为true,否则为false

四、参数修改

KingbaseES 数据库中,参数配置和修改有多种方式,不同的修改方式有不同的注意事项,数据库中不同的修改方式也会有不同的作用域,有些作用于实例,有些作用域数据库,有些作用域用户,有些作用域会话,根据自己业务需求灵活调整数据库集群参数。

1、通过参数文件Kingbase.conf修改

在金仓KingbaseES数据库中,参数修改可以登录数据库操作系统,通过参数文件Kingbase.conf子配置文件等参数文件来修改参数,通过参数文件修改参数作用域一般都是数据库实例;

Kingbase.conf‌文件默认存在于数据库data目录下,如找不到可以搜索

主配置文件/KingbaseES/V8/data/kingbase.conf

# 可通过find查找

find / -name kingbase.conf

如果使用了子配置文件也看去子配置文件修改

#找到参数修改然后根据第二节的参数分类来确定是需要重启还是重新加载数据文件来使参数生效

vi kingbase.conf

2、通过命令修改

还可以通过数据库命令来进行配置修改。

1)set命令修改

set命令(等效SET SESSION)session级别,用户在当前会话设置,只在当前会话生效,不会影响其他 session,**session 级(superuser)**相关参数只能由 superuser 设置

set parameter = value;

#例子

school=# show work_mem;
work_mem
----------
10MB
(1 row)

school=# set work_mem = 102400;
SET
school=# show work_mem;
work_mem
----------
100MB
(1 row)

set local,只在当前事务中修改,只在当前事务内有效,SET LOCAL 值将在事务结束前一直可见,但之后(如果事务已提交或者回滚)SET 值将生效。

set local parameter = value;

#例子

school=# show work_mem;
work_mem
----------
10MB
(1 row)
school=# begin;
BEGIN
school=# set local work_mem=102400;
SET
school=# show work_mem;
work_mem
----------
100MB
(1 row)
school=# commit;
COMMIT
school=# show work_mem;
work_mem
----------
10MB
(1 row)

2)alter 命令修改

只有具有足够权限的用户(如超级用户)才能使用ALTER命令来修改

全局参数修改ALTER SYSTEM

ALTER SYSTEM 可以修改全局默认值,使用alter system 命令修改参数,等效于直接编辑kingbase.conf,但不真实改变kingbase.conf文件,使用alter system命令将修改参数将保存在kingbase.auto.conf文件。

alter system set  parameter = value;

#例子1------修改kingbase类型参数

school=# show max_connections;
max_connections
-----------------
10
(1 row)
school=# alter system set max_connections=100;
ALTER SYSTEM

school=# \! cat /Kingbase/ES/V9/data/kingbase.auto.conf |grep ‘max_connections’;
max_connections = ‘100’            -----------可以看到文件内容已经变成修改值了

#例子2-------修改sighup类型参数

school=# show max_wal_size;
max_wal_size
--------------
1GB
(1 row)

school=# alter system set max_wal_size=2048;
ALTER SYSTEM
school=# select sys_reload_conf();
sys_reload_conf
-----------------
t
(1 row)

school=# show max_wal_size;
max_wal_size
--------------
2GB
(1 row)
school=# \! cat /Kingbase/ES/V9/data/kingbase.auto.conf |grep ‘max_wal_size’;
max_wal_size = ‘2048’             ------可以看到文件内容已经变成修改值了

数据库级别参数ALTER DATABASE

ALTER DATABASE作用域为整个数据库,参数设置将覆盖全局设置或实例级别的设置,并且仅对指定的数据库有效,参数将在重新连接该数据库或刷新会话时生效,已经存在的会话不会立即应用这些新的设置

alter database school set  parameter = value;

#例子 ----修改数据库级别参数

school=# show work_mem ;
work_mem
----------
4MB
(1 row)
school=# alter database school set work_mem = ‘2MB’;
ALTER DATABASE
school=# \q
[kingbase@localhost ~]$ ksql -Usystem school
Password for user system:
Type “help” for help.

school=# show work_mem ;
work_mem
----------
2MB
(1 row)

用户级别参数ALTER ROLE

ALTER ROLE作用域为用户,参数设置将覆盖全局设置或数据库级别的设置,并且仅对指定的角色(用户)有效,并且仅在新会话中生效

alter role school set  parameter = value;

#例子 ----修改用户级别参数

school=# show work_mem;
work_mem
----------
2MB
(1 row)

school=# alter role school set work_mem=‘4MB’;
ALTER ROLE
school=# \q
[kingbase@localhost ~]$ ksql -Uschool school
Password for user school:
Type “help” for help.

school=> show work_mem;
work_mem
----------
4MB
(1 row)

用户及数据库同时设置ALTER ROLE

ALTER ROLE IN DATABASE作用域也为用户,可以同时指定用户在哪一个数据库的参数设置,同样会覆盖全局设置或数据库级别的设置,并且仅对指定的角色(用户)与对应数据库有效

alter role school in database school set  parameter = value;

#例子

school=> show work_mem;
work_mem
----------
4MB
(1 row)

school=> alter role school in database school set work_mem=‘2MB’;
ALTER ROLE
school=> \q
[kingbase@localhost ~]$ ksql -Uschool school ------可以看到在school用户连接school数据库参数为2MB
Password for user school:
Type “help” for help.

school=> show work_mem;    
work_mem
----------
2MB
(1 row)

school=> \q
[kingbase@localhost ~]$ ksql -Uschool test      ------可以看到在school用户连接school数据库参数为4MB
Password for user school:
Type “help” for help.

test=> show work_mem;
work_mem
----------
4MB
(1 row)

参数优先级总结:会话参数 > 用户级参数 > 库级参数 > 全局参数

3、函数命令修改

kingbase也提供了通过函数命令的方式修改

select set_config(setting_name, new_value, is_local);

select set_config(‘parameter’, value,false);

test=> show work_mem ;
work_mem
----------
4MB
(1 row)

test=> select set_config(‘work_mem’, 2048 ,false);
set_config
------------
2MB
(1 row)

test=> show work_mem ;
work_mem
----------
2MB
(1 row)

4、通过Shell设置参数

通过Shell设置参数,非常规用的也很少,修改后排查问题也不容易发现,仅限了解,不做介绍

env KINGBASE_OPTIONS="-c geqo=off -c statement_timeout=5min" ksql

5、参数重置默认值

有些时候我们修改完参数,如参数不合适或者修改错了需要修改成默认值,可以直接重置成默认值,当然用上面设置命令也时可以的

#可以通过视图sys_settings里的字段reset_val字段中的值了解此参数恢复默认值的大小,是否为想恢复的值。

#重置全局参数

alter system reset work_mem;

#alter system reset all; 会全部清除postgresql.auto.conf 文件里的内容谨慎使用

alter system reset all;

#重置会话参数

reset work_mem;

#重置所有会话参数,

reset all;

#例子

school=# show work_mem;
work_mem
----------
2MB
(1 row)

school=# select set_config(‘work_mem’, 4096 ,false);
set_config
------------
4MB
(1 row)
school=# show maintenance_work_mem;
maintenance_work_mem
----------------------
64MB
(1 row)

school=# set maintenance_work_mem=‘128MB’;
SET
school=# show work_mem;
work_mem
----------
4MB
(1 row)

school=# show maintenance_work_mem;
maintenance_work_mem
----------------------
128MB
(1 row)

school=# reset all;
RESET

school=# reset all;
RESET
school=# show maintenance_work_mem;
maintenance_work_mem
----------------------
64MB
(1 row)

school=# show work_mem;
work_mem
----------
2MB
(1 row)

五、重要参数介绍

1、内存相关参数

shared_buffers
数据库服务器使用的共享内存缓冲区的数量,主要用于缓存数据,根据需求一般不能设置超过80% 的内存,但至少是20%。

work_mem
work_mem在写入临时磁盘文件之前,进行内部sort(order by)和hash(join)操作需要使用的内存量。work_mem需要通过explain analyze分析语句来确定合适的值。

effective_cache_size
优化器估算的磁盘缓存大小,建议设为物理内存的50%-75%,影响索引扫描成本计算。

maintenance_work_mem
VACUUM/索引创建等维护操作的内存分配,在维护性操作(比如 VACUUM, CREATE INDEX, ALTER TABLE ADD FOREIGN KEY 等)调整大小,默认是16MB,比如创建索引的索引数据很大,比如10g,如果内存允许 就可以调整这个参数,一般在需要创建索引的时候调大,创建完之后再调小。

wal_buffers
WAL日志缓冲区大小,默认16MB,高并发写入场景可增至32-64MB,如果单位时间事务的数据修改数据量较大,也就是事务的写比较多的情况,如果IO是瓶颈,可以调整这个值到很大

2、checkpoint相关的参数

checkpoint_timeout:
这是自动WAL检查点之间的最长时间(默认为5分钟)。增加此参数可能会增加崩溃恢复所需的时间。

max_wal_size:
使WAL增长到自动WAL检查点之间的最大大小。默认值为1 GB。增大此参数可能会增加崩溃恢复所需的时间。

如果我们同时设置了这两个参数,则检查点将以先到者为准。

min_wal_size:
只要WAL磁盘使用率保持低于此设置,旧的WAL文件将始终在检查点被回收以备将来使用,而不是被删除。这可以用来确保保留足够的WAL空间来处理WAL使用率的峰值,例如在运行大型批处理作业时。 (默认为80 MB)

checkpoint_completion_target :
由于每5分钟或达到每个max_wal_size阈值都会发生一次检查点,因此在检查点时间内,共享缓冲区中存在的所有脏页将被刷新到磁盘,从而导致巨大的IO。这会使刷新速度变慢,这意味着PostgreSQL应该花费checkpoint_completion_target * checkpoint_timeout的时间来写入数据。

wal_buffers :

用于尚未写入磁盘的WAL数据的共享内存量。默认设置为-1,选择的大小等于shared_buffers的1/32(大约3%),但不小于64kB,也不大于一个WAL段的大小,通常为16MB。

checkpoint_flush_after:
在执行检查点时,只要写入的字节数超过checkpoint_flush_after,则尝试强制OS将这些写入操作刷到存储中。这样做将限制内核页面缓存中的脏数据量,从而减少在检查点末尾发出fsync时停顿的可能性。

3、影响执行计划的参数

enable_seqscan
是否选择全表扫描。实际上并不能完全禁止全表扫描,但是把这个变量关闭会让优化器在存在其他方法时优先选择其他方法

enable_indexscan
是否选择索引扫描

enable_bitmapscan
是否选择位图扫描

enable_tidscan
是否选择位图扫描

enable_nestloop
多表连接时,是否选择嵌套循环连接。如果设置为“off”,执行计划只有走嵌套循环连接一条路时,优化器也只能选择走这一条路,
但是如果有其他连接方法可走,优化器会优先选择其他方法。

enable_hashjoin
多表连接时,是否选择hash连接

enable_mergejoin
多表连接时,是否选择merge连接

enable_hashagg
是否使用hash聚合

enable_sort
是否使用明确的排序,如果设置为“off”,执行计划只有排序一条路时,优化器也只能选择这条路,
但是如果有其他连接方法可走,优化器会优先选择其他方法

4、与 oracle 兼容参数开关

ora_date_style
默认为 off,日历日期形式为年,月,日 #值为 on 时,日历日期形式为(年,月,日,时,分,秒)。

ora_format_style ----v8支持v9移除了此参数
开关开启时,格式化输出(to_char,to_timestamp…)兼容 oracle,默认 值为 off

ora_func_style ----v8支持v9移除了此参数
设置兼容 Oracle 函数行为,默认为 true 启用状态。当启用 (true) ora_func_style 时, sequence.nextval 兼容 Oracle 的 Sequence 伪列行 为。 比如,SELECT SEQ.NEXTVAL AS A, SEQ.NEXTVAL AS B FROM DUAL,结果 A B 值相 同。ltrim/rtrim/btrim 兼容 Oracle 对应函数行为, 最长的只包含 characters 只能是 一个字 符。 textcat 兼容 Oracle 字符 串连接 NULL 时候,结果为字符串本身。 regexp_replace 兼容 Oracle 该函数行为,regexp_replace 参数中有 NULL 出现,当做空串 处理。 当 关闭(false)ora_func_style 时,上述函数表现为原有形式。

ora_input_emptystr_isnull
设置空串输入的输入形式(空串或 NULL)及部分函数返回值空串输出 形式(空串或 NULL),默认为 true 启用状态。当启用(true) ora_input_emptystr_isnull 时, 既可 以输入空串有可以输入为 NULL, 那么空串将变成 NULL 的形式输入。比如,我们向没有空值限制列加入 数据空串数据时候, 实际空串会被当做 NULL 存入该列中。 COMMENT 注释对象信息时候,注释信息(text)为空串时候,空串作为 NULL 处 理,就表示删除对象信息。 regexp_replace 和 ltrim/rtrim/btrim 返回 值为空串时候,返回 NULL。 当关闭(false)ora_input_emptystr_isnull 时,输入空串依旧作为空串处 理;上述函数返回值为空串时候,依旧返 回空串。

ora_numop_style=on
兼容 oracle number 类型数据的 operator

最后修改时间:2025-05-30 16:28:41
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论