今天有一个需求,因为我的云端linux服务器的PG是安装在docker中的,但是在日常使用时我们想先进入docker再去执行PG命令操作,因此我想在我的linux系统中安装一个PG客户端,因为服务端已有安装了,因此不需要在linux中再重新安装服务端了。
1、查看linux的版本
===================================
[oadba@VM-0-7-opencloudos springboot]$ cat /etc/os-release
NAME="OpenCloudOS"
VERSION="9.4"
看内核
[oadba@VM-0-7-opencloudos springboot]$ uname -r
6.6.117-45.oc9.x86_64
OpenCloudOS 9.4
属于 RHEL 9 / CentOS Stream 9 兼容系(国产开源服务器发行版,腾讯等牵头)
包管理器:dnf(yum 兼容),不是 apt
内核:OC9 默认 5.14 系,你这台实际可能是 6.x 云内核
确定了linux版本后就可以使用相应的命令进行安装客户端了
OpenCloudOS 9 里 PostgreSQL 客户端包一般叫:
sudo dnf install -y postgresql或显式一点:
sudo dnf install -y postgresql-client
装完验证:
which pg_dump
pg_dump --versionsudo dnf install -y postgresql 只就安装系统linux自带的版本,如果我们想装更新的版本可以使用PG官方源来下载和安装,不过最好还是使用系统自带,这样应隐定一点,确定是可用的。
现在出现一个问题,我使用15版本的pg_dump去备份docker中17版本时出现异常,原因在于低版本的客户端不能备份高版本的PG
[oadba@VM-0-7-opencloudos springboot]$ pg_dump -h 127.0.0.1 -p 5432 -U chen -d aikb -Fc -f /data/pitlog/backups/aikb.dump
Password:
pg_dump: error: aborting because of server version mismatch
pg_dump: detail: server version: 17.11 (Debian 17.11-1.pgdg12+2); pg_dump version: 15.19我现在想办法在服务器上安装17版本的,现在想办法安装17的版本,在安装时碰到第一个问题,因为linux版本并不是官方认定的版本出现以下问题。
[root@VM-0-7-opencloudos ~]# sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
Last metadata expiration check: 2:41:36 ago on Thu 15 Oct 2026 10:51:14 AM CST.
pgdg-redhat-repo-latest.noarch.rpm 10 kB/s | 15 kB 00:01
Error:
Problem: conflicting requests
• nothing provides /etc/redhat-release needed by pgdg-redhat-repo-42.0-70.rhel9PGDG.noarch from @commandline
(try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)这个是 OpenCloudOS 不是“正宗 RHEL/CentOS”,PGDG 官方 RPM 里写死了依赖,我只能直接写repo源来指定PG来更新。
PG17 客户端安装踩坑总结(OpenCloudOS 9.4)
背景
- 宿主机:OpenCloudOS 9.4(RHEL9 兼容系,国产发行版)
- PostgreSQL 跑在 Docker 里,版本 17.11
- 目标:在宿主机装
pg_dump 17,用来备份 Docker 里的 PG17
踩坑全过程
坑 1:默认装的是 PG15,版本太低备不了 17
dnf install postgresql # 装的是 15
pg_dump -h 127.0.0.1 -p 5432 -U chen -d aikb -Fc -f backup.dump
# 报错:aborting because of server version mismatch
# server: 17.11, pg_dump: 15.19规则:pg_dump 大版本必须 ≥ 服务端大版本,否则直接拒绝工作。
坑 2:PGDG 官方 RPM 依赖 /etc/redhat-release,OpenCloudOS 没有
dnf install https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# 报错:nothing provides /etc/redhat-releaseOpenCloudOS 提供的是opencloudos-release,不是redhat-release,PGDG 的 RPM 硬性依赖它,直接拒绝安装。
解决:不用那个 RPM,手动写 repo 文件 /etc/yum.repos.d/pgdg.repo。
坑 3:GPG Key 反复校验失败(最折腾的一坑)
手动写 repo 后,试了多个 key 地址:
| Key 地址 | 结果 |
|---|---|
ACCC4CF8.asc(APT key) | 导入成功但 RPM 不是这个签的,校验失败 |
RPM-GPG-KEY-PGDG | key 已安装,但"not correct for this package" |
RPM-GPG-KEY-PGDG-EL9 | 同样不匹配 |
报错核心:
GPG key is already installed but they are not correct for this package
Public key for postgresql17-17.11-1PGDG.rhel9.8.x86_64.rpm is not installed根因:PGDG 的 RPM 包签名用的子 key 和 repo 元数据声明的 key 不一致,加上 OpenCloudOS 不是 PGDG 官方支持的系统,key 信任链不完整。
现象迷惑性:dnf 显示"Downloading Packages"进度条跑完(2.3M 下完了),但 GPG 校验在最后一步失败,包根本没写进文件系统。所以 /usr/pgsql-17/bin/pg_dump 一直不存在。
坑 4:装上了但默认 pg_dump 还是 15
最后用 --nogpgcheck 或换源装成功后:
pg_dump --version # 15.19(/usr/bin/pg_dump)
/usr/pgsql-17/bin/pg_dump --version # 17.11(✅)PGDG 包故意把版本化客户端装到/usr/pgsql-17/bin/,不覆盖/usr/bin,避免破坏系统默认工具。这是设计行为,不是装错了。
最终可用方案
方案 A:宿主机装 PG17 客户端(--nogpgcheck 绕过)
sudo dnf install -y --nogpgcheck postgresql17
/usr/pgsql-17/bin/pg_dump -h 127.0.0.1 -p 5432 -U chen -d aikb -Fc -f backup.dump方案 B:直接用 Docker 容器里的 pg_dump(最省事)
docker exec pg17 pg_dump -U chen -d aikb -Fc > backup.dump方案 C:alternatives 切换系统默认
sudo alternatives --install /usr/bin/pg_dump pg_dump /usr/pgsql-17/bin/pg_dump 170
sudo alternatives --config pg_dump关键教训
| 点 | 结论 |
|---|---|
| PGDG 官方源对国产 RHEL 兼容系支持不完整 | OpenCloudOS / TencentOS / Anolis 装 PGDG 包大概率踩 GPG 坑 |
| dnf 下载完成 ≠ 安装成功 | GPG 校验在最后一步,失败则不落盘 |
| pg_dump 版本必须 ≥ 服务端 | 低版本直接 abort,不是警告 |
| 多版本共存是正常设计 | /usr/pgsql-17/bin/ 和 /usr/bin/ 各管各的 |
| Docker 里跑 PG → 容器里备 | 版本 100% 匹配,零依赖,最省心 |
一句话总结:国产 RHEL 系装 PGDG 官方 PostgreSQL 客户端 = GPG key 地狱,不如直接 docker exec pg_dump,或者 --nogpgcheck 强行装完用绝对路径。