3.pg重要参数解析

目录

pg_hba.conf 的配置

类似于 MySQL 中的 userhost 的配置,pg_hba.conf 文件是一个黑白名单的访问控制文件,可以控制允许哪些 IP 地址的机器访问数据库。默认创建的数据库无法接受远程连接,因为默认情况下 pg_hba.conf 中没有相应的配置项。我们可以在 pg_hba.conf 文件中加入以下命令行:

复制代码
host all all 0/0 md5

含义

第一个字段

  • local:这条记录匹配企图通过 Unix 域套接字进行的连接。
  • host:这条记录匹配企图通过 TCP/IP 进行的连接。
  • hostssl:这条记录匹配企图使用 TCP/IP 的 SSL 连接。但必须是使用 SSL 加密的连接。要使用这个选项,编译服务器的时候必须打开 SSL 支持。而且在服务器启动的时候必须打开 ssl 配置选项。
  • hostnossl :这条记录与 hostssl 行为相反:它只匹配那些在 TCP/IP 上不使用 SSL 的连接请求。
  • hostgssenc:这条记录匹配企图使用 TCP/IP 建立的连接,但仅当使用 GSSAPI 加密建立连接时。要使用这个选项,服务器必须具备 GSSAPI 支持。

第二个字段

  • database :声明记录所匹配的数据库名称。值 all 表明该记录匹配所有数据库。

第三个字段

  • user :为这条记录声明所匹配的数据库用户。值 all 表明它匹配于所有用户。

第四个字段

  • address :声明这条记录匹配的客户端机器地址。可以是 localhost、IP、CIDR 地址。
  • IP-addressIP-mask :这两个域可以被用作 IP-address/mask-length 记号法的替代方案。和指定掩码长度不同,实际的掩码被指定在一个单独的列中。

第五个字段

auth-method:指定当一个连接匹配这个记录时,要使用的认证方法。常见的有:

  1. trust:无条件地允许链接。
  2. reject:无条件地拒绝链接。
  3. md5:执行 SCRAM-SHA-256 或 MD5 认证来验证用户的口令。
  4. password:要求客户端提供一个未加密的口令进行认证。
  5. ident :通过联系客户端的 ident 服务器获取客户端的操作系统名,并且检查它是否匹配被请求的数据库用户名。Ident 认证只能在 TCP/IP 连接上使用。当为本地连接指定这种认证方式时,将用 peer 认证来替代。
  6. peer:从操作系统获得客户端的操作系统用户,并且检查它是否匹配被请求的数据库用户名。这只对本地连接可用。

第六个字段

  • auth-options :在 auth-method 域的后面,可以是形如 name=value 的域,它们指定认证方法的选项。

案例

需求:我们假定我们需要本地 postgres/root 用户可以直连数据库,其他用户不允许直连数据;远程备数据库 10.0.0.2 需要使用密码认证,用户名为 replica,则 pg_hba.conf 应该设置如下:

复制代码
# TYPE   DATABASE    USER        ADDRESS         METHOD
# "local" is for Unix domain socket connections only
local    all         all                         ident map=mymap
host     all         all         0.0.0.0/0       md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
local    replication all                         ident map=mymap
host     replication replica     10.0.0.2/32     md5

上面的配置中,map 表示允许系统和数据库用户名之间的映射,映射关系定义在 pg_ident.conf 中。

pg_ident.conf 配置如下:

复制代码
# MAPNAME       SYSTEM-USERNAME   PG-USERNAME
mymap           root              postgres
mymap           postgres          postgres

重新加载配置生效:

bash 复制代码
/usr/local/bin/pg_ctl reload -D

postgresql.conf 的配置

配置参数类型

internal(只读参数)

这些参数不配置在 postgresql.conf 中,他们由 postgres 程序和在初始化实例时写死。

postmaster

这些参数的值需要重启 PostgreSQL 实例。在 postgresql.conf 文件中改变这些参数后,需要重启 PostgreSQL 实例才能生效。

sigup

