1.Base基础/3.Icon图标/操作/search备份
1.Base基础/3.Icon图标/操作/search备份
EN
文档
关于AntDB
部署与升级
快速入门
使用教程
调优
工具和插件
高级服务
数据安全
参考
  • 文档首页 /
  • 运维 /
  • 集中式运维手册 /
  • 数据库参数配置

数据库参数配置

更新时间:2024-07-01 14:39:42

数据库参数修改

单节点环境

会话级设置

--以deadlock_timeout为列
--设置后仅在当前会话生效
SET deadlock_timeout ='2s';

全局设置

--以deadlock_timeout为列
--设置后全局生效
ALTER system SET deadlock_timeout ='2s';
SELECT pg_reload_conf();

需要重启数据库实例的参数设置

--部分参数设置是需要重启数据库才能生效的,如果在会话级进行设置,会提示有相关ERROR提示
antdb=# SET max_connections=123;
ERROR:  parameter "max_connections" cannot be changed without restarting the server

--对于需要重启数据库才能生效的参数,需要修改数据库目录中postgresql.conf文件,并重启数据库
--这类参数的影响范围是全局

注意:

对于全局设置的参数,请注意主备节点要保持一致。

高可用集群环境

参数的获取有一定的优先级:edit-config 修改(adbhamgrctl -c /etc/adbhamgr.yaml edit-config) > adbhamgr 的本地配置(/etc/adbhamgr.yaml) > postgresql.auto.conf > postgresql.conf > postgresql.base.conf。

对于参数的修改,有以下几种情形。

会话级设置

--以deadlock_timeout为列
--设置后仅在当前会话生效
SET deadlock_timeout ='2s';

全局设置

通过 adbhamgrctl edit-config 命令可以更改 adbdcs 中的共享配置,全局修改参数,如果需要重启生效,则修改完成重启集群即可。

--通过edit-config命令会影响集群中所有节点
--执行如下命令进入修改:
adbhamgrctl -c /etc/adbhamgr.yml edit-config

--执行上述命令后,显示DCS中的共享配置,如下:
loop_wait: 5
master_start_timeout: 300
maximum_lag_on_failover: 54023568112
postgresql:
  parameters:
    hot_standby: 'on'
    listen_addresses: '*'
    log_destination: csvlog
    log_directory: /data1/antdb/pg_log
    max_connections: 100000
    max_wal_senders: 10
    port: 55551
    wal_keep_segments: 10
    wal_level: logical
  use_pg_rewind: true
retry_timeout: 5
synchronous_mode: true
ttl: 15

--此时可在postgresql的parameters下进行修改或者添加相关参数(类似vim编辑器,按i进入修改),如:max_connections: 20000
--修改完毕后,类似vim编辑器,输入:wq! 退出编辑。

--此时界面显示修改项目,根据提示,输入y保存修改:
---
+++
@@ -8,7 +8,7 @@
     listen_addresses: '*'
     log_destination: csvlog
     log_directory: /data1/antdb/pg_log
-    max_connections: 100000
+    max_connections: 20000
     max_wal_senders: 10
     port: 55551
     wal_keep_segments: 10

Apply these changes? [y/N]:

--输入Y,会自动reload参数。

对于不需要重启生效的参数,则通过上面的修改即可生效。

对于需要重启的参数,例如 max_connections,会话级设置会提示需要重启,则还需要执行 adbhamgrctl restart 重启集群:

--部分参数设置是需要重启数据库才能生效的,如果在会话级进行设置,会提示有相关ERROR提示
antdb=# SET max_connections=123;
ERROR:  parameter "max_connections" cannot be changed without restarting the server

执行 adbhamgrctl restart 命令重启集群:

adbhamgrctl -c /etc/adbhamgr.yml restart postgres-cluster --force

AntDB 集中式数据库参数列表请参考附录。

AntDB 参数设置特性

描述

AntDB 增加会话级别 GUC 参数 adb_exclude_keywords 屏蔽关键字功能。默认值为空。

一些表用到了保留关键字作为字段名称,会导致建表失败,通过设置参数 adb_exclude_keywords,能屏蔽某些关键字,满足一些使用关键字建表的需求。

