Skip to content

Linux 安装(APT / YUM) ​

Linux 是 PostgreSQL 最主流的生产运行平台。本节介绍如何通过官方 PGDG(PostgreSQL Global Development Group)软件源,在 Ubuntu / Debian 上使用 apt、在 RHEL / CentOS / Rocky / AlmaLinux 上使用 yum / dnf 安装 PostgreSQL 18,并完成安装验证。

前置知识

阅读本节前,建议先了解:第一个 SQL 查询

基础概念 ​

在开始安装之前,先厘清几个贯穿全教程的术语:

  • 数据库集群(Database Cluster):不是指多台机器组成的集群,而是指一个数据目录(Data Directory)加上由它启动的一个 PostgreSQL 服务进程组。一台机器上可以有多个数据库集群
  • 数据目录(Data Directory):存放所有数据文件、WAL 日志、配置文件的目录,通常形如 /var/lib/postgresql/18/main
  • PGDG 源(PostgreSQL Global Development Group Repository):PostgreSQL 官方维护的第三方软件仓库,提供比发行版自带仓库更新的版本
  • 安装介质差异:发行版自带仓库(如 Ubuntu 的 universe)通常只提供较老版本的 PostgreSQL,且大版本升级受限
仓库类型典型版本优点缺点
发行版自带仓库落后 1~3 个大版本开箱即用、无需加源版本旧,无法安装最新版
PGDG 官方仓库与上游同步(含 18)版本新、支持多版本并存需手动添加源
源码编译任意版本完全可控、可裁剪维护成本高

版本说明

以下命令以 PostgreSQL 18 为例。如需安装 17,只需将命令中的 18 替换为 17。PGDG 仓库同时包含多个大版本,可以并存安装。

安装与配置 ​

Ubuntu / Debian(APT) ​

apt 安装的核心步骤有三步:导入签名密钥、添加仓库、安装软件包。

bash
# 1. 安装基础工具,用于下载密钥与源描述文件
sudo apt update
sudo apt install -y curl ca-certificates gnupg lsb-release

# 2. 导入 PGDG 官方 GPG 签名密钥(用于校验包来源,防止被篡改)
sudo install -d /usr/share/postgresql-common/pgdg
sudo curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc \
  https://www.postgresql.org/media/keys/ACCC4CF8.asc

# 3. 根据当前系统代号(如 noble / bookworm)自动生成源条目
. /etc/os-release
echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] \
https://apt.postgresql.org/pub/repos/apt ${VERSION_CODENAME}-pgdg main" \
  | sudo tee /etc/apt/sources.list.d/pgdg.list

# 4. 刷新索引并安装
sudo apt update
sudo apt install -y postgresql-18

如果需要一并安装客户端工具、扩展包与开发头文件:

bash
# postgresql-client-18   命令行客户端(psql / pg_dump 等)
# postgresql-contrib-18  contrib 扩展(pg_stat_statements / pgcrypto 等)
# postgresql-server-dev-18  编译第三方扩展所需的头文件与 pg_config
sudo apt install -y postgresql-18 postgresql-client-18 \
  postgresql-contrib-18 postgresql-server-dev-18

RHEL / CentOS / Rocky / AlmaLinux(YUM / DNF) ​

现代 RHEL 系发行版默认使用 dnf,yum 通常是 dnf 的软链接,两者命令兼容。

bash
# 1. 安装 PGDG 仓库定义 RPM(会自动配置 GPG 校验与仓库地址)
#    RHEL 9 / Rocky 9 / AlmaLinux 9 对应 el-9
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm

# 2. 禁用系统自带的 postgresql 模块,避免模块流覆盖 PGDG 版本
#    这一步在 RHEL 8/9 上非常关键,遗漏会导致装回旧版本
sudo dnf -qy module disable postgresql

# 3. 安装服务端与客户端
sudo dnf install -y postgresql18-server postgresql18-contrib postgresql18

# 4. 初始化数据目录(RPM 包不会自动 initdb)
sudo /usr/pgsql-18/bin/postgresql-18-setup initdb

# 5. 设置开机自启并立即启动
sudo systemctl enable --now postgresql-18

版本固定与锁定 ​

生产环境需要避免自动升级导致意外重启:

bash
# Debian / Ubuntu:阻止 apt 自动升级 PostgreSQL 相关包
sudo apt-mark hold postgresql-18 postgresql-client-18 postgresql-common