postgresql.conf 中改变参数值,不需要重启数据库;只需要向数据库 postmaster 进程发送 SIGHUP 信号。

backend

postgresql.conf 中改变参数值,不需要重启数据库;只需要向数据库 postmaster 进程发送 SIGHUP 信号,但是新的配置值只会在之后新的连接中有效,在已有的连接中不生效。

superuser

需要超级用户使用 set 来改变;超级用户改变此参数数值时,只会影响自身的 session 配置,不会影响其他用户。向 postmaster 进程发送 SIGHUP 信号,也只会影响后续建的连接。

user

普通用户可以使用 set 命令来改变。

查看方式

  1. 所有配置参数都在系统视图 pg_settings 中:
sql 复制代码
SELECT enumvals FROM pg_settings WHERE name='client_min_messages';
  1. 通过 pg_settings 表中的 context 字段来查看参数类型:
sql 复制代码
SELECT name, context FROM pg_settings WHERE name LIKE 'wal_buffers';

连接配置项

  • listen_addresses :声明服务器监听客户端连接的 TCP/IP 地址,改变这个参数需要重启数据库服务。如果主机有多个 IP,用逗号隔开,PostgreSQL 服务在多个 IP 地址上监听。当配置为 0.0.0.0*,表示监听本机的所有 IP。默认值是 localhost,表示只允许本地使用 loopback 连接到数据库,其他机器无法连接到。

  • port :指定服务器监听的 TCP 端口,默认为 5432。改变这个参数需要重启服务器。同一个端口用于服务器监听的所有 IP 地址。

  • max_connections :允许数据库连接的最大并发连接数,改变此参数需要重启数据库服务,默认 100

  • superuser_reserved_connections :为 PostgreSQL 超级用户连接而保留的连接数,默认值为 3。改变此参数需要重启。注意:这个值必须小于 max_connections

max_connections - superuser_reserved_connections = 普通用户最大连接数


安全认证参数

ini 复制代码
ssl = off
ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed SSL ciphers
ssl_prefer_server_ciphers = on
ssl_ecdh_curve = 'prime256v1'
ssl_dh_params_file = ''
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
ssl_ca_file = ''

其他参数

ini 复制代码
unix_socket_group = ''
unix_socket_permissions = 0777  # 设置 Unix-domain socket 的访问权限
tcp_keepalives_idle = 0         # 用 OS 的 sysctl 中的 tcp_keepalive_time 的值
tcp_keepalives_interval         # TCP 心跳包的频率,防止连接被网络设备中断
tcp_keepalives_count            # 发送 TCP 心跳包的次数,超过该值断开连接

数据库日志相关参数

ini 复制代码
logging_collector = on           # 日志的收集一般是需要打开的
log_directory = 'pg_log'         # 日志的目录一般使用默认值即可

日志切换和是否覆盖的几种方案

方案一:每天生成一个新的日志文件

ini 复制代码
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_truncate_on_rotation = off
log_rotation_age = 1d
log_rotation_size = 0

方案二:每当日志写满一定的大小(如 10MB),则切换一个日志

ini 复制代码
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_truncate_on_rotation = off
log_rotation_age = 0
log_rotation_size = 10M

方案三:只保留最近 7 天的日志,进行循环覆盖

ini 复制代码
log_filename = 'postgresql-%a.log'
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 0

日志归档:WAL 归档

为什么要归档?

所谓把 WAL 日志归档,其实就是把在线的已写完的 WAL 日志复制出来。

在 PostgreSQL 中配置归档的方法是在配置文件 postgresql.conf 中配置参数 archive_modearchive_commandarchive_command 的配置值是一个 UNIX 命令,此命令把 WAL 日志文档复制到其他地方。

案例:

ini 复制代码
archive_mode = on
archive_command = 'cp %p /backup/pgarch/%f'
  • %p 表示在线 WAL 日志文件的全路径名。
  • %f 表示不包括路径的 WAL 日志文件名。

