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:
如果开启了 logging_collector = on,日志会写入:
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 目录:
关键区别: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.1port: 监听的端口号,默认为5432max_connections: 最大连接数,类似于MySQLsuperuser_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就是400MBmaintenance_work_mem: 维护操作(VACUUM、创建索引)用的内存,当前64MB,比work_mem大是合理的temp_buffers: 临时表的缓冲区,一般不动huge_pages: 是否使用大内存页,try 表示系统支持就用,不支持就 fallbackdynamic_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 journallog_filename: 当前'postgresql-%a.log'是按星期命名,周一覆盖上周一的日志,以此类推。想保留更久可以改成'postgresql-%Y-%m-%d.log'(按日期)log_rotation_age: 轮转间隔,1d每天一切,如果日志量大可以缩短到1hlog_rotation_size: ⚠️ 当前为0(不限制大小),如果某天日志量特别大可能撑满磁盘,建议设个上限如100MBlog_truncate_on_rotation: ⚠️ 当前为on,配合按星期命名的文件名,每周会覆盖上周的同名日志。如果想保留历史日志,改为offlog_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是优化查询性能的利器。