3. PostgreSQL安装与初始化

PostgreSQL 的安装方式直接决定了后续可维护性、可升级性和性能上限。生产环境常见的两条路径是包管理安装与源码编译安装:前者胜在快速、依赖自动解决、便于统一运维;后者胜在可控,能精确选择版本、编译参数、扩展与安装路径。选择哪条路径,取决于团队对版本节奏、扩展需求、内核参数与文件系统布局的掌控程度。

一、包管理安装:快速落地与版本选择

在 RHEL/CentOS/Rocky 系上,推荐使用 PGDG 官方仓库,而不是系统自带仓库,因为系统仓库版本通常偏旧。以 PostgreSQL 16 为例:

# 安装 PGDG 仓库
dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# 禁用系统自带模块,避免版本冲突
dnf -qy module disable postgresql
# 安装服务端与客户端
dnf install -y postgresql16-server postgresql16-contrib
# 初始化数据目录(包管理方式自带脚本)
/usr/pgsql-16/bin/postgresql-16-setup initdb
# 设置开机自启并启动
systemctl enable --now postgresql-16

包管理安装的默认布局是:二进制在 /usr/pgsql-16/bin,数据目录在 /var/lib/pgsql/16/data,配置文件在数据目录内,服务单元为 postgresql-16.service。这种方式适合标准化交付,但要注意:默认数据目录位于系统盘,生产环境必须迁移到独立数据盘。

二、源码编译安装:编译参数选择

源码安装的核心价值在于编译参数可控。典型流程是下载源码、配置、编译、安装:

./configure \
  --prefix=/usr/local/pgsql16 \
  --with-openssl \
  --with-libxml \
  --with-uuid=e2fs \
  --with-icu \
  --with-zstd \
  --with-lz4 \
  --enable-debug=no \
  --enable-cassert=no
make -j$(nproc) && make install

关键参数取舍如下:--prefix 决定安装根目录,建议与数据目录分离;--with-openssl 用于 SSL 加密连接,生产必须开启;--with-icu 提供更规范的排序与大小写处理;--with-zstd 与 --with-lz4 影响 WAL 与备份压缩效率。生产环境不要开启 --enable-cassert,断言会显著降低性能,仅用于开发调试。编译完成后,需将 /usr/local/pgsql16/bin 加入 PATH,并创建专用系统用户 postgres。

三、initdb 关键配置

initdb 是初始化数据目录的唯一入口,几个参数一旦设定,后期修改成本极高:

initdb -D /data/pg16/data \
  -U postgres \
  -E UTF8 \
  --locale=C.UTF-8 \
  --data-checksums \
  -A scram-sha-256 \
  -W

-E UTF8 与 --locale 决定字符集与排序规则,生产建议统一 UTF8;--data-checksums 开启页校验,能提前发现静默损坏,代价是少量写入开销,生产强烈建议开启;-A scram-sha-256 指定认证方式,避免使用已不安全的 md5;-W 在初始化时设置超级用户密码。初始化完成后,还需调整 postgresql.conf 中的 listen_addresses、port、shared_buffers、max_connections,以及 pg_hba.conf 的访问控制规则。

initdb 只能在空目录执行;若目录非空会拒绝初始化。生产环境建议先规划好目录,再执行 initdb,避免后期迁移。

四、生产环境目录规划

生产环境最重要的原则是数据、WAL、归档、备份、日志分离,避免单盘 IO 争抢与单点故障。推荐布局如下:

目录用途建议挂载
/data/pg16/data数据目录 PGDATA独立 SSD/NVMe
/data/pg16/walWAL 日志独立高速盘
/data/pg16/archiveWAL 归档大容量盘或对象存储
/backup/pg16基础备份独立备份盘
/var/log/pgsql16运行日志系统盘或日志盘

目录属主必须为 postgres,权限建议 700。WAL 目录可通过 initdb --waldir 或后续软链接方式独立。归档目录需配合 archive_mode=on 与 archive_command 使用。日志建议通过 logging_collector=on 与 log_directory 指向独立路径,便于集中采集。

PostgreSQL 生产环境安装与目录规划 包管理安装 • PGDG 官方仓库,版本可控 • 自动解决依赖,快速交付 • 默认数据目录 /var/lib/pgsql • 适合标准化、统一运维 • 需迁移数据目录到独立盘 源码编译安装 • --prefix 自定义安装路径 • --with-openssl / icu / zstd • 生产禁用 --enable-cassert • 适合扩展定制、版本精确控制 • 需自行管理依赖与升级 initdb 关键参数 -E UTF8 --locale=C.UTF-8 --data-checksums -A scram-sha-256 -W 字符集统一 排序规则 页校验防静默损坏 安全认证 设密码 生产目录规划(数据 / WAL / 归档 / 备份 / 日志分离) /data/pg16/data /data/pg16/wal /data/pg16/archive /backup/pg16 /var/log/pgsql16

五、安装后的验证与判断

安装与初始化完成后,必须做一轮最小验证,确认服务可用、参数生效、目录正确:

# 查看版本与编译参数
postgres --version
pg_config --configure

# 启动并检查状态
systemctl start postgresql-16
systemctl status postgresql-16

# 连接并查看关键参数
psql -U postgres -c "SHOW data_directory;"
psql -U postgres -c "SHOW data_checksums;"
psql -U postgres -c "SHOW ssl;"
psql -U postgres -c "SHOW archive_mode;"

判断依据:data_directory 应指向规划的数据盘路径;data_checksums 应为 on;ssl 应为 on;archive_mode 按需为 on。若 data_directory 仍指向 /var/lib/pgsql,说明未完成迁移,需立即调整。生产环境还应确认 pg_hba.conf 未开放 0.0.0.0/0 trust,避免未授权访问。

源码安装后若未正确设置 LD_LIBRARY_PATH 或未将 bin 加入 PATH,可能出现 libpq.so 找不到或命令版本混乱的问题。建议在 /etc/profile.d/pgsql16.sh 中统一声明环境变量。

总结来说,包管理安装适合快速标准化交付,源码编译适合深度定制;initdb 阶段必须锁定字符集、校验和与认证方式;生产目录规划的核心是数据、WAL、归档、备份、日志五类路径分离,并在安装后通过 SHOW 命令逐项验证,确保初始化结果与规划一致。