2026.10.10 · 文章

CentOS Stream 9 安装 PostgreSQL 17:远程连接、用户、数据库与建表指南

在 CentOS Stream 9 单机安装 PostgreSQL 17,配置安全的远程连接,创建数据库账号、密码、数据库和数据表,并连接 DBeaver、pgAdmin、DataGrip。

本文浏览量—

本文介绍如何在一台 CentOS Stream 9 服务器上安装 PostgreSQL 17,并完成从首次启动到远程使用的基本配置。最终结构是一个 PostgreSQL 实例运行在一台服务器上,客户端通过内网、VPN 或 SSH 隧道连接。

安装使用 PostgreSQL 官方 PGDG 软件源。CentOS Stream 9 自带的软件仓库可能提供不同的 PostgreSQL 主版本;要指定 PostgreSQL 17,应安装 postgresql17 系列软件包。PostgreSQL Red Hat 系列安装说明

示例命令面向 CentOS Stream 9 的 x86_64 主机。请将示例中的服务器 IP、客户端 IP、数据库名、用户名和密码替换成自己的值。以下远程防火墙规则只放行指定客户端 IP,不建议将 PostgreSQL 的 5432 端口开放给所有公网地址。

一、确认系统和网络信息

先确认系统版本、CPU 架构和服务器地址:

cat /etc/centos-release
uname -m
ip -br address

uname -m 如果输出 x86_64,可使用本文的软件源命令。若输出 aarch64,请从 PGDG 官方仓库页面选择对应架构的仓库 RPM。

还需要知道远程客户端访问服务器时使用的源 IP 地址。如果客户端通过公司出口、家庭路由器或 VPN 访问,服务器看到的地址可能是出口地址,而不是电脑的内网地址。下面用 198.51.100.25/32 作为示例;请替换成自己的客户端公网 IP 或 VPN 地址。/32 表示仅允许这个 IPv4 地址。

二、添加 PostgreSQL 官方软件源并安装 PostgreSQL 17

使用 PGDG 的 EL 9 仓库 RPM,禁用系统自带的 PostgreSQL 模块,避免 DNF 选择到其他主版本,然后安装服务器和常用扩展包:

sudo dnf install -y \
  https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm

sudo dnf --releasever=9.8 -qy module disable postgresql
sudo dnf --releasever=9.8 install -y postgresql17-server postgresql17-contrib

CentOS Stream 9 可能没有提供 PGDG 新仓库配置所需的 DNF 小版本变量。只指定 --releasever=9 后,小版本仍为空,PGDG 会拼出 rhel-9.-x86_64 并返回 404。这里显式指定 --releasever=9.8,使 DNF 同时得到主版本 9 和小版本 8;这只作用于当前命令,不会改写系统的 DNF 配置。本文核对时 PGDG 提供 rhel-9.8-x86_64 仓库路径。

如果已经按前两条命令添加了 PGDG 仓库,并遇到 pgdg-common 的 rhel-9.-x86_64 404,不必重新安装仓库 RPM,直接执行:

sudo dnf --releasever=9.8 -qy module disable postgresql
sudo dnf --releasever=9.8 install -y postgresql17-server postgresql17-contrib

其中:

  • postgresql17-server:PostgreSQL 17 服务端和客户端命令。
  • postgresql17-contrib:PostgreSQL 官方提供的一组常用扩展模块。
  • 仓库中的小版本会随 PGDG 更新;本步骤安装的是当前仓库提供的 PostgreSQL 17 系列包。

三、初始化数据库并设置开机启动

RPM 安装不会自动初始化数据库,也不会自动开启服务。首次安装时执行一次初始化:

sudo /usr/pgsql-17/bin/postgresql-17-setup initdb

正常情况下会看到初始化成功提示。然后启用并立即启动 PostgreSQL 17:

sudo systemctl enable --now postgresql-17
sudo systemctl status postgresql-17 --no-pager

确认版本和服务状态:

sudo -iu postgres /usr/pgsql-17/bin/psql -c 'SELECT version();'
sudo -iu postgres /usr/pgsql-17/bin/psql -c 'SHOW data_directory;'

PGDG RPM 的默认数据目录通常是 /var/lib/pgsql/17/data。后续配置前也可以直接向 PostgreSQL 查询配置文件位置:

sudo -iu postgres /usr/pgsql-17/bin/psql -Atc 'SHOW config_file; SHOW hba_file;'

四、配置远程连接

PostgreSQL 默认只监听本机回环地址。远程访问需要同时满足三件事:服务监听服务器网络接口、pg_hba.conf 允许指定来源通过密码认证、系统及云平台防火墙放行连接。PostgreSQL 连接设置文档 pg_hba.conf 文档

4.1 设置监听地址和密码加密方式

编辑 postgresql.conf:

sudo vi /var/lib/pgsql/17/data/postgresql.conf

找到对应设置并调整:

listen_addresses = '*'
password_encryption = scram-sha-256

