postgresql

PostgreSQL 服务端启动、配置与运维

补充说明

postgresql 是 PostgreSQL 服务端,采用多进程模型:postmaster 监听连接并为每个连接 fork 后端进程,共享缓冲区通过共享内存访问,WAL 保证崩溃恢复和复制。它默认使用 MVCC,更新产生新版本,旧版本由 VACUUM 回收,因此长事务和长时间空闲事务会阻塞清理。

它适合强事务、复杂查询、JSONB、地理/向量扩展和读写分离场景。与 MySQL 相比,PostgreSQL 没有 undo log,回滚和清理依赖 WAL 与 VACUUM;复制默认是物理流复制,逻辑复制按表发布订阅。客户端操作见 psql 页面,连接池见 pgbouncer。

生产上要区分“启动服务”和“启动实例”:systemd 管理服务,pg_ctl 管理数据目录;配置文件是 postgresql.conf 和 pg_hba.conf,改完先 pg_ctl reload 或 SELECT pg_reload_conf(),涉及 shared_buffers、wal_level 等参数则要重启。

常用示例

pg_ctl -D /var/lib/postgresql/data -l /var/log/postgresql/server.log start
pg_ctl -D /var/lib/postgresql/data status
pg_ctl -D /var/lib/postgresql/data reload
pg_ctl -D /var/lib/postgresql/data stop -m fast
pg_isready -h 127.0.0.1 -p 5432
systemctl status postgresql
systemctl reload postgresql
psql -h 127.0.0.1 -p 5432 -U postgres -d postgres
psql -h 127.0.0.1 -U postgres -d postgres -c "SELECT version();"
psql -h 127.0.0.1 -U postgres -d postgres -c "SELECT pid, state, wait_event_type, wait_event, query FROM pg_stat_activity WHERE state <> 'idle';"
psql -h 127.0.0.1 -U postgres -d postgres -c "SELECT * FROM pg_stat_replication;"
psql -h 127.0.0.1 -U postgres -d postgres -c "SELECT pid, pg_blocking_pids(pid) AS blockers, query FROM pg_stat_activity WHERE cardinality(pg_blocking_pids(pid)) > 0;"
pg_basebackup -h primary -D /var/lib/postgresql/data -U replicator -Fp -Xs -P -R
pg_dump -Fc -d appdb -f /backup/appdb.dump
pg_restore -d appdb -j 4 /backup/appdb.dump
vacuumdb --analyze-only -d appdb -j 4

常见配置

postgresql.conf 生产基线(按内存和负载调整,不是默认值):

listen_addresses = '*'
port = 5432
max_connections = 200
shared_buffers = 4GB
work_mem = 16MB
maintenance_work_mem = 512MB
effective_cache_size = 12GB
wal_level = replica
max_wal_senders = 10
wal_keep_size = 1GB
hot_standby = on
synchronous_commit = on
checkpoint_timeout = 15min
max_wal_size = 4GB
autovacuum = on
autovacuum_naptime = 30s
autovacuum_vacuum_scale_factor = 0.05
log_min_duration_statement = 500ms
log_lock_waits = on
deadlock_timeout = 1s

pg_hba.conf 示例:

local   all         all                               peer
host    all         all         127.0.0.1/32          scram-sha-256
host    all         all         10.0.0.0/8            scram-sha-256
host    replication replicator  10.0.0.0/8            scram-sha-256

默认值提醒:shared_buffers=128MB、work_mem=4MB、maintenance_work_mem=64MB、max_connections=100、wal_level=replica、checkpoint_timeout=5min、autovacuum_naptime=1min、autovacuum_vacuum_scale_factor=0.2、autovacuum_analyze_scale_factor=0.1。pg_hba.conf 按第一条匹配生效,改完 reload。

易错点与排错

相关命令

读完自测

  1. PostgreSQL 为什么需要 VACUUM,长事务会造成什么影响?
  2. pg_hba.conf 的匹配顺序和常见认证失败原因是什么?
  3. 物理流复制延迟应该看哪些视图和字段?
答案
  1. MVCC 更新产生旧版本,VACUUM 回收死元组;长事务持有旧快照和 xmin,会阻止清理并导致膨胀。
  2. 按第一条匹配;常见原因是 local/host 类型、CIDR、用户名/库名和 scram/md5 认证方式不匹配。
  3. 主库 pg_stat_replication 的 sent/write/flush/replay LSN 和 lag;从库 pg_stat_wal_receiver 的接收与应用状态。