使用方法

  • session 级别,set 命令设置,如 SET adb_exclude_keywords to ‘keyword1,keyword2,keyword3....’ ;

  • 通过在 url 中添加选项如:

    url = "jdbc:postgresql://127.0.0.1:49000/postgres?options=-c%20adb_exclude_keywords=kw1,kw2";

  • 查看值:SHOW adb_exclude_keywords;

设置方法示例:
# freeze为关键字,创建表格时将freeze作为列名,失败:
antdb=# CREATE TABLE t1 (freeze int);
ERROR:  syntax error at or near "freeze"
LINE 1: CREATE TABLE t1 (freeze int);
                           ^
# 使用参数adb_exclude_keywords屏蔽关键字freeze,创建表格成功:
antdb=# SET adb_exclude_keywords = 'freeze';
SET
antdb=# SHOW adb_exclude_keywords;
 adb_exclude_keywords
----------------------
 freeze
(1 row)
antdb=# CREATE TABLE t1 (freeze int); 
CREATE TABLE

注意事项

  • 通过指定会话级的 GUC 参数来进行关键字屏蔽,但不能屏蔽如下关键字:
"database","schema","table","view","index",
"create","insert","delete","truncate","drop","update","select","alter",
"where","into","from","order","join","limit","group","exists",
"set","show"
  • 设置的值的总长度不能超过 256Bytes;

  • 设置的值,都会转会成小写,不支持设置大写;

  • 支持 oracle 关键字屏蔽和 pg 关键字的屏蔽, 设置的值必须是对应语法的关键字,否则无法达到屏蔽效果;

  • 设置的关键字重复时,会自动去重,如 ‘freeze,freeze,freeze’ -----> 'freeze'

  • 设置屏蔽字后添加数据,取消屏蔽字后,需要对值加引号才能正确取出,如下屏蔽‘between’

    SET adb_exclude_keywords to 'between';
    CREATE TABLE test_issue2136(between int); -- ok
    SET adb_exclude_keywords to '';
    SELECT * FROM test_issue2136 WHERE "between" BETWEEN 1 AND 2; -- ok
    

数据库内存参数设置建议

shared_buffers

shared_buffers 是 AntDB 用于共享缓冲区的内存,是由 8kb 大小的块所形成的数组。AntDB 在进行更新、查询等操作时,首先从磁盘把数据读取到内存,之后进行更新,最后将数据写回磁盘。shared_buffers 可以暂时存放从磁盘读取的数据,能够让用户下次访问不需要去磁盘直接从里面读取出来,增加查询效率。shared_buffers 的系统默认值通常为 128MB。但是当 AntDB 服务器的内存大于 1G 时,则shared_buffers 的合理起始值为系统内存的 25%,如果由于业务原因可以将 shared_buffers 设置的更大,但是 AntDB 依赖于操作系统的缓存,因此建议分配不要超过系统内存的 40%。建议设置系统内存的 25%-40%。

在 AntDB 中,shared_buffers 可以通过 explain (analyze,buffers)来查看出多少数据块来源磁盘,多少来源 shared_buffers,即内存的。

--sample
--shared read(共享读取)指的是其取自磁盘且不被缓存。再次执行该查询计划后,结果以shared hit的形式展现,hit就是读取shared_buffers的

benchmarksql=# EXPLAIN (analyze,buffers) SELECT * FROM bmsql_district WHERE d_w_id=30;
                                                             QUERY PLAN                              
                                
-----------------------------------------------------------------------------------------------------
--------------------------------
 Index Scan using bmsql_district_pkey on bmsql_district  (cost=0.14..1.79 rows=1 width=91) (actual ti
me=0.061..0.063 rows=0 loops=1)
   Index Cond: (d_w_id = 30)
   Buffers: shared read=1
 Planning:
   Buffers: shared hit=94 dirtied=1
 Planning Time: 1.623 ms
 Execution Time: 0.388 ms
(7 rows)

benchmarksql=# EXPLAIN (analyze,buffers) SELECT * FROM bmsql_district WHERE d_w_id=30;
                                                             QUERY PLAN                              
                                