# 查看被锁定的包
apt-mark showhold

# 需要升级时手动解锁
# sudo apt-mark unhold postgresql-18

# RHEL 系:安装 versionlock 插件后锁定
sudo dnf install -y python3-dnf-plugin-versionlock
sudo dnf versionlock add postgresql18-server postgresql18-contrib

目录结构 ​

通过包管理器安装后,文件按 Linux 惯例分散在多个目录中:

路径内容所属包
/usr/lib/postgresql/18/bin/所有可执行程序(Debian 系)postgresql-18
/usr/pgsql-18/bin/所有可执行程序(RHEL 系)postgresql18-server
/var/lib/postgresql/18/main/数据目录(Debian 系)运行时生成
/var/lib/pgsql/18/data/数据目录(RHEL 系)运行时生成
/etc/postgresql/18/main/配置文件(Debian 系)postgresql-common
/var/log/postgresql/日志目录(Debian 系)运行时生成
/usr/share/postgresql/18/extension/扩展控制文件postgresql-18

详细说明 ​

验证安装 ​

bash
# 查看版本(psql 客户端与服务端版本应一致)
psql --version
text
psql (PostgreSQL) 18.0 (Ubuntu 18.0-1.pgdg24.04+1)
bash
# 通过 pg_config 查看编译参数与安装路径
pg_config --version
pg_config --bindir
pg_config --sharedir

# 列出所有已安装的 PostgreSQL 相关包
dpkg -l | grep postgresql        # Debian / Ubuntu
rpm -qa | grep postgresql        # RHEL 系

由于 Debian 系的可执行文件位于 /usr/lib/postgresql/18/bin,psql 通过 postgresql-common 提供的 wrapper 暴露到 /usr/bin/psql。若需在 PATH 中直接使用全部二进制工具:

bash
# 临时生效
export PATH=/usr/lib/postgresql/18/bin:$PATH

# 永久生效(写入当前用户的 shell 配置)
echo 'export PATH=/usr/lib/postgresql/18/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

切换 postgres 系统用户 ​

initdb 生成的超级用户与当前操作系统用户同名(Debian 系为 postgres,RHEL 系为 postgres)。安装后必须切换到该用户才能连接:

bash
# 切换到 postgres 用户并进入 psql(peer 认证依赖同名系统用户)
sudo -u postgres -i

# 或单条命令执行
sudo -u postgres psql
text
psql (18.0)
Type "help" for help.

postgres=#

服务管理方式差异 ​

不同发行版对服务的封装不同,后续「服务管理」章节会详细展开:

bash
# Debian / Ubuntu:使用 cluster 机制,服务名带版本号
sudo systemctl status postgresql@18-main
pg_lsclusters

# RHEL 系:直接使用版本化服务名
sudo systemctl status postgresql-18

端口与监听地址 ​

默认安装只监听本机回环地址,外部无法连接:

ini
# /etc/postgresql/18/main/postgresql.conf
# 监听所有网卡;生产环境建议改为具体内网 IP
listen_addresses = '*'

# 默认端口;多版本并存时需要区分
port = 5432
ini
# /etc/postgresql/18/main/pg_hba.conf
# 允许内网网段以 scram-sha-256 方式密码登录
# 错误!直接用 trust 允许全部来源等于把数据库完全开放
host    all             all             10.0.0.0/8              scram-sha-256

卸载与清理 ​

bash
# Debian 系:卸载包(保留数据目录)
sudo apt remove --purge postgresql-18 postgresql-client-18

# 彻底删除数据目录(危险操作,请先确认已备份)
# sudo rm -rf /var/lib/postgresql/18 /etc/postgresql/18

# RHEL 系:RPM 卸载不会删除数据目录,需手动清理
sudo dnf remove -y postgresql18-server postgresql18
# sudo rm -rf /var/lib/pgsql/18

实战示例 ​

在一台全新的 Ubuntu 24.04 服务器上完成 PostgreSQL 18 的安装、启动、远程访问配置,并跑通第一个查询。

bash
# ---------- 步骤 1:添加 PGDG 源并安装 ----------
sudo apt update
sudo apt install -y curl ca-certificates gnupg lsb-release
sudo install -d /usr/share/postgresql-common/pgdg
sudo curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc \
  https://www.postgresql.org/media/keys/ACCC4CF8.asc
