实战指南:PostgreSQL开发与参数整理(第三部分)

发表时间: 2024-03-01 11:01

作者:太阳

引言

在管理和配置PostgreSQL数据库时,了解参数的分类和了解如何查看和更改这些参数是至关重要的。参数的分类涉及到不同的生效方式,如内部参数、需要重启生效的参数、不需要重启而可以重新加载配置文件生效的参数等。本文将介绍各类参数的分类及其在PostgreSQL中的作用。

一、参数的分类

参数的类型名称

说明

internal

内部参数,只读无法修改。postgres程序写死或者是在初始化指定后无法修改的参数

postmaster

更改该类参数,需重启生效

sighup

不需重启,重新加载配置文件即可生效,且会对当前所有进程生效

backend

不需重启,重新加载配置文件即可生效,但只对新连接生效

superuser

该类参数可由超级用户使用set命令来改变,只影响自身session配置,不影响其它会话;重新加载配置文件后只对新连接生效

user

该类参数可由普通用户可以使用set命令来改变,只影响自身session配置,不影响其它会话;重新加载配置文件后只对新连接生效

二、查看与更改参数的方式

1、pg_settings视图

所有的配置参数都在系统视图pg_settings中,该视图各字段含义如下,其中context字段用于记录参数的类型:

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

2、查看参数

show xxx;或select current_setting('xxx');

3、修改参数

修改当前session的参数配置:set maintenance_work_mem to '128M';或select set_config('maintenance_work_mem','128M',false);ALTER SYSTEM动态修改全局参数:ALTER SYSTEM SET configuration_parameter { TO | = } { value | 'value' | DEFAULT }将参数从postgresql.auto.conf文件中移除ALTER SYSTEM RESET configuration_parameter将所有参数从postgresql.auto.conf文件中移除ALTER SYSTEM RESET ALL说明:ALTER SYSTEM会把给出的参数 设置写入到postgresql.auto.conf文件中,该文件会随着 postgresql.conf一起被读入。ALTER SYSTEM RESET可以把参数从postgresql.auto.conf文件中移除。使用 RESET ALL可以移除所有这类配置项。用ALTER SYSTEM设置的值将在重新加载配置文件后生效(用pg_ctl reload或select pg_reload_conf();),那些只能在服务器启动时更改的参数则会在下一次服务器重启后生效。

4、令修改后的参数生效

1)重新加载配置文件
对于不需重启生效的参数,可在操作系统层执行pg_ctl reload或psql中执行select pg_reload_conf();重新加载配置文件令参数的修改生效。

2)重启生效
部分参数需重启生效,可查看pg_settings视图的pending_restart字段,如果为true表示需重启生效。

三、常见的各类参数

1、监听连接相关

参数

含义

listen_addresses

server端对客户端的Tcp/ip监听地址,默认为"localhost"表示仅允许本地通过嵌套字连接,"*"表示监听所有IP,即允许所有IP访问

port

服务器监听TCP端口,默认5432

max_connections

server端允许最大连接数,默认100

superuser_reserved_connections

Server端为超级账号保留的连接数,默认3

unix_socket_directory

Server监听客户端Unix嵌套字目录,默认/tmp

2、内存相关

参数

含义

shared_buffer

共享内存缓存区大小,默认128MB

temp_buffers

每个会话使用的临时缓存区大小,默认8MB

work_mem

内存临时表排序操作或者hash需要使用到的内存缓存大小,默认4MB

maintenance_work_mem

对于维护性操作(vacuum、create index)最大使用内存,默认64M,最小1M。

max_stack_depth

Server端执行堆栈最大安全深度,默认2M,若发现无法执行复杂函数时可适当调整该参数

3、错误日志相关

参数

含义

logging_collector

是否打开日志

log_rotation_age

超过多少天生产一个新的日志文件

log_rotation_size

超过多少大小生成一个新的日志文件

log_directory

日志目录,可以是绝对路径或相对PGDATA的相对路径

log_destination

日志记录类型,默认是stderr,只记录错误输出

log_filename

日志文件名,默认是
postgresql-%Y-%m-%d_%H%M%S.log

log_truncate_on_rotation

当日志名已存在时,是否覆盖原文件

4、慢SQL相关

参数

含义

log_statement

记录语句类型,none表示不开启,ddl标志仅仅记录DDL语句,all表示全部语句均记录

log_min_duration_statement

单位ms,记录执行超过多少ms的语句

5、主从以及WAL相关

参数

含义

wal_level

可配置minimal、replica、logical,此配置决定多少信息写入wal日志中,更改参数需重启生效。minimal,只写入在数据库崩溃会突然关机进行恢复时所需要的信息;设置为replica,会添加一些备库只读查询时需要的信息,需要流复制物理备库、归档、时间点恢复时,需设置为replica;需要逻辑订阅或逻辑备库则设置为logical,logical增加支持逻辑解码所需的信息

fsync

是否使用fsync()将内存中的脏页刷新到物理磁盘,默认为ON

synchronous_commit

事务提交是否需要等待对应的wal日志刷盘,默认为ON;复制一致性要求模式,可设置 remote_apply、on(默认值)remote_write、local、 和off

wal_sync_method

wal日志刷盘方式

full_page_write

当打开该参数时,当在检查点之后第一次修改一个页面时,整个页面都被写入wal,避免数据库崩溃恢复时数据页损坏

wal_log_hints

在full_page_writes的基础上,即使数据页发生了一些不重要的更改,也会将整个页面写入到wal日志。若数据库使用pg_rewind,需要开启该参数或者打开 data checksums