listen_addresses = '*' 让 PostgreSQL 监听所有网络接口,适合不知道服务器内网 IP 或服务器 IP 可能变化的情况。如果服务器有固定内网地址,也可以收紧为只监听本机和内网地址,例如:

listen_addresses = 'localhost,10.0.0.10'

这里的 10.0.0.10 要替换为服务器真实内网地址。监听所有地址不等于允许所有人登录;下一步的访问控制和防火墙仍然要配置。

4.2 仅允许指定客户端通过密码认证

编辑客户端认证文件:

sudo vi /var/lib/pgsql/17/data/pg_hba.conf

在文件末尾添加一条规则,将来源地址替换成远程客户端的实际 IP:

# 允许指定客户端使用 SCRAM 密码连接 appdb
host    appdb    appuser    198.51.100.25/32    scram-sha-256

字段依次表示连接类型、数据库、数据库用户、客户端来源地址和认证方式。请只允许需要访问的数据库、用户和来源网段。pg_hba.conf 按从上到下的顺序匹配规则;如果文件中有更宽泛的拒绝规则,应将允许规则放在它前面。不要使用 trust 作为远程认证方式,因为它不要求密码。PostgreSQL 密码认证说明

如果有一段可信任的内网需要连接,可以把单个地址换成对应网段,例如 192.168.10.0/24。不要随手改成 0.0.0.0/0,那会匹配所有 IPv4 来源。

4.3 配置 CentOS 防火墙

先查看 firewalld 是否运行以及网卡所在区域:

sudo firewall-cmd --state
sudo firewall-cmd --get-active-zones

如果 firewalld 正在运行,在网卡使用的区域添加只允许指定客户端 IP 连接 5432 端口的规则。示例区域为 public,若上一步显示的是其他区域,请替换区域名:

sudo firewall-cmd --permanent --zone=public \
  --add-rich-rule='rule family="ipv4" source address="198.51.100.25/32" port port="5432" protocol="tcp" accept'
sudo firewall-cmd --reload
sudo firewall-cmd --zone=public --list-rich-rules

如果 firewall-cmd --state 显示 not running,先确认服务器是否使用了其他主机防火墙或云平台安全组;不要在远程 SSH 会话中贸然启动或重配防火墙,以免影响现有远程管理连接。

如果服务器在云平台,还要在云安全组或网络 ACL 中添加相同限制:入站 TCP 5432,只允许客户端公网 IP 或 VPN 网段。操作系统防火墙和云安全组是两层独立的规则,都要检查。

4.4 重启服务并检查监听

listen_addresses 需要重启服务才能生效:

sudo systemctl restart postgresql-17
sudo systemctl status postgresql-17 --no-pager
sudo ss -lntp | grep 5432

看到 0.0.0.0:5432 或服务器指定 IP 的 :5432,表示正在对应接口监听。若只看到 127.0.0.1:5432,说明监听地址没有生效,检查配置文件路径、配置拼写和重启结果。

五、创建数据库账号、密码和数据库

PostgreSQL 的数据库角色和 Linux 系统账号是两回事。下面用系统内置的 postgres 管理员账号进入 psql:

sudo -iu postgres /usr/pgsql-17/bin/psql

在 psql 提示符内创建一个应用账号。这个账号只用于登录,不授予超级用户权限:

CREATE ROLE appuser LOGIN;

接着在 psql 中单独执行密码命令:

\password appuser

按提示输入两次强密码。\password 是 psql 命令,不是 SQL;它会交互式读取密码,避免把明文密码写进 SQL 命令历史。PostgreSQL 支持用该命令设置角色密码。psql 命令说明

为该账号创建一个数据库,并将数据库所有权交给它:

CREATE DATABASE appdb OWNER appuser ENCODING 'UTF8';

退出管理员会话:

\q

这里的 appuser 和 appdb 是示例名称。不要让日常应用使用 postgres 超级用户账号;应用只需要拥有自己的数据库。

六、连接数据库并创建第一张表

6.1 在服务器上测试账号和数据库

用 TCP 方式连接本机 PostgreSQL,模拟客户端连接:

/usr/pgsql-17/bin/psql -h 127.0.0.1 -p 5432 -U appuser -d appdb -W

-W 会提示输入密码。成功后会进入 appdb=> 提示符。

6.2 创建表、插入和查询数据

在连接到 appdb 的 psql 提示符中运行:

CREATE TABLE public.notes (
    id          bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    title       varchar(200) NOT NULL,
    body        text,
    created_at  timestamptz NOT NULL DEFAULT now()
);

INSERT INTO public.notes (title, body)
VALUES ('第一条记录', 'PostgreSQL 17 已经可以正常使用。');

SELECT id, title, body, created_at
FROM public.notes
ORDER BY id;

常见 psql 命令:

命令 作用
\l 列出数据库
\du 列出数据库角色
\dt 列出当前数据库中的表
\d public.notes 查看表结构
\conninfo 查看当前连接信息
\q 退出 psql

更多表定义语法可以查看 PostgreSQL 17 CREATE TABLE 文档。