. /etc/os-release
echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] \
https://apt.postgresql.org/pub/repos/apt ${VERSION_CODENAME}-pgdg main" \
  | sudo tee /etc/apt/sources.list.d/pgdg.list
sudo apt update
sudo apt install -y postgresql-18 postgresql-client-18 postgresql-contrib-18
text
Setting up postgresql-18 (18.0-1.pgdg24.04+1) ...
Creating new PostgreSQL cluster 18/main ...
/usr/lib/postgresql/18/bin/initdb -D /var/lib/postgresql/18/main --auth-local peer --auth-host scram-sha-256 --no-instructions
bash
# ---------- 步骤 2:确认集群与端口 ----------
pg_lsclusters
text
Ver Cluster Port Status Owner    Data directory              Log file
18  main    5432 online postgres /var/lib/postgresql/18/main /var/log/postgresql/postgresql-18-main.log
bash
# ---------- 步骤 3:设置 postgres 用户密码 ----------
sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD 'Str0ng_P@ssw0rd';"
text
ALTER ROLE
bash
# ---------- 步骤 4:开放本机监听与内网访问 ----------
# 修改监听地址(默认仅 localhost)
sudo sed -i "s/^#\?listen_addresses.*/listen_addresses = '*'/" \
  /etc/postgresql/18/main/postgresql.conf

# 追加一条内网访问规则
echo "host    all    all    10.0.0.0/8    scram-sha-256" \
  | sudo tee -a /etc/postgresql/18/main/pg_hba.conf

# 配置文件变更只需 reload,无需重启
sudo systemctl reload postgresql@18-main
bash
# ---------- 步骤 5:验证远程连接与查询 ----------
PGPASSWORD='Str0ng_P@ssw0rd' psql -h 10.0.0.11 -p 5432 -U postgres -c \
  "SELECT version(), current_user, now();"
text
                                                    version
---------------------------------------------------------------------------------------------------------------
 PostgreSQL 18.0 (Ubuntu 18.0-1.pgdg24.04+1) on x86_64-pc-linux-gnu, compiled by gcc 13.2.0, 64-bit
 current_user |              now
--------------+-------------------------------
 postgres     | 2026-09-21 10:32:15.412+08
(1 row)

注意事项 ​

  • Trust 认证等价于「无认证」:任何时候都不要在 pg_hba.conf 中对 0.0.0.0/0 使用 trust,这是被入侵的头号原因
  • RHEL 8/9 必须执行 dnf module disable postgresql,否则 AppStream 模块流会覆盖 PGDG 版本,导致装到 13/15 而非 18
  • RHEL 系 RPM 安装后不会自动初始化数据目录,缺少 postgresql-18-setup initdb 会导致服务启动失败
  • Debian 系的数据目录由 postgresql-common 管理,不要手动运行 initdb,否则会与 cluster 机制冲突
  • 数据目录权限必须为 0700 且属主为 postgres,权限被改宽后 PostgreSQL 会拒绝启动
  • 修改 listen_addresses 后仅 reload 不生效,需要重启服务(该参数不是 SIGHUP 可改项)
  • 生产环境不要用 root 直接运行 postgres 进程,PostgreSQL 会主动拒绝以 root 身份启动
  • 不要混用发行版自带包与 PGDG 包,两者文件路径冲突,可能导致 psql 与实际服务端版本不一致

最佳实践 ​

  • 优先使用 PGDG 官方仓库而非发行版仓库,保证版本一致性与安全补丁及时性
  • 使用 apt-mark hold / dnf versionlock 固定大版本,避免 apt upgrade 意外跨版本升级
  • 生产环境将数据目录放在独立的数据盘(如 /data/pgdata),便于扩容与快照备份
  • 配置文件纳入版本管理(如 Ansible / Git),所有变更可追溯、可回滚
  • 安装后立即完成「1.6 安全初始化」中的密码、认证方式与 TLS 配置,不要带着默认配置上线
  • 在容器或云主机上部署时,明确镜像内的 PostgreSQL 版本,避免 latest 标签带来的漂移
  • 保留 postgresql-contrib 扩展包,pg_stat_statements 是后续性能分析的基础设施

下一节

继续学习:macOS 安装(Homebrew)

参考链接 ​