跳转至

PostgreSQL主配置文件

一. PostgreSQL 配置、日志总览

1. 配置文件

与 MySQL 集中在 my.cnf 不同,PostgreSQL 的配置分散在多个文件中:

文件 作用 类似 MySQL
/var/lib/pgsql/18/data/postgresql.conf 主配置文件(监听地址、内存、日志等) my.cnf
/var/lib/pgsql/18/data/pg_hba.conf 客户端认证配置(谁能连、怎么连) 无直接对应,类似权限表
/var/lib/pgsql/18/data/pg_ident.conf 用户名映射(很少动) —

注意:配置文件不在 /etc/ 下,而是在数据目录 /var/lib/pgsql/18/data/ 中。

2. 日志文件

运行日志(类似 MySQL 的 error.log):

默认日志输出到 systemd journal:

journalctl -u postgresql-18 -n 50 --no-pager

如果开启了 logging_collector = on,日志会写入:

/var/lib/pgsql/18/data/log/

WAL 日志(类似 MySQL 的 binlog):

PostgreSQL 的 WAL(Write-Ahead Log) 相当于 MySQL 的 binlog + redo log 合体:

对比 MySQL binlog PostgreSQL WAL
用途 主从复制、PITR 崩溃恢复、主从复制、PITR
存储位置 binlog.000001 pg_wal/0000000100000000...
是否默认开启 默认关闭(需 log_bin) 默认开启且无法关闭
归档 log_bin 自动保留 需手动开启 archive_mode = on

查看 WAL 目录:

ls -lh /var/lib/pgsql/18/data/pg_wal/

关键区别:WAL 默认开启不能关,但默认不会像 binlog 那样保留历史——旧的 WAL 会被回收。要像 binlog 那样归档历史,需要开启 archive_mode。

3. 运维重要文件清单

文件/目录 重要性 说明
/var/lib/pgsql/18/data/postgresql.conf 🔴 主配置,改监听、内存、日志等
/var/lib/pgsql/18/data/pg_hba.conf 🔴 认证配置,连不上时第一个查它
/var/lib/pgsql/18/data/pg_wal/ 🔴 WAL 目录,WAL 堆积说明灾备落后
/var/lib/pgsql/18/data/pg_stat_tmp/ 🟡 统计信息临时文件
/var/lib/pgsql/18/data/postmaster.pid 🔴 PID 文件,误删会导致主进程挂掉
/var/lib/pgsql/18/data/log/ 🟡 日志目录(需开启 logging_collector)
/usr/pgsql-18/bin/psql 🟢 命令行工具

二. PostgreSQL配置文件

1. 配置文件总览

PostgreSQL配置文件一共有三个,其中/var/lib/pgsql/18/data/postgresql.conf是主配置文件,负责修改监听、内存、日志等;

/var/lib/pgsql/18/data/pg_hba.conf是客户端配置。

与MySQL创建用户命令例如CREATE USER setsuna@'192.168.100.100' IDENTIFIED BY 'Admin@123';一条命令同时创建用户与授权该用户能够在那台主机登录。优点是操作简单,缺点是不能随意更改。不能将某一用户添加到新的IP授权,必须要创建新用户

PostgreSQL的创建用户命令与授权是分离的,想要将某个用户添加新的主机授权,只要修改配置文件/var/lib/pgsql/18/data/pg_hba.conf在其中修改增加对应权限

  • [x] 这个留到创建用户命令与用户管理文档再细说

2. 主配置文件相关配置

文件路径模块

# The default values of these variables are driven from the -D command-line
# option or PGDATA environment variable, represented here as ConfigDir.

#data_directory = 'ConfigDir'       # use data in another directory
                    # (change requires restart)
hba_file = 'ConfigDir/pg_hba.conf'  # host-based authentication file
                    # (change requires restart)
ident_file = 'ConfigDir/pg_ident.conf'  # ident configuration file
                    # (change requires restart)

# If external_pid_file is not explicitly set, no extra PID file is written.
external_pid_file = ''          # write an extra PID file
                    # (change requires restart)
  • data_directory: 数据目录,默认由-D参数或PGDATA环境变量指定,通常不动,是注释掉的,把这里替换成实际路径的绝对路径
  • hba_file: 客户端认证的配置文件路径,是排查连接问题的关键文件
  • ident_file: 用户名映射文件
  • extennal_pid_file: 额外的POD文件

启动服务必备

# - Connection Settings -

listen_addresses = 'localhost'      # what IP address(es) to listen on;
                    # comma-separated list of addresses;
                    # defaults to 'localhost'; use '*' for all
                    # (change requires restart)
port = 5432             # (change requires restart)
max_connections = 100           # (change requires restart)
#reserved_connections = 0       # (change requires restart)
superuser_reserved_connections = 3  # (change requires restart)
  • listen_addresses: 监听的IP地址,默认之监听本机localhost,要远程连接建议改成'*',可以写多个IP地址,用","隔开。类似于192.168.100.101,127.0.0.1
  • port: 监听的端口号,默认为5432
  • max_connections: 最大连接数,类似于MySQL
  • superuser_reserved_connections: 给超级用户预留的连接数,防止普通连接占满后超级用户也连不进去
  • reserved_connections: 给非超级用户也预留的,一般不动

内存资源

# - Memory -

shared_buffers = 128MB          # min 128kB
                    # (change requires restart)
#huge_pages = try           # on, off, or try
                    # (change requires restart)
#huge_page_size = 0         # zero for system default
                    # (change requires restart)
