Skip to content

PostgreSQL 核心配置文件

PostgreSQL 的核心配置文件包含了数据库运行的基本参数设置,直接影响数据库的安全性、性能和可靠性。了解这些配置文件的结构和内容是 PostgreSQL DBA 的必备技能。

配置文件概述

PostgreSQL 的核心配置文件主要包括:

配置文件主要作用位置版本差异
postgresql.conf主配置文件,包含大部分服务器参数数据目录下参数随版本增加,旧版本参数可能被废弃
pg_hba.conf主机基础认证配置,控制客户端访问数据目录下认证方法随版本增强,PostgreSQL 14+默认使用scram-sha-256
pg_ident.conf身份映射配置,用于外部认证系统数据目录下各版本差异较小
postgresql.auto.conf自动生成配置,由 ALTER SYSTEM 修改数据目录下PostgreSQL 9.4+引入

postgresql.conf - 主配置文件

文件结构

postgresql.conf 是 PostgreSQL 最核心的配置文件,包含了控制数据库行为的大部分参数。文件采用键值对格式:

ini
# 这是注释
parameter_name = value
# 示例:
shared_buffers = 4GB
work_mem = 8MB

生产环境核心参数配置

以下是生产环境中常见的核心参数配置建议:

连接与认证

ini
# 监听地址,生产环境建议指定具体IP,避免使用 '*' 暴露所有接口
listen_addresses = '192.168.1.100,127.0.0.1'

# 端口,默认5432,可根据需要修改
port = 5432

# 最大连接数,根据硬件资源和业务需求调整
max_connections = 200

# 超级用户连接数限制,建议留一些连接给超级用户应急
superuser_reserved_connections = 3

资源消耗

ini
# 共享缓冲区,建议设置为系统内存的 25%-40%
shared_buffers = 4GB

# 工作内存,每个连接执行复杂查询时使用的内存
# OLTP 场景:4MB-16MB;OLAP 场景:可适当增大
work_mem = 8MB

# 维护工作内存,用于 VACUUM、CREATE INDEX 等操作
maintenance_work_mem = 1GB

# 有效缓存大小,告诉查询优化器系统可用的缓存总量
# 建议设置为系统内存的 50%-75%
effective_cache_size = 12GB

WAL 管理

ini
# WAL 级别,生产环境建议 replica 或 logical
# replica:支持物理和逻辑复制
# logical:支持逻辑复制和逻辑解码
wal_level = replica

# WAL 缓冲区大小,默认 16MB,可根据写入量调整
wal_buffers = 16MB

# 强制 WAL 写入磁盘的策略
# on:事务提交时同步写入(最安全)
# off:异步写入(性能最佳,有数据丢失风险)
# local:仅写入本地文件系统,不等待刷新到磁盘
synchronous_commit = on

# 同步复制模式,生产环境建议 quorum 或 remote_apply
# primary:只保证写入主库
# quorum:保证写入大多数节点
# remote_apply:保证写入并应用到备库
# synchronous_standby_names = 'FIRST 1 (standby1, standby2)'

检查点管理

ini
# 检查点完成目标比例,建议设置为 0.9 以平滑 I/O
checkpoint_completion_target = 0.9

# 检查点间隔,默认 5 分钟,可调整为 15-30 分钟减少 I/O 峰值
checkpoint_timeout = 15min

# 最大 WAL 段数,触发检查点的 WAL 数量
max_wal_size = 16GB

# 最小 WAL 段数,恢复时允许的最小 WAL 数量
min_wal_size = 4GB

查询优化

ini
# 优化器成本参数,影响查询计划选择
# 对于 SSD 存储,可以降低 seq_page_cost
seq_page_cost = 1.0
random_page_cost = 4.0
cpu_tuple_cost = 0.01

# 并行工作者数量,根据 CPU 核心数调整
max_parallel_workers_per_gather = 4
max_parallel_workers = 8

# 自动分析参数,控制自动更新统计信息
autovacuum_analyze_scale_factor = 0.05
autovacuum_analyze_threshold = 50

日志配置

ini
# 日志级别,生产环境建议 info 或 warning
log_min_messages = warning

# 慢查询日志,记录执行时间超过此值的查询
log_min_duration_statement = 1000  # 单位毫秒