-----------------------------------------------------------------------------------------------------
--------------------------------
 Index Scan using bmsql_district_pkey on bmsql_district  (cost=0.14..1.79 rows=1 width=91) (actual ti
me=0.025..0.027 rows=0 loops=1)
   Index Cond: (d_w_id = 30)
   Buffers: shared hit=1
 Planning Time: 0.257 ms
 Execution Time: 0.097 ms
(5 rows)

work_mem

work_mem 是 AntDB 在写入临时磁盘文件之前,进行内部 sort(order by) 和 hash(join) 操作需要使用的内存量。 work_mem 需要通过 explain analyze 分析语句来确定合适的值。 实际生产环境中,work_mem 值需要经过多次测试才能设定比较合理合适的值。 需要注意的是 work_mem 是每单个连接用户使用的内存,也就是实际需要的内存为 max_connections * work_mem,必须保证max_connections*work_mem 的值不要超过实际可用的内存。

--sample
benchmarksql=# SET work_mem='1MB';
SET
benchmarksql=# EXPLAIN (analyze) SELECT * FROM bmsql_customer WHERE c_d_id=1 ORDER BY c_discount;
                                                                               QUERY PLAN            
                                                                   
-----------------------------------------------------------------------------------------------------
-------------------------------------------------------------------
 Gather Merge  (cost=15950.90..18804.54 rows=24458 width=558) (actual time=99.856..144.341 rows=30000
 loops=1)
   Workers Planned: 2
   Workers Launched: 2
   ->  Sort  (cost=14950.88..14981.45 rows=12229 width=558) (actual time=86.578..91.024 rows=10000 lo
ops=3)
         Sort Key: c_discount
         Sort Method: external merge  Disk: 5968kB
         Worker 0:  Sort Method: quicksort  Memory: 9737kB
         Worker 1:  Sort Method: quicksort  Memory: 9211kB
         ->  Parallel Index Scan using bmsql_customer_pkey on bmsql_customer  (cost=0.42..14120.65 ro
ws=12229 width=558) (actual time=1.261..58.155 rows=10000 loops=3)
               Index Cond: (c_d_id = 1)
 Planning Time: 23.329 ms
 Execution Time: 147.796 ms
(12 rows)

benchmarksql=# SET work_mem='10MB';
SET
benchmarksql=# EXPLAIN (analyze) SELECT * FROM bmsql_customer WHERE c_d_id=1 ORDER BY c_discount;
                                                                               QUERY PLAN            
                                                                   
-----------------------------------------------------------------------------------------------------
-------------------------------------------------------------------
 Gather Merge  (cost=15950.90..18804.54 rows=24458 width=558) (actual time=68.330..119.872 rows=30000
 loops=1)
   Workers Planned: 2
   Workers Launched: 2
   ->  Sort  (cost=14950.88..14981.45 rows=12229 width=558) (actual time=58.013..62.940 rows=10000 lo
ops=3)
         Sort Key: c_discount
         Sort Method: external merge  Disk: 6032kB
         Worker 0:  Sort Method: quicksort  Memory: 9495kB
         Worker 1:  Sort Method: quicksort  Memory: 9378kB
         ->  Parallel Index Scan using bmsql_customer_pkey on bmsql_customer  (cost=0.42..14120.65 ro
ws=12229 width=558) (actual time=0.077..29.323 rows=10000 loops=3)
               Index Cond: (c_d_id = 1)
 Planning Time: 0.383 ms
 Execution Time: 123.806 ms
(12 rows)

maintenance_work_mem

maintenance_work_mem 定义的内存主要影响 vacuum、analyze、create index、reindex 等操作,这些命令用到的频率不高,但是会消耗较多的资源,系统默认值通常为 64MB,可以分配高一点的内存,让上述命令进行地快速一点。当系统内存为 32G 时,可以分配512MB-1024MB 的内存。

effective_cache_size

effective_cache_size 是优化器假设查询可以使用的最大内存(包括 AntDB 和系统缓存)和 shared_buffer 内存无关,只是给优化器生产计划使用的一个假设值。该值建议设置为可用空闲内存的 25%-50%,设置值大点,可以让优化器更倾向使用索引扫描而不是顺序扫描。

问题反馈