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 的访问控制规则。
四、生产环境目录规划
生产环境最重要的原则是数据、WAL、归档、备份、日志分离,避免单盘 IO 争抢与单点故障。推荐布局如下:
| 目录 | 用途 | 建议挂载 |
|---|---|---|
| /data/pg16/data | 数据目录 PGDATA | 独立 SSD/NVMe |
| /data/pg16/wal | WAL 日志 | 独立高速盘 |
| /data/pg16/archive | WAL 归档 | 大容量盘或对象存储 |
| /backup/pg16 | 基础备份 | 独立备份盘 |
| /var/log/pgsql16 | 运行日志 | 系统盘或日志盘 |
目录属主必须为 postgres,权限建议 700。WAL 目录可通过 initdb --waldir 或后续软链接方式独立。归档目录需配合 archive_mode=on 与 archive_command 使用。日志建议通过 logging_collector=on 与 log_directory 指向独立路径,便于集中采集。
五、安装后的验证与判断
安装与初始化完成后,必须做一轮最小验证,确认服务可用、参数生效、目录正确:
# 查看版本与编译参数
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 命令逐项验证,确保初始化结果与规划一致。