wal_compression

当开启full_page_writes参数或者进行基础备份时,是否对wal日志进行压缩,默认为off

wal_buffer

数据库变更操作首先会写入wal buffer,然后wal buffer刷盘写入到wal log,一般可设置为wal log的1/32,但不建议过小或者过大,一般设置为16MB。

wal_writer_delay

wal buffer进行刷盘从时间维度上的频率,默认200ms。若距离上一次刷盘时间小于 wal_writer_delay 且容量小于 wal_writer_flush_after ,wal仅仅会写入os,并不会进行刷盘

wal_writer_flush_after

wal buffer 进行刷盘从容量上的频率,默认为8kb。若距离上一次刷盘时间小于 wal_writer_delay 且容量小于 wal_writer_flush_after ,wal仅仅会写入os,并不会进行刷盘

max_wal_size

在两次checkpoint期间wal日志增长最大限制,该参数的限制属于软限制。当archive异常、standby复制异常、重负载、wal_keep_segments参数设置过大时,该参数可能会进行扩展。该参数设置过大会影响数据崩溃恢复的时间

min_wal_size

当wal日志空间占用小于该参数时,wal日志会被进行复用而不会被删除,该参数可确保批处理操作时有足够的wal空间进行存储,默认为80MB

wal_keep_size

指定在 pg_wal 目录中保留的 wal segment file 的最小大小,以便流复制环境中的 standby server 从主库中 fetch wal file;单位MB

wal_sender_timeout

发送方(主库)walsender进程的超时时间,如果存在超过这个时间、停止活动的复制连接,会被中断,默认以毫秒为单位,默认60s

wal_receiver_timeout

接收方(从库)walreceiver进程的超时时间,如果存在超过这个时间、停止活动的复制连接,会被中断,默认以毫秒为单位,默认60s

6、复制相关

参数

含义

max_wal_senders

数据库启动wal发送进程的最大并发数(备用服务器复制或者基础备份)

max_replication_slots

数据库可创建的复制槽个数

wal_keep_segments

为保证备用服务器复制落后时,主数据库仍保留所需的wal日志的wal段大小

synchronous_standby_names

PG默认采用异步复制,如要配置同步复制,需将synchronous_standby_names设置为非空,synchronous_commit设置为ON

官网说明:
http://postgres.cn/docs/13/runtime-config-replication.html#GU...


hot_standby

standby实例是否可进行查询

wal_sender_timeout

中断那些停止活动超过指定毫秒数的复制连接。这对发送服务器检测一个后备机崩溃或网络中断有用。设置为0将禁用该超时机制,默认为 60 秒

wal_receiver_timeout

从master实例接收wal的最大时间限制,终止处于非活动状态的复制连接。设置为0会禁用超时机制,默认值是 60 秒

hot_standby_feedback

当开启该参数时,备用服务器执行大查询或者大事物期间,主数据库进行相应的vacuum操作时,保留备用服务所需的版本记录。若备份服务器长时间存在大查询或者大事物,会导致对应表膨胀

7、超时相关

参数

含义

deadlock_timeout

超过该参数的锁才会进行死锁检测,默认1s

lock_timeout

锁等待超时时间,默认为0表示一直等待

statement_timeout

控制语句执行时长,单位是ms。超过设定值,该语句将被终止

idle_in_transaction_session_timeout

终止开启事务但空闲时间超过指定持续时间(以毫秒为单位)的任何会话,默认为0表示不开启该功能

checkpoint_timeout

两次检查点之间的最长时间间隔,单位是秒

archive_timeout

强制数据库切换新的wal日志的时间间隔,默认为0,表示禁用,一般1min设置是比较合理的

authentication_timeout

完成服务器认证的最长时间,如果在这个时间内没有完成认证,服务器将关闭连接,默认1min

wal_sender_timeout

中断那些停止活动超过指定毫秒数的复制连接。这对发送服务器检测一个后备机崩溃或网络中断有用。设置为0将禁用该超时机制,默认为 60 秒。

wal_receiver_timeout

从master实例接收wal的最大时间限制,终止处于非活动状态的复制连接。设置为0会禁用超时机制,默认值是 60 秒。

8、vacuum相关

参数

含义

vacuum_cost_delay

超出成本计数后强制休眠时间,该参数不建议设置过大

vacuum_cost_page_hit

vacuum操作命中 shared buffer 的代价消耗

vacuum_cost_page_miss

vacuum操作未命中 shared buffer 的代价消耗

vacuum_cost_page_dirty

vacuum操作未命中 shared buffer 后,需要将对应的dirty页刷盘的代价消耗

vacuum_cost_limit

需要强制休眠的代价限制

9、异步相关

参数

含义

effective_io_concurrency

数据库允许会话级别进行并发磁盘I/O操作的数量

maintenance_io_concurrency

数据库维护操作允许发起的并发磁盘I/O操作数量

max_worker_processes

数据库支持最大后台进程数,默认为8,若调整改参数需要对应的调整以下参数:max_parallel_workers、
max_parallel_maintenance_workers和
max_parallel_workers_per_gather

max_parallel_workers_per_gather

并行查询最大工作进程数,进程资源从 max_worker_processes 中获取,并受限于 max_parallel_workers

max_parallel_maintenance_workers

数据库进行维护操作的最大并行进程数,进程资源从 max_worker_processes 中获取,并受限于 max_parallel_workers

max_parallel_workers

数据库支持最大并行工作进程

更多技术信息请查看云掣官网云掣YunChe - 可观测运维专家 | 大数据运维托管 | 云MSP服务