#temp_buffers = 8MB         # min 800kB
#max_prepared_transactions = 0      # zero disables the feature
                    # (change requires restart)
# Caution: it is not advisable to set max_prepared_transactions nonzero unless
# you actively intend to use prepared transactions.
work_mem = 4MB              # min 64kB
#hash_mem_multiplier = 2.0      # 1-1000.0 multiplier on hash table work_mem
maintenance_work_mem = 64MB     # min 64kB
#autovacuum_work_mem = -1       # min 64kB, or -1 to use maintenance_work_mem
#logical_decoding_work_mem = 64MB   # min 64kB
#max_stack_depth = 2MB          # min 100kB
#shared_memory_type = mmap      # the default is the first option
                    # supported by the operating system:
                    #   mmap
                    #   sysv
                    #   windows
                    # (change requires restart)
dynamic_shared_memory_type = posix  # the default is usually the first option
                    # supported by the operating system:
                    #   posix
                    #   sysv
                    #   windows
                    #   mmap
                    # (change requires restart)
#min_dynamic_shared_memory = 0MB    # (change requires restart)
#vacuum_buffer_usage_limit = 2MB    # size of vacuum and analyze buffer access strategy ring;
                    # 0 to disable vacuum buffer access strategy;
                    # range 128kB to 16GB

# SLRU buffers (change requires restart)
#commit_timestamp_buffers = 0       # memory for pg_commit_ts (0 = auto)
#multixact_offset_buffers = 16      # memory for pg_multixact/offsets
#multixact_member_buffers = 32      # memory for pg_multixact/members
#notify_buffers = 16            # memory for pg_notify
#serializable_buffers = 32      # memory for pg_serial
#subtransaction_buffers = 0     # memory for pg_subtrans (0 = auto)
#transaction_buffers = 0        # memory for pg_xact (0 = auto)
  • shared_buffers: PostgreSQL 的共享缓冲区,相当于MySQL的innodb_buffer_pool_size。建议设为物理内存的25%,当前128MB是保守值
  • work_mem: 每个查询操作能用的内存(排序、哈希等)。当前4MB很小,复杂查询时可以适当调大,但要小心——如果并发100个连接,每个4MB就是400MB
  • maintenance_work_mem: 维护操作(VACUUM、创建索引)用的内存,当前64MB,比work_mem大是合理的
  • temp_buffers: 临时表的缓冲区,一般不动
  • huge_pages: 是否使用大内存页,try 表示系统支持就用,不支持就 fallback
  • dynamic_shared_memory_type: 动态共享内存类型,Linux 用 posix 就行
  • autovacuum_work_mem: 自动清理专用的内存,-1 表示继承 maintenance_work_mem

⭐ 重点:shared_buffers 是性能调优的第一个参数。work_mem 要小心别设太大,高并发下容易撑爆内存。

日志配置

# - Where to Log -

log_destination = 'stderr'      # 日志输出方式,配合 logging_collector 写入文件
logging_collector = on          # ⭐ 开启日志收集,才能写日志文件(需重启生效)
log_directory = 'log'           # 日志目录,相对 PGDATA,即 /var/lib/pgsql/18/data/log/
log_filename = 'postgresql-%a.log'  # 日志文件名,%a = 星期几(Mon、Tue...Sat、Sun)
#log_file_mode = 0600           # 日志文件权限,默认 0600(仅属主可读写)
log_rotation_age = 1d           # ⭐ 每天轮转一次
log_rotation_size = 0           # 不按大小轮转(0=禁用),如果日志量大建议设个值
log_truncate_on_rotation = on       # ⚠️ 轮转时覆盖同名旧文件(on=覆盖/off=追加)
# - What to Log -

log_line_prefix = '%m [%p] '        # 日志行前缀:时间 [进程ID]
#log_min_messages = warning     # 记录的最低日志级别(warning 及以上)
#log_min_duration_statement = -1    # ⭐ 慢查询阈值(毫秒),-1=关闭,0=记所有,1000=记录超过1秒的
#log_statement = 'none'         # 记录哪些 SQL:none/ddl/mod/all
#log_checkpoints = on           # 记录检查点信息
#log_connections = ''           # 记录连接信息
log_timezone = 'Asia/Shanghai'      # 日志时区
  • logging_collector: 是否开启日志收集,设为 on 才能把日志写入文件,否则只输出到 systemd journal
  • log_filename: 当前 'postgresql-%a.log' 是按星期命名,周一覆盖上周一的日志,以此类推。想保留更久可以改成 'postgresql-%Y-%m-%d.log'(按日期)
  • log_rotation_age: 轮转间隔,1d 每天一切,如果日志量大可以缩短到 1h
  • log_rotation_size: ⚠️ 当前为 0(不限制大小),如果某天日志量特别大可能撑满磁盘,建议设个上限如 100MB
  • log_truncate_on_rotation: ⚠️ 当前为 on,配合按星期命名的文件名,每周会覆盖上周的同名日志。如果想保留历史日志,改为 off
  • log_line_prefix: 当前 '%m [%p] ' 显示时间+进程ID,排查问题时够用。想看到更多信息(如用户名、数据库名)可以改成 '%m [%p] %u %d '
  • log_min_duration_statement: ⭐ 慢查询日志,排查性能问题时很关键。当前 -1 关闭,建议以后改为 1000(记录超过1秒的查询)

⭐ 重点排查日志时,先去 log_directory 目录下看最新的日志文件,或者用 journalctl -u postgresql-18 -n 50 --no-pager 查看。log_min_duration_statement 是优化查询性能的利器。