七、从另一台电脑远程连接

7.1 使用 psql 命令行

从已放行的客户端电脑执行:

psql -h <服务器IP> -p 5432 -U appuser -d appdb -W

例如服务器内网 IP 是 10.0.0.10:

psql -h 10.0.0.10 -p 5432 -U appuser -d appdb -W

如果是 Windows 客户端,可以先安装 PostgreSQL 客户端工具,或直接使用下节介绍的图形化工具。连接成功后,执行 \conninfo 查看当前连接;执行 SELECT current_database(), current_user; 确认使用的是 appdb 和 appuser。

7.2 使用 SSH 隧道连接公网服务器

如果数据库服务器在公网,不希望直接暴露 5432 端口,可以从客户端建立 SSH 隧道:

ssh -N -L 15432:127.0.0.1:5432 <Linux登录用户>@<服务器IP>

隧道保持运行时,客户端工具填写:

  • Host:127.0.0.1
  • Port:15432
  • Database:appdb
  • Username:appuser
  • Password:创建角色时设置的密码

SSH 隧道会把本机 15432 转发到服务器的 127.0.0.1:5432。使用隧道时,安全组无需向整个互联网开放 PostgreSQL 端口;服务器仍需允许 SSH 访问。若采用此方式,确认 pg_hba.conf 保留了本机回环连接规则。

八、常用远程图形化客户端

连接时,这些工具的基本字段相同:服务器地址、端口 5432、数据库名 appdb、用户名 appuser 和密码。如果使用 SSH 隧道,填写隧道后的本机地址和端口,或使用工具内置的 SSH 配置。

工具 适合场景 连接方式
DBeaver Community Windows、macOS、Linux 通用;适合同时管理多种数据库 新建连接 → PostgreSQL → 填写 Host、Port、Database、Username、Password → Test Connection
pgAdmin 4 PostgreSQL 官方图形化管理工具;适合查看服务端对象和执行 SQL Register → Server → Connection 页填写 Host、Port、Maintenance database、Username、Password
DataGrip JetBrains 数据库 IDE;适合频繁编写和调试 SQL 的开发者 New Data Source → PostgreSQL → 填写连接参数并测试

首次连接时,工具可能提示下载 PostgreSQL JDBC 驱动,允许下载即可。远程连接如果报超时,先检查客户端源 IP 是否加入 pg_hba.conf、firewalld 和云安全组。

九、常见问题排查

connection refused

PostgreSQL 服务未运行、端口没有监听,或 listen_addresses 没有生效。检查:

sudo systemctl status postgresql-17 --no-pager
sudo ss -lntp | grep 5432

连接一直超时

通常是网络层没有放行。确认客户端使用的源 IP、firewalld 活动区域、云安全组、路由/VPN以及服务器公网或内网地址。

no pg_hba.conf entry

来源 IP、数据库名或用户名没有匹配到 pg_hba.conf 规则,或者允许规则排在了更早的拒绝规则之后。修改后可重新加载配置:

sudo systemctl reload postgresql-17

password authentication failed

确认连接使用的是 PostgreSQL 角色密码,而不是 Linux 密码;检查用户名、数据库名和密码。若需要重设密码,以 postgres 管理员登录后执行 \password appuser。

命令提示 psql: command not found

PGDG 的二进制文件通常位于 /usr/pgsql-17/bin/。在服务器上可以用完整路径运行 /usr/pgsql-17/bin/psql,或把该目录加入当前 Shell 的 PATH。

十、简单备份与恢复

安装完成后,建议把备份纳入日常维护。以下命令在客户端或服务器上运行,密码会交互式提示:

pg_dump -h <服务器IP> -p 5432 -U appuser -d appdb -F c -f appdb.dump

-F c 创建可由 pg_restore 处理的自定义格式备份。恢复到新数据库前先创建目标库,然后执行:

createdb -h <服务器IP> -p 5432 -U appuser appdb_restore
pg_restore -h <服务器IP> -p 5432 -U appuser -d appdb_restore appdb.dump

将备份保存在数据库服务器之外,并定期实际演练恢复;仅看到备份文件存在,并不能证明数据可以恢复。

配置清单

完成后可按此检查:

  • PostgreSQL 17 服务已设为开机启动,当前状态为 active (running)。
  • listen_addresses 监听了预期网卡,默认端口为 5432。
  • pg_hba.conf 只允许指定数据库、账号和客户端 CIDR,并使用 scram-sha-256。
  • firewalld 与云安全组只放行可信客户端来源。
  • 应用使用单独的普通登录账号,不使用超级用户 postgres。
  • 公网环境优先使用 VPN 或 SSH 隧道;直接连接时应另行配置 TLS 并限制来源地址。
  • 已完成一次备份,并确认可以恢复。

官方文档

命令和配置依据 PostgreSQL 官方文档及 PGDG 仓库说明整理,核对日期:2026 年 10 月 11 日。软件源和客户端界面可能更新,具体以当前官方页面为准。