# 日志格式,建议使用 json 便于日志分析系统处理
log_destination = 'csvlog'
logging_collector = on
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_rotation_age = 1d
log_rotation_size = 100MB

# 日志包含的内容
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '
log_checkpoints = on
log_connections = on
log_disconnections = on
log_lock_waits = on

自动清理 (Autovacuum)

ini
# 启用自动清理
autovacuum = on

# 自动清理工作者数量
autovacuum_max_workers = 8

# 自动清理间隔
autovacuum_naptime = 1min

# 表级 autovacuum 比例,建议设置为 0.05 以更频繁清理
autovacuum_vacuum_scale_factor = 0.05
autovacuum_analyze_scale_factor = 0.02

# 自动清理成本限制,可根据系统负载调整
autovacuum_vacuum_cost_delay = 2ms
autovacuum_vacuum_cost_limit = -1

配置管理最佳实践

  1. 版本控制:将配置文件纳入版本控制(如 Git),便于追踪变更和回滚
  2. 分段配置:对于大型部署,可以将配置按功能分组到不同文件,使用 include 指令加载
    ini
    include = 'postgresql.base.conf'
    include = 'postgresql.performance.conf'
    include = 'postgresql.log.conf'
  3. 测试变更:在测试环境验证配置变更效果,避免直接在生产环境修改
  4. 逐步调整:对于性能参数,建议逐步调整,每次改变一个参数,观察效果
  5. 记录变更:记录每次配置变更的原因、时间和效果,便于后续分析

pg_hba.conf - 主机基础认证

配置格式

pg_hba.conf 用于控制客户端如何连接到数据库,每行格式如下:

TYPE  DATABASE  USER  ADDRESS  METHOD  [OPTIONS]

认证方法

常用的认证方法包括:

方法描述适用场景版本要求
trust信任所有连接,无需密码仅适用于本地开发环境所有版本
md5密码使用 MD5 加密传输兼容旧版本,安全性较低所有版本
scram-sha-256使用 SCRAM-SHA-256 加密安全性高,PostgreSQL 10+ 支持PostgreSQL 10+
password密码明文传输,不安全不推荐使用所有版本
peer基于操作系统用户名仅适用于本地连接Unix/Linux 系统
ident基于外部认证系统企业级环境,需配置 pg_ident.conf所有版本
sslcert基于 SSL 证书认证高安全性要求的环境所有版本

生产环境安全配置示例

# 允许本地 Unix socket 连接,使用 peer 认证
local   all             postgres                                peer
local   all             all                                     scram-sha-256

# IPv4 本地连接
host    all             all             127.0.0.1/32            scram-sha-256

# 允许特定 IP 段访问,使用 scram-sha-256 认证
host    all             all             192.168.1.0/24          scram-sha-256

# 允许应用服务器访问,使用 scram-sha-256 认证
host    app_db          app_user        10.0.0.100/32          scram-sha-256

# 禁用所有其他 IP 访问
host    all             all             0.0.0.0/0              reject

pg_ident.conf - 身份映射

用途

pg_ident.conf 用于将外部认证系统的用户名映射到 PostgreSQL 用户名,常用于 ident 认证方法。

配置示例

# MAPNAME  SYSTEM-USERNAME  PG-USERNAME
appmap    appuser          dbuser
adminmap  sysadmin         postgres

与 pg_hba.conf 配合使用

pg_hba.conf 中指定映射名称:

host    all             all             10.0.0.0/8             ident map=adminmap

postgresql.auto.conf - 自动配置文件

用途

postgresql.auto.conf 用于存储通过 ALTER SYSTEM 命令修改的配置参数,优先级高于 postgresql.conf

示例用法

sql
-- 修改参数,自动保存到 postgresql.auto.conf
ALTER SYSTEM SET shared_buffers = '5GB';
ALTER SYSTEM SET work_mem = '16MB';

-- 查看当前配置
SHOW shared_buffers;

-- 重置参数
ALTER SYSTEM RESET work_mem;

配置文件加载顺序

PostgreSQL 配置文件的加载顺序如下:

  1. 编译时默认参数
  2. postgresql.conf
  3. postgresql.auto.conf(优先级最高)

配置变更生效方式

不同类型的参数需要不同的方式使变更生效:

