Rocky Linux 9 上安装 PostgreSQL 16 与 pgvector 从零到一:完整步骤与踩坑实录
Rocky Linux 9 上安装 PostgreSQL 16 与 pgvector 从零到一:完整步骤与踩坑实录
前言
最近因项目需要,我们准备在 Rocky Linux 9 服务器上部署 PostgreSQL 16 并启用 pgvector 向量扩展,以支持 AI 相关的向量检索功能。本以为只是一次常规的数据库安装,结果却遇到了一系列意想不到的问题:从 RPM 宏文件损坏、Perl 版本混乱,到 postgresql16-devel 依赖缺失导致编译扩展失败。本文详细记录了整个安装过程及遇到的九个典型问题及其解决方案,希望能为同样需要在 RHEL 系 Linux 上部署 PostgreSQL + pgvector 的朋友提供一份避坑指南。
一、环境准备
| 组件 | 版本 | 备注 |
|---|---|---|
| 操作系统 | Rocky Linux 9.7 | 内核 5.14 |
| PostgreSQL | 16.x | 使用官方 PGDG 仓库 |
| pgvector | 0.7.x | 最新稳定版 |
| 权限 | root 或 sudo 用户 | 全程需要管理员权限 |
| 网络 | 需要访问外网 | 用于下载软件包和依赖 |
注意:本文所有操作基于 Rocky Linux 9.7,但同样适用于 AlmaLinux 9、RHEL 9 及兼容发行版。如果你使用的是 CentOS 7 或 Rocky Linux 8,部分步骤可能需要调整。
二、PostgreSQL 16 安装
2.1 添加官方仓库
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
这一步会添加 PostgreSQL 官方 YUM 仓库(pgdg16)。
2.2 禁用系统自带的 PostgreSQL 模块
Rocky Linux 9 的 AppStream 中自带了一个旧版 PostgreSQL 模块(通常为 13 或 15),必须禁用,否则会与官方仓库冲突:
sudo dnf -qy module disable postgresql
2.3 安装 PostgreSQL 16 服务器
sudo dnf install -y postgresql16-server
踩坑1:下载速度极慢
在安装过程中,postgresql16-server 的下载速度只有几 KB/s,一个 6.8 MB 的包花了 14 分钟。
原因:官方仓库位于国外,国内网络访问延迟高。
解决方案:为 DNF 设置代理(以 HTTP 代理为例)。编辑 /etc/dnf/dnf.conf,在 [main] 下添加:
proxy=http://你的代理IP:你的代理端口
如果代理需要认证,再加上:
proxy_username=用户名
proxy_password=密码
配置后重启安装,速度恢复正常。
2.4 初始化数据库
sudo /usr/pgsql-16/bin/postgresql-16-setup initdb
输出 Initializing database ... OK 表示成功。
2.5 启动服务并设置开机自启
sudo systemctl enable postgresql-16
sudo systemctl start postgresql-16
sudo systemctl status postgresql-16
确保状态为 active (running)。
2.6 安装 contrib 扩展包(推荐)
sudo dnf install -y postgresql16-contrib
这个包提供了许多有用的扩展(如 adminpack、uuid-ossp 等)。
2.7 设置数据库超级用户密码
sudo -u postgres psql
在 psql 中执行:
ALTER USER postgres WITH PASSWORD '你的强密码';
\q
三、安装 postgresql16-devel(用于编译扩展)
pgvector 需要编译安装,因此必须先安装 postgresql16-devel。
sudo dnf install -y postgresql16-devel
踩坑2:postgresql16-devel 依赖 perl(IPC::Run) 找不到
执行上述命令后,报错:
Problem: cannot install the best candidate for the job
- nothing provides perl(IPC::Run) needed by postgresql16-devel-16.13-1PGDG.rhel9.7.x86_64
截图:

原因:postgresql16-devel 依赖 Perl 模块 IPC::Run,而该模块在 Rocky Linux 9 的默认仓库中不存在。
解决方案:启用 CRB 仓库(Code Ready Builder),该仓库包含了大量开发工具和 Perl 模块。
# 启用 EPEL 仓库(如果尚未启用)
sudo dnf install epel-release -y
# 启用 CRB 仓库
sudo dnf config-manager --set-enabled crb
# 安装 perl-IPC-Run
sudo dnf install perl-IPC-Run -y
# 现在可以成功安装 postgresql16-devel
sudo dnf install postgresql16-devel -y
四、安装 pgvector 插件
4.1 使用官方 YUM 仓库安装
sudo dnf install -y pgvector_16
这个包会直接提供 vector.so 和相关的控制文件。安装截图如下:

4.2 在目标数据库中启用扩展
sudo -u postgres psql -d postgres
执行:
CREATE EXTENSION vector;
输出:
CREATE EXTENSION;
4.3 验证安装
创建一个测试表并插入向量数据:
CREATE TABLE items (id bigserial PRIMARY KEY, embedding vector(3));
INSERT INTO items (embedding) VALUES ('[1,2,3]'), ('[4,5,6]');
SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 5;
预期输出:
id | embedding
----+-----------
1 | [1,2,3]
2 | [4,5,6]
(2 rows)
截图如下:

