跳转到内容
搜索 Fedora 文档

    浏览当前文档目录

    在 Fedora 上装 PostgreSQL:16/17/18/19 四个版本怎么选,装哪个包

    Fedora 的 PostgreSQL 打包方式很特殊:仓库里同时躺着四个主版本,但只能装一个。

    四个 PostgreSQL 版本因 postgresql-server-any 而互斥

    Terminal window
    dnf list --available "postgresql1*-server.x86_64" 2>/dev/null | grep x86_64
    postgresql16-server.x86_64 16.14-5.fc45 fedora
    postgresql17-server.x86_64 17.9-10.fc45 fedora
    postgresql19-server.x86_64 19beta1-6.fc45 fedora

    再加上默认包名(对应最新稳定版):

    Terminal window
    dnf list --available postgresql-server.x86_64
    postgresql-server.x86_64 18.3-12.fc45 fedora
    想要装的包版本
    PG 16postgresql16-server16.14
    PG 17postgresql17-server17.9
    PG 18(默认)postgresql-server18.3
    PG 19(beta)postgresql19-server19beta1
    Terminal window
    sudo dnf install postgresql-server

    包不大:下载 7.9 MiB,安装 32.9 MiB。

    确认版本:

    Terminal window
    postgres --version
    psql --version
    postgres (PostgreSQL) 18.3
    psql (PostgreSQL) 18.3

    Fedora 的包不会自动初始化数据目录,装完直接起服务会失败:

    Terminal window
    sudo systemctl start postgresql

    先初始化:

    Terminal window
    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。

    再起服务:

    Terminal window
    sudo systemctl enable --now postgresql
    systemctl is-active postgresql
    active

    systemctl list-unit-files | grep postgres 能看到两个单元:

    postgresql.service disabled disabled
    [email protected] disabled disabled

    [email protected] 是模板单元,用于在一台机器上跑多个实例——这是多版本/多实例需求的正规做法(见后文)。

    Terminal window
    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。

    Terminal window
    ss -lntp | grep 5432
    LISTEN 0 200 127.0.0.1:5432 0.0.0.0:*
    LISTEN 0 200 [::1]:5432 [::]:*

    和 Valkey 一样,数据库默认不对外。

    Terminal window
    sudo grep -vE "^(#|$)" /var/lib/pgsql/data/pg_hba.conf
    local all all peer
    host all all 127.0.0.1/32 ident
    host all all ::1/128 ident
    local replication all peer
    • peer:本地 socket 连接时,用操作系统用户名匹配数据库用户名
    • ident:TCP 连接时也要做身份确认

    所以 psql -U postgres 直接跑会失败,得先 sudo -u postgres。要允许密码登录,改 pg_hba.conf 里的方法为 scram-sha-256,并给用户设密码。

    既然官方包的四个版本互斥,要在一台机器上同时留 16 和 18,有三条路:

    方案做法代价
    多实例(推荐)同一版本跑多个实例,用 [email protected] + 不同端口/数据目录只能同版本
    PGDG 官方仓库加 PostgreSQL 官方的 pgdg 源,装 postgresql-16-server 与 postgresql-18-server需要额外源
    容器每个版本一个 Podman 容器隔离最彻底,运维成本高

    多实例的关键是 [email protected] 这个模板单元。它的实例名对应数据目录:

    Terminal window
    sudo postgresql-setup --initdb --unit postgresql@16-main \
    --port 5433 --datadir /var/lib/pgsql/16/data
    sudo systemctl enable --now postgresql@16-main

    这样 18 在 5432、16 在 5433,互不干扰。

    Terminal window
    sudo -u postgres psql # 进交互式 psql
    sudo -u postgres createuser --interactive
    sudo -u postgres createdb mydb
    sudo -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,改完要重启