参数类型生效方式示例参数
重启生效需要重启 PostgreSQL 服务listen_addressesshared_buffersmax_connections
重载生效通过 pg_ctl reloadSELECT pg_reload_conf(); 重载配置log_min_duration_statementwork_memmaintenance_work_mem
会话生效仅对新会话生效,已连接会话保持原有配置default_transaction_isolationsearch_path
立即生效对所有会话立即生效log_connectionslog_disconnections

版本差异与参数兼容性

主要版本参数差异

PostgreSQL 版本新增参数
10scram-sha-256 认证方法、logical_replication
12generated_columnsincremental_sort
13incremental_sort 增强、recovery_min_apply_delay
14pg_stat_kcache 内置支持、synchronous_commit = remote_apply
15pg_stat_statements.track_planningvacuum_cleanup_index_scale_factor
16enable_parallel_hash 默认开启、pg_wal_lsn_diff 增强

参数废弃与替代

废弃参数替代参数版本
hot_standby_feedbackprimary_slot_name12+
wal_buffers = -1自动计算12+
log_line_prefix = '%m'%t 替代10+

配置文件备份与恢复

备份策略

bash
# 定期备份配置文件
cp -r /pgdata/data/postgresql.conf /pgbackup/config/$(date +%Y%m%d)/
cp -r /pgdata/data/pg_hba.conf /pgbackup/config/$(date +%Y%m%d)/
cp -r /pgdata/data/pg_ident.conf /pgbackup/config/$(date +%Y%m%d)/
cp -r /pgdata/data/postgresql.auto.conf /pgbackup/config/$(date +%Y%m%d)/

恢复配置文件

bash
# 从备份恢复配置文件
systemctl stop postgresql
sudo -u postgres cp /pgbackup/config/20230601/postgresql.conf /pgdata/data/
sudo -u postgres cp /pgbackup/config/20230601/pg_hba.conf /pgdata/data/
sudo -u postgres cp /pgbackup/config/20230601/pg_ident.conf /pgdata/data/
sudo -u postgres cp /pgbackup/config/20230601/postgresql.auto.conf /pgdata/data/
systemctl start postgresql

常见配置问题与解决方案

连接被拒绝

问题:客户端连接数据库时出现 "connection refused" 错误

排查步骤

  1. 检查 listen_addresses 是否包含客户端 IP
  2. 检查 port 参数是否正确
  3. 检查防火墙是否允许 PostgreSQL 端口访问
  4. 检查 pg_hba.conf 是否允许客户端 IP 连接

认证失败

问题:客户端连接时出现 "FATAL: password authentication failed for user" 错误

排查步骤

  1. 检查用户名和密码是否正确
  2. 检查 pg_hba.conf 中对应行的认证方法是否与密码存储方式匹配
  3. 检查密码是否过期(PostgreSQL 10+ 支持密码有效期)
  4. 对于 scram-sha-256 认证,确保客户端驱动支持该认证方法

性能问题

问题:数据库查询性能下降

排查步骤

  1. 检查 shared_bufferseffective_cache_size 是否合理
  2. 检查 work_mem 是否足够,避免临时文件过多
  3. 检查 autovacuum 是否正常运行,避免统计信息过时
  4. 检查慢查询日志,分析耗时较长的查询

WAL 磁盘空间不足

问题:WAL 日志占用过多磁盘空间

排查步骤

  1. 检查 wal_level 是否设置过高
  2. 检查 max_wal_size 是否合理
  3. 检查 WAL 归档是否正常运行
  4. 检查复制槽是否有停滞的订阅者

总结

PostgreSQL 的核心配置文件是数据库性能和安全性的基础,DBA 需要根据业务需求和硬件资源合理配置这些文件。在生产环境中,建议:

  1. 采用最小权限原则配置 pg_hba.conf,避免不必要的访问
  2. 根据硬件资源调整内存相关参数,优化查询性能
  3. 配置详细的日志,便于问题排查和性能分析
  4. 启用并合理配置 autovacuum,防止表膨胀
  5. 定期备份配置文件,便于恢复和回滚
  6. 追踪 PostgreSQL 版本更新,了解新参数和废弃参数
  7. 在测试环境验证配置变更,避免直接在生产环境修改

通过合理配置和管理核心配置文件,DBA 可以确保 PostgreSQL 数据库在生产环境中稳定、安全、高效地运行。