PG运维篇–服务配置参数

配置参数

postgreSQL的配置参数是在postgresql.conf文件中集中管理的,该文件位于$PGDATA下,此文件中的每个参数配置项的格式都是参数名=参数值。

配置文件中使用#进行注释。

所有配置项的参数名都是大小写不敏感的。

布尔:布尔值都是大小写无关的,可以是on,off,true,false,yes,no ,0,1

整数:数值可以指定单位,如一些内存配置参数可以指定KB,MB,GB等单位

浮点数:可以指定小数的数值,如1.0

字符串:单引号包起来的字符串。

枚举:不需要单引号引起来的字符串。

postgresql.conf文件中还可以使用include指令包含其他文件中的配置内容。

include  'filename'.

如果指定被包含的文件名不是绝对路径,那么就是相对于当前配置文件所在目录的相对路径,包含还可以嵌套。

所有的配置参数都在系统视图pg_setting中。

参数的访问和设置也有多种情况,有些参数发生改变后必须重启服务器才能生效,有些参数可以直接修改,还有一些参数只有超级用户才有权限修改。

参数分类

internal:只读参数,其中,有些参数是postgres程序写死的。

postmaster:改变这类参数的值需要重启实例,在postgresql.conf文件中可以改变这些参数后,需要重启pg实例修改才能生效。

sighup:在配置文件中改变这类参数的值不需要重启数据库,只需要向postmaster进程发送sighup信号,让其重启装置配置新的参数值就可以了。

backend:在postgresql.conf文件中更改这类设置无须重新启动服务器,只需要向postmaster发送一个sighup信号,让它重新读取配置文件中新的配置值,但新的配置值只会出现在修改之后的新连接中,已有的连接中该参数的值不会改变。

superuser:这类参数可以由超级用户使用set命令来改变,如检测死锁的超时时间的参数deadlock_timeout。而超级用户改变此参数值时只会影响自身的session配置,不会影响其他用户关于此参数的配置,向postmaster进程发送sighup信号也只会影响后续创建的连接,不会影响已有的连接。

user:这类参数可以由普通用户使用set 命令来改变本连接中的配置值。除了普通用户也可以改变外,不会影响已有的连接。

可以通过查询pg_setting表中的context字段值来了解改变参数在postgresql.conf文件中的配置值,来确定需不需要重启库生效。

postgres=# select name,context from pg_settings where name like 'wal_buffers';
name | context
-------------+------------
wal_buffers | postmaster
(1 row)

说明此参数需要重启才能生效。

select name,context from pg_settings where name like 'local_preload_libraries';
name | context
-------------------------+---------
local_preload_libraries | user

此参数只需要运行pg_ctl reload命名就可以了。

连接配置项

listen_addresses

string类型,申明服务器监听客户端连接的TCP/IP地址,改变此参数需要重启数据库服务。

通常设置为*,或0.0.0.0,表示在本机所有的IP地址上监听。为空则不会监听任何IP地址。

port

指定服务器监听的TCP端口,默认为5432,改变该参数值需要重启数据库服务。

max_connections

最大连接数,改变该参数需要重启。

superuser_reserved_connections

为超级用户连接而保留的连接数,改变该参数需要重启。

tcp_keepalives_idle

表示一个TCP连接中空闲多长时间后会发送一个keepalive报文。

tcp_keepalives_interval

在一个空闲TCP连接中,定义在发送第一个TCP keepalive包后,如果在该参数给定的时间间隔内没有收到对端的回包,则开始发送第二个TCP keepalive包,直到达到tcp_keepalives_count次后都没有收到回包,则认为连接已中断。

tcp_keepalives_count

发送TCP keepalive包的次数限制。

设置建议如下

tcp_keepalives_count    =3
tcp_keepalives_idle =180
tcp_keepalives_interval =10

内存配置项

shared_buffers

