PG参数整理
一、参数的分类
参数的类型名称 | 说明 |
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; |
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; |
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 |
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 | 数据库支持最大并行工作进程 |