在 Fedora 上装 PostgreSQL:16/17/18/19 四个版本怎么选,装哪个包
Fedora 的 PostgreSQL 打包方式很特殊:仓库里同时躺着四个主版本,但只能装一个。
先看仓库到底有哪些版本
Section titled “先看仓库到底有哪些版本”dnf list --available "postgresql1*-server.x86_64" 2>/dev/null | grep x86_64postgresql16-server.x86_64 16.14-5.fc45 fedorapostgresql17-server.x86_64 17.9-10.fc45 fedorapostgresql19-server.x86_64 19beta1-6.fc45 fedora再加上默认包名(对应最新稳定版):
dnf list --available postgresql-server.x86_64postgresql-server.x86_64 18.3-12.fc45 fedora| 想要 | 装的包 | 版本 |
|---|---|---|
| PG 16 | postgresql16-server | 16.14 |
| PG 17 | postgresql17-server | 17.9 |
| PG 18(默认) | postgresql-server | 18.3 |
| PG 19(beta) | postgresql19-server | 19beta1 |
装默认版(PG 18)
Section titled “装默认版(PG 18)”sudo dnf install postgresql-server包不大:下载 7.9 MiB,安装 32.9 MiB。
确认版本:
postgres --versionpsql --versionpostgres (PostgreSQL) 18.3psql (PostgreSQL) 18.3必须先 initdb
Section titled “必须先 initdb”Fedora 的包不会自动初始化数据目录,装完直接起服务会失败:
sudo systemctl start postgresql先初始化:
sudo postgresql-setup --initdb * Initializing database in '/var/lib/pgsql/data' * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log数据目录是 /var/lib/pgsql/data。
再起服务:
sudo systemctl enable --now postgresqlsystemctl is-active postgresqlactivesystemctl list-unit-files | grep postgres 能看到两个单元:
postgresql.service disabled disabled[email protected] disabled disabled[email protected] 是模板单元,用于在一台机器上跑多个实例——这是多版本/多实例需求的正规做法(见后文)。
sudo -u postgres psql -c "select version();" PostgreSQL 18.3 on x86_64-redhat-linux-gnu, compiled by gcc (GCC) 16.2.1 20260819 (Red Hat 16.2.1-2), 64-bit(1 row)注意这里的 -u postgres:默认只有 postgres 系统用户能连,因为认证方式是 peer。
默认只听回环
Section titled “默认只听回环”ss -lntp | grep 5432LISTEN 0 200 127.0.0.1:5432 0.0.0.0:*LISTEN 0 200 [::1]:5432 [::]:*和 Valkey 一样,数据库默认不对外。
默认认证:peer 与 ident
Section titled “默认认证:peer 与 ident”sudo grep -vE "^(#|$)" /var/lib/pgsql/data/pg_hba.conflocal all all peerhost all all 127.0.0.1/32 identhost all all ::1/128 identlocal replication all peerpeer:本地 socket 连接时,用操作系统用户名匹配数据库用户名ident:TCP 连接时也要做身份确认
所以 psql -U postgres 直接跑会失败,得先 sudo -u postgres。要允许密码登录,改 pg_hba.conf 里的方法为 scram-sha-256,并给用户设密码。
多版本并存怎么做
Section titled “多版本并存怎么做”既然官方包的四个版本互斥,要在一台机器上同时留 16 和 18,有三条路:
| 方案 | 做法 | 代价 |
|---|---|---|
| 多实例(推荐) | 同一版本跑多个实例,用 [email protected] + 不同端口/数据目录 | 只能同版本 |
| PGDG 官方仓库 | 加 PostgreSQL 官方的 pgdg 源,装 postgresql-16-server 与 postgresql-18-server | 需要额外源 |
| 容器 | 每个版本一个 Podman 容器 | 隔离最彻底,运维成本高 |
多实例的关键是 [email protected] 这个模板单元。它的实例名对应数据目录:
sudo postgresql-setup --initdb --unit postgresql@16-main \ --port 5433 --datadir /var/lib/pgsql/16/datasudo systemctl enable --now postgresql@16-main这样 18 在 5432、16 在 5433,互不干扰。
sudo -u postgres psql # 进交互式 psqlsudo -u postgres createuser --interactivesudo -u postgres createdb mydbsudo -u postgres psql -c "\l" # 列出数据库sudo -u postgres psql -c "\du" # 列出用户\q 退出。
| 现象 | 原因 |
|---|---|
| 服务起不来 | 没跑 postgresql-setup --initdb |
psql: FATAL: Peer authentication failed | 用普通用户跑了 psql -U postgres,要 sudo -u postgres |
改 pg_hba.conf 不生效 | 忘了 systemctl reload postgresql |
| 远程连 5432 失败 | 默认只绑 127.0.0.1,改 postgresql.conf 的 listen_addresses |
| 同时装 16 和 18 报冲突 | 二者互斥,用多实例或 PGDG 源 |
| 数据目录权限错 | 属主必须是 postgres:postgres,改完要重启 |
- Valkey 内存数据库 — 另一类数据库的默认配置
- Podman 上手 — 用容器跑多版本
- 多版本并存 — 各语言的版本策略总览
- 防火墙 firewalld — 放行 5432 前的准备
- 官方:PostgreSQL 文档