至此,pgvector 安装完成,可以正常使用。
五、安装过程中遇到的深层问题回顾
在正式安装 PostgreSQL 之前,我们的系统其实已经遇到了一系列严重的 RPM 环境问题,这些问题源于之前误操作导致的 CentOS 7 软件包混入。下面是这些问题及其解决过程,供遇到类似情况的朋友参考。
踩坑3:RPM 宏错误导致所有 rpm / dnf 命令报错
执行任何 RPM 相关命令(如 rpm -e、dnf install)都会出现:
error: /etc/rpm/macros.perl.broken: line 34: Macro %global is a built-in (%define)
error: /etc/rpm/macros.perl.broken: line 35: Macro %global is a built-in (%define)
原因:系统中存在一个名为 /etc/rpm/macros.perl.broken 的文件,其中错误地使用了 %global 内置指令,且文件后缀 .broken 仍被 RPM 宏加载机制读取。此外,系统的 Perl 包混入了 CentOS 7 的旧版本(5.16.3)。
解决方案:
-
删除损坏的宏文件:
sudo rm -f /etc/rpm/macros.perl.broken -
清除所有 CentOS 7 的 Perl 包(带
el7标识):rpm -qa | grep -E 'el7.*perl|perl.*el7' # 查看列表 sudo rpm -e --nodeps $(rpm -qa | grep -E 'el7.*perl|perl.*el7') -
重建 RPM 数据库并重新安装 Rocky 9 的 Perl:
sudo rpm --rebuilddb sudo dnf clean all sudo dnf install perl -y -
如果
dnf install perl仍报缺少/usr/bin/perl,则强制安装主包:sudo dnf download perl --destdir=/tmp sudo rpm -ivh --nodeps --replacefiles /tmp/perl-*.rpm
踩坑4:/usr/bin/perl 文件丢失
即使 rpm -ql perl-interpreter 显示 /usr/bin/perl 属于该包,但实际磁盘上不存在。
原因:包安装时文件提取失败或被意外删除。
解决方案:
sudo rpm -Uvh --replacepkgs --replacefiles /tmp/perl-interpreter-*.rpm
然后验证 ls -l /usr/bin/perl。
踩坑5:系统 yum.repos.d 目录下混入了二进制文件
ls /etc/yum.repos.d/ 发现一个 .rpm 文件(例如 rabbitmq-server-4.2.3-1.el8.noarch.rpm),导致 dnf makecache 报错。
解决方案:
sudo rm -f /etc/yum.repos.d/rabbitmq-server-4.2.3-1.el8.noarch.rpm
六、总结与建议
踩坑汇总
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 下载 PostgreSQL 包速度极慢 | 官方仓库在国外 | 为 DNF 配置代理(/etc/dnf/dnf.conf 添加 proxy) |
| postgresql16-devel 依赖 perl(IPC::Run) 找不到 | 默认仓库不包含该模块 | 启用 CRB 仓库,安装 perl-IPC-Run |
| 所有 RPM 命令报宏错误 | /etc/rpm/macros.perl.broken 损坏且未被清除 | 删除该文件 |
| Perl 版本混乱(CentOS 7 包混入) | 错误添加了 el7 仓库或强制安装了旧包 | 删除所有 el7 的 Perl 包,重装 Rocky 9 版本 |
/usr/bin/perl 缺失 | 包安装不完整 | 强制用 rpm -Uvh --replacepkgs 重装 perl-interpreter |
/etc/yum.repos.d/ 下有二进制文件 | 误操作将 rpm 文件放入该目录 | 删除该文件 |
最佳实践
- 安装前确保系统干净:尤其是已经损坏的 RPM 宏文件、混杂的旧版本包,必须先行清理。
- 使用官方仓库 + 国内镜像:PostgreSQL 官方仓库在国内访问较慢,建议配置代理或使用阿里云/清华大学镜像站。
- 先安装 devel 包再装扩展:pgvector 虽然提供 YUM 包,但其编译过程仍需要
postgresql16-devel,务必先解决其依赖。 - 善用环境变量覆盖配置:如数据库连接信息、日志级别等,避免修改配置文件导致升级冲突。
- 遇到依赖缺失时,检查是否有额外的仓库可用:Rocky Linux 9 的 CRB(Code Ready Builder)仓库提供了很多开发包,记得启用。
- 定期更新系统:
dnf update可以修复很多已知的软件包问题,包括 Perl 等基础组件的 bug。
后续计划
PostgreSQL 16 + pgvector 已经成功运行,接下来我们将:
- 配置流复制和高可用(Patroni + etcd)
- 集成 pgvector 到 AI 业务中,实现向量相似度搜索
- 监控数据库性能(pg_stat_statements、Prometheus exporter)
如果大家在安装过程中遇到其他问题,欢迎留言交流。希望这篇文章能帮助你少走弯路,顺利搭建起 PostgreSQL 16 + pgvector 的生产环境。
更多推荐




所有评论(0)