在实际执行备份时,PostgreSQL 会把 %p 替换成实际的在线 WAL 日志文件的全路径名,并把 %f 替换成不包括路径的 WAL 日志名。


内存参数的设置

shared_buffers

  • 参数含义:共享内存的大小,数据库共享内存缓冲区大小,决定有多少内存可以被 PostgreSQL 用于缓存数据,该缓冲区为所有连接共用。
  • 参数优化:服务器内存较小时设置为服务器内存的 25%-40%,内存较大时可适当设置。

work_mem

  • 参数含义:单个 SQL 执行时,以及排序、HashJoin 时使用的内存,SQL 运行完毕后,该内存就会被释放。
  • 参数优化 :全局设置此参数可能会导致内存使用率过高,即当同时有多个会话进行排序操作时,每个会话会分配到这个参数大小的内存。设置不宜过大。如果要使用语句中有较大的排序操作,可以在会话级别设置该参数(如:set work_mem = '2GB')。

wal_buffers

  • 参数含义:WAL(预写日志)记录写入的缓冲区的大小。PostgreSQL 将其 WAL 记录写入缓冲区,然后将这些缓冲区刷新到磁盘。
  • 参数优化 :当单事务的数据修改量很大,产生的日志大于 wal_buffers 时,可适当调大该值。当有比较多的并发短事务时,可与参数 commit_delaycommit_siblings 连用,并适当调大该值。

commit_delay

  • 参数含义:事务提交后,日志写到 wal_buffer 上到 wal_buffer 写到磁盘的时间间隔。
  • 参数优化 :当有比较多的并发短事务时,可以适当增加该值,使日志缓冲区一次刷盘可以刷出较多的事务,减少 IO 次数,提高性能。需要和 commit_siblings 配合使用。

commit_siblings

  • 参数含义 :触发 commit_delay 等待的并发事务数,即系统的并发活跃事务数达到了该值,事务才会等待 commit_delay 的时间后才将日志刷新到磁盘。
  • 参数优化 :若系统中并发活跃事务达不到该值,commit_delay 将不起作用,为防止在系统并发压力较小的情况下事务提交后空等其他事务,不宜设置过大。

effective_cache_size

  • 参数含义 :除操作系统本身和其他应用程序可用的内存外,期望操作系统和数据库本身可用于缓存数据的内存大小。和 shared_buffer 等内存无关,只是给优化器生成计划使用的一个假设值。
  • 参数优化:如果设置有误会影响优化器的判断,得出不合理的执行计划。建议的设置为可用空闲内存的 25%。

maintenance_work_mem

  • 参数含义:执行 vacuum、create index、alter table add foreign key、restoring database dumps 等操作时可使用的内存大小。
  • 参数优化:由于这类操作并发数不会很大,增大此参数相对较为安全,如希望提升这些操作的性能,可适当加大此参数。

相关推荐
数据知道3 小时前
亿级图片链接存入 PostgreSQL,URL链接字段数据类型用哪个最合适?
数据库·postgresql
l1t3 小时前
净化SQL的PL/pgSQL函数
数据库·sql·postgresql
数据知道3 小时前
PostgreSQL实战:详解权限设置与管理全流程
数据库·postgresql
喜欢吃豆4 小时前
PostgreSQL 高维向量存储架构深度解析:架构限制、核心原理与行业解决方案
数据库·人工智能·postgresql·架构·2025博客之星
l1t4 小时前
一个在postgresql中运行很快,但是在duckdb中运行很慢的SQL
数据库·sql·postgresql·duckdb
独自归家的兔4 小时前
深度对比:PostgreSQL与MySQL的核心差异及选型指南
数据库·mysql·postgresql
数据知道5 小时前
PostgreSQL实战:窗口函数详解
数据库·postgresql
亲爱的非洲野猪8 小时前
Cassandra vs MySQL/PostgreSQL/MongoDB/Redis/Elasticsearch:选择正确的数据存储架构
mysql·mongodb·postgresql
Linux-palpitate20 小时前
PostgreSQL(PG)的1主2从集群部署安装
数据库·postgresql