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
PostgreSQL16.x使用官方 PGDG 仓库
pgvector0.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

这个包提供了许多有用的扩展(如 adminpackuuid-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 -ednf 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)。

解决方案

  1. 删除损坏的宏文件:

    sudo rm -f /etc/rpm/macros.perl.broken
    
  2. 清除所有 CentOS 7 的 Perl 包(带 el7 标识):

    rpm -qa | grep -E 'el7.*perl|perl.*el7'   # 查看列表
    sudo rpm -e --nodeps $(rpm -qa | grep -E 'el7.*perl|perl.*el7')
    
  3. 重建 RPM 数据库并重新安装 Rocky 9 的 Perl:

    sudo rpm --rebuilddb
    sudo dnf clean all
    sudo dnf install perl -y
    
  4. 如果 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 文件放入该目录删除该文件

最佳实践

  1. 安装前确保系统干净:尤其是已经损坏的 RPM 宏文件、混杂的旧版本包,必须先行清理。
  2. 使用官方仓库 + 国内镜像:PostgreSQL 官方仓库在国内访问较慢,建议配置代理或使用阿里云/清华大学镜像站。
  3. 先安装 devel 包再装扩展:pgvector 虽然提供 YUM 包,但其编译过程仍需要 postgresql16-devel,务必先解决其依赖。
  4. 善用环境变量覆盖配置:如数据库连接信息、日志级别等,避免修改配置文件导致升级冲突。
  5. 遇到依赖缺失时,检查是否有额外的仓库可用:Rocky Linux 9 的 CRB(Code Ready Builder)仓库提供了很多开发包,记得启用。
  6. 定期更新系统dnf update 可以修复很多已知的软件包问题,包括 Perl 等基础组件的 bug。

后续计划

PostgreSQL 16 + pgvector 已经成功运行,接下来我们将:

  • 配置流复制和高可用(Patroni + etcd)
  • 集成 pgvector 到 AI 业务中,实现向量相似度搜索
  • 监控数据库性能(pg_stat_statements、Prometheus exporter)

如果大家在安装过程中遇到其他问题,欢迎留言交流。希望这篇文章能帮助你少走弯路,顺利搭建起 PostgreSQL 16 + pgvector 的生产环境。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