它表示数据缓冲区中的数据块的个数,每个数据块的大小是8KB。这个数值必须大于16,并且至少是max_connections数值的两倍。

数据缓冲区位于数据库的共享内存中,它越大越好,不能小于128KB。

这个参数只有在启动数据库时,才能被设置。

默认值是128MB。

推荐值:1/4 主机物理内存

temp_buffers

设置每个数据库会话使用的临时缓冲区的最大数目,此本地缓冲区只用于访问临时表。每个会话可以使用set命令改变此设置值,但是必须在会话第一次使用临时表前设置才有效。

work_mem

声明内部排序操作和Hash表在开始使用临时磁盘文件之前使用的内存数目,这个内存也是本地内存,默认是1024KB,

ORDER BY, DISTINCT 和合并连接( merge joins) 都会用到排序操作。

默认值为 4 兆字节( 4MB)。

推荐值:work_mem = (输入内存数量- shared_buffers)/(连接数 * 3)* 1024 (单位是 KB);

maintenance_work_mem

它决定数据库的维护操作使用的内存空间的大小。默认是16MB。

数据库的维护操作包括VACUUM、CREATE INDEX和ALTER TABLE ADD FOREIGN KEY等操作。

值如果比较大,通常可以缩短VACUUM数据库和从dump文件中恢复数据库需要的时间。

maintenance_work_mem存放在每个数据库进程的私有内存中,而不是存放在数据库的共享内存中。这个参数可以在任何时候被设置。

预写日志配置项

wal_level

可选择值为minimal replica logical此配置项绝了多少信息写入wal日志中,改变该参数需要重启数据库服务。

默认值是minimal,只写入在数据库崩溃或突然关机后进行恢复时所需的信息。

设置为replica,则会添加一些备库只读查询时需要的信息。

如果要搭建物理备库,需要把此参数设置为replica。

如果需要使用逻辑同步,设置为logical。

fsync

boolean类型,是否使用fsync()系统调用把文件系统中的脏页书刷新到物理磁盘,确保数据库能在操作系统或者硬件崩溃的情况下恢复到一致的状态。默认是on

synchronous_commit

boolean类型,声明提交一个事务是否需要等待其把WAL日志写入磁盘后才能返回。默认值是on,将此参数设置为off不会产生数据库不一致性的风险,只会导致用户已提交成功的最近的几个事务丢失。

wal_sync_method

指定向磁盘强制更新wal日志数据的方法。如果fsync设置为off,此参数无效。

open_datasync:使用O_DSYNC选项的open()函数打开wal日志。

fdatasync:每次提交时调用fdatasync函数,默认此选项,每次提交时调用fsync,同时把所有cache都刷新到物理硬盘。windows支持

fysnc:每次提交调用fsync

open_sync:使用O_SYNC选项的open函数打开wal日志。

full_page_writes

boolean类型,打开该选项时,PG会在检查点checkpoint之后对页面进行一次修改时将整个页面写入到wal日志中,因为操作系统崩溃过程中可能只有部分页面写入磁盘,从而导致在同一个页面中会有新旧数据混合的情况。在崩溃恢复期,如果wal日志中没有记录完整的页,且页中的数据是新旧混合的,则无法完全恢复该页。

wal_buffers

指定放在共享内存中用于存储wal日志的缓冲区的数目,默认值是8,64KB,改变此参数需要重启数据库,此参数设置值大小只需要能够保存一次事务生成的wal数据即可,这些数据在每次事务提交时都会写入磁盘,通常此参数设置为8~128(64K~1MB)

wal_writer_delay

把wal日志写入磁盘的周期。在每个周期中会把缓存中的wal日志刷新到磁盘上,休眠wal_writer_delay时间。

commit_delay

指定向wal缓冲区写入记录和将缓冲区刷新到磁盘上之间的时间延迟,以微妙为单位。

commit_siblin_gs

在执行commit_delay延迟时要求同时打开的最小并发事务数,默认是5。

发表评论

相关文章