宝塔 PostgreSQL 安装 pgvector 插件实现向量存储

1. 宝塔安装

  1. 首先确保你的宝塔已经安装了 PostgreSQL。

安装好后是能看到上面这个界面的。

我安装的是 16.1 版本,下面的教程讲的也是 16.1 版本的。

2.开放防火墙的端口号 5432

3.允许外部访问所有数据库

4.设置超级管理员用户密码

用户名默认为:postgres

后续连接数据库可用超级用户连接

username:postgres

password:就是你刚刚设置的

2. 安装 pgvector 插件

2.1 查看安装状态

1. 首先去到控制台,输入命令连接 postgreSQL 数据库。

bash
复制代码
/www/server/pgsql/bin/psql -U postgres -h localhost -p 5432

显示 postgres=# 就是连接上了数据库,可以敲 sql 语句了。

2. 在psql命令行中,执行创建扩展的命令:

bash
复制代码
CREATE EXTENSION vector;

如果没有安装过插件就会报错。

3.验证是否安装成功:

bash
复制代码
\dx vector

如果成功,它会列出 vector 扩展的信息。如下图:

2.2 安装pgvector

下载pgvector插件:

下载地址: https://github.com/pgvector/pgvector/archive/refs/tags/v0.7.4.zip

postgresql14 对应 pgvector0.5 的版本

postgresql15 对应 pgvector0.6 的版本

postgresql15 对应 pgvector0.7 的版本

将压缩包本地解压好,去宝塔建个文件夹,直接把文件都传进去。

2.3 编译安装

进入刚刚上传文件夹的目录,准备编译安装。

bash
复制代码
# 进入你的 pgvector 源代码目录 cd /www/wwwroot/pgvector # 清理之前的编译尝试(可选,但推荐) make clean # 使用找到的 pg_config 路径进行编译 make PG_CONFIG=/www/server/pgsql/bin/pg_config # 安装编译好的扩展(需要 root 权限) sudo make install PG_CONFIG=/www/server/pgsql/bin/pg_config

然后重复 2.1 查看安装状态,查看是否安装成功。

2.4 设置环境变量 (建议设置)

1.找到PostgreSQL的可执行工具路径

我的 PostgreSQL 安装目录是/www/server/pgsql。这个目录下的 bin 子目录包含了所有 PostgreSQL的命令行工具,包括 psql (PostgreSQL 交互终端)和 pg-ctl (服务控制工具)。

重要工具路径:

psql:/www/server/pgsql/bin/psql(用于连接数据库和执行 SQL 命令)

pg-ctl:/www/server/pgsql/bin/pg-ctl(用于管理PostgreSQL 服务,如启动、停止)

检查工具是否存在:

bash
复制代码
ls -la /www/server/pgsql/bin/psql ls -la /www/server/pgsql/bin/pg-ctl

如果这些文件存在(应该有可执行权限),你就可以使用它们了。

2.设置环境变量

为了方便使用,建议将 PostgreSQL 的 bin目录添加到你的 PATH 环境变量中。这样你就可以直接在命令行中输入 psql、pg-ctl 等命令,而不需要每次都输入完整路径。

bash
复制代码
#临时添加(当前终端会话有效): export PATH=/www/server/pgsql/bin:$PATH #永久添加(推荐): #将上面的export 命令添加到你的 shell配置文件中(如~/.bashrc 或~/.bash_profile): echo 'export PATH=/www/server/pgsql/bin:$PATH' >> ~/.bashrc Source ~/.bashrc #验证路径是否设置成功: which psql # 应该输出: /www/server/pgsql/bin/psql

3.使用psql 连接到 PostgreSQL 数据库

psql 是 PostgreSQL 的交互式终端程序,允许执行 SQL 命令和管理数据库。

以postgres用户连接到数据库:

bash
复制代码
#使用完整路径(如果未设置PATH) /www/server/pgsql/bin/psql -U postgres -h localhost -p 5432 #或者如果已设置PATH psql -U postgres -h localhost -p 5432

说明:

  • -U postgres:指定用户名(PostgreSQL 的默认超级用户通常叫postgres)
  • -h localhost:指定主机 (这里连接本地数据库)
  • -p 5432:指定端口(PostgreSQL 默认端口是54321,如果你的配置不同请修改)

如果连接失败:

  • 权限问题:检查/www/server/pgsql/data/pg_hba.conf 文件,确保有允许 postgres 用户从本地连接的配置。
  • 端口问题:确认你的 PostgreSQL 实际监听端口

(检查/www/server/pgsql/data/postgresql.conf 中的 port 设置)。

4.在数据库中启用pgvector扩展

成功连接to PostgreSQL 后,你会看到提示符变为postgres=#,这表示你现在可以执行 SQL 命令。

创建并启用扩展:

bash
复制代码
-- 启用 vector 扩展 CREATE EXTENSION vector; -- 验证扩展是否安装成功 \dx vector

3.解决PostgreSQL中“vector"类型不存在的问题

问题原因分析

扩展已安装但未启用:PostgreSQL 扩展需要在每个要使用它的数据库中单独创建。即使服务器层面安装了 pgvector,不执行 CREATE EXTENSION 命令,当前数据库也无法识别vector 数据类型。

权限问题:当前数据库用户可能没有创建扩展的权限。

搜索路径问题:扩展可能安装在了非默认模式(schema)下,而该模式不在你的search_path中。

解决方法:

步骤1:连接到你的数据库并创建扩展

使用有权限的用户(如postgres或具有超级用户权限的用户)连接到你需要使用vector 数据类型的数据库,然后执行以下 SQL 命令:

sql
复制代码
-- 连接到你的数据库后,执行以下命令创建扩展 CREATE EXTENSION IF NOT EXISTS vector;

步骤2:验证扩展是否创建成功

创建扩展后,可以通过以下命令验证是否成功:

sql
复制代码
-- 查看当前数据库已安装的扩展列表,检查 vector 是否在列 \dx -- 或者查询扩展详情 SELECT * FROM pg_extension WHERE extname = 'vector';

4.解决 Spring AI PgVectorStore 的 hstore 扩展问题

错误信息显示:

plain
复制代码
ERROR: extension "hstore" is not available 详细:Could not open extension control file "/www/server/pgsql/share/extension/hstore.control": No such file or directory. 建议:The extension must first be installed on the system where PostgreSQL is running.

<font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">hstore</font> 是 PostgreSQL 的一个扩展,用于存储键值对数据。Spring AI 的 PgVectorStore 依赖这个扩展来存储元数据。

安装 hstore 扩展

安装 PostgreSQL contrib 包(包含 hstore 扩展):

bash
复制代码
指定版本(假设你使用的是 PostgreSQL 16) sudo yum install postgresql16-contrib

让 PostgreSQL 找到 hstore 扩展

手动将 <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">contrib</font> 包提供的扩展文件复制或链接到 PostgreSQL 的搜索路径中。

步骤 1: 查找 hstore 扩展文件的位置

首先,我们需要找到 <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">postgresql16-contrib</font> 包安装后,<font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">hstore</font> 扩展文件实际存放的位置。

使用 find 命令搜索
在终端中执行以下命令,搜索 <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">hstore.control</font> 文件:

  1. bashsudo find / -name "hstore.control" 2>/dev/null

或者更精确地搜索 <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">contrib</font> 相关的目录:

  1. bashsudo find /usr -path "/contrib/" -name "hstore.control" 2>/dev/null
  2. 检查常见的安装路径
    根据 OpenCloudOS 和 PostgreSQL 的常见安装路径,<font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">hstore.control</font> 文件很可能在以下位置之一:
    • <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">/usr/share/pgsql/extension/hstore.control</font>
    • <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">/usr/share/postgresql16/extension/hstore.control</font>
    • <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">/usr/pgsql-16/share/extension/hstore.control</font>

步骤 2: 将扩展文件链接到 PostgreSQL 目录

找到 <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">hstore.control</font> 文件及其同目录下的相关文件(通常是 <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">.sql</font><font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">.so</font> 文件)后,您有两种方法让 PostgreSQL 找到它们:

创建符号链接(推荐,更灵活)

假设您找到的路径是 <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">/usr/share/pgsql/extension/hstore.control</font>

bash
复制代码
# 创建扩展目录(如果不存在) sudo mkdir -p /www/server/pgsql/share/extension/ # 为 hstore.control 创建符号链接 sudo ln -s /usr/share/pgsql/extension/hstore.control /www/server/pgsql/share/extension/hstore.control # 为 hstore--1.x.sql 文件创建符号链接(请替换 x 为实际版本号,或用通配符) sudo ln -s /usr/share/pgsql/extension/hstore--1*.sql /www/server/pgsql/share/extension/ # 为 hstore.so 共享库创建符号链接(库文件可能在 lib 目录下) # 先找到 hstore.so 文件 sudo find / -name "hstore.so" 2>/dev/null # 假设找到的路径是 /usr/lib64/pgsql/hstore.so sudo ln -s /usr/lib64/pgsql/hstore.so /www/server/pgsql/lib/hstore.so

步骤 3: 设置文件权限

确保 PostgreSQL 用户(通常是 <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">postgres</font>)有权限读取这些文件:

bash

bash
复制代码
sudo chown postgres:postgres /www/server/pgsql/share/extension/hstore.* sudo chmod 644 /www/server/pgsql/share/extension/hstore.* sudo chown postgres:postgres /www/server/pgsql/lib/hstore.so sudo chmod 755 /www/server/pgsql/lib/hstore.so

步骤 4: 重启 PostgreSQL 服务并启用扩展

完成文件链接或复制后,重启 PostgreSQL 服务以使更改生效,然后启用扩展:

先手动去宝塔面板重启 PostgreSQL 服务

bash
复制代码
# 连接到 PostgreSQL psql -U postgres -h localhost # 在 psql 中创建扩展 CREATE EXTENSION hstore; # 验证扩展是否安装成功 \dx hstore

最后确认一下 PostgreSQL 配置文件有没有问题:

5.PostgreSQL 数据库中缺少 uuid-ossp 扩展

  1. 创建符号链接
bash
复制代码
# 为扩展控制文件和SQL文件创建符号链接 sudo ln -s /usr/share/pgsql/extension/uuid-ossp.control /www/server/pgsql/share/extension/ sudo ln -s /usr/share/pgsql/extension/uuid-ossp--1.0--1.1.sql /www/server/pgsql/share/extension/ sudo ln -s /usr/share/pgsql/extension/uuid-ossp--1.1.sql /www/server/pgsql/share/extension/ # 为共享库文件创建符号链接 sudo ln -s /usr/lib64/pgsql/uuid-ossp.so /www/server/pgsql/lib/
  1. 验证符号链接:
bash
复制代码
ls -la /www/server/pgsql/share/extension/uuid-ossp* ls -la /www/server/pgsql/lib/uuid-ossp.so

3.重启 PostgreSQL 服务(手动)

4.在 PostgreSQL 中创建扩展

bash
复制代码
CREATE EXTENSION "uuid-ossp";

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
qpeter
作者分享
✅ 今天做了 1. 刷一小时面试鸭 2. 总结 AskHuman 以及智能体的架构 ⏰ 明天计划: 1. 刷一小时面试题 2. 输出智能体及其 AskHuman 的系统性文档 📚 今日感悟: 今天算是把智能体架构和 Human-in-Loop 啃下来了。最核心的是CompletableFuture<T>的使用,通过这个来阻塞唤醒线程并传递 Human Answer。底层原理是 CAS,相比于线程睡眠导致 CPU 空转效率要高得多了。 再一个就是要给 AgentState 加 volatile 字段确保智能体状态在多个线程之间的可见性,因为 AgentState 是控制智能体循环的核心。 起一个异步线程池专门用来异步跑 Agent 实例,最后就是 Agent 实例的继承关系,最后 Agent 实例拥有继承来的所有属性。所以需要再定义一个 AgentManager 来获取和创建实例。
4
✅ 今天做了 1. 刷一小时面试鸭 2. 复习智能体构建 3. 智能体 AskHuman 并发收尾 ⏰ 明天计划: 1. 刷一小时面试题 2. 总结 AskHuman 以及智能体的架构 📚 今日感悟: 彻底被 AI 折服,vibe coding 后端中,AI 连 NPE 都考虑到了,写代码这方面被 AI 完爆,今天是在学习 AI 是如何搭建 Human-in-Loop 的。 主要是通过三个线程配合 + Loop 的状态来完成的,三个线程分别为启动对话的 Tomcat 线程,后台异步运行智能体实例的线程,接收 Human Answer 的 Tomcat 线程,这三个线程操作的都是同一个 Manus 实例,所以就会有并发问题。 并发问题用到了 ConcurrentHashMap 来维护 Manus 实例和 ChatId 的映射,以及 CompletableFuture 来控制线程的阻塞唤醒和传递 Human Answer 。 NPE 的问题是接收 Human Answer 的 Tomcat 线程如果在异步线程之前设置了 Future 来传递信息,此时 Future 就为 null 了。所以需要在代码中加入 null 检查。 之前其实踩过 NPE 的坑,还是 dubug 排除出来的,但是这里确实没有想过 NPE 的问题,对于并发编程这一块我还是很薄弱的。
4
✅ 今天做了 1. 刷一小时面试鸭 2. 智能体 AskHuman 实现 ⏰ 明天计划: 1. 刷一小时面试题 2. 智能体收尾 📚 今日感悟: 今天发现一个还不错的技巧,直接在后端的 vibe coding 会话中,让他生成对应 vibe coding 前端的提示词,前端的开发和联调效率要高不少。 智能体的实现还是很有别于对话的实现的。实现 AskHuman 本质还是工具调用,模型思考是否需要 AskHuman,然后通过调用工具,把用户的输出添加到本次实例维护的消息记忆中,同时需要保存并暂停当前智能体执行的快照。
6
✅ 今天做了 1. 刷一小时面试鸭 2. 智能体历史对话 ⏰ 明天计划: 1. 刷一小时面试题 2. 智能体 AskHuman 📚 今日感悟: 接口文档还是很重要的,接口文档没有搞清楚,很容易出现调错了接口,最后重新返工,得不偿失。前后端联调的过程中会发现很多问题,需要一一处理。 但是真正跑通了呈现出来了自己真正想要的效果真的很爽。
4
✅ 今天做了 1. 刷一小时面试题 2. Claude 后门原理 & Harness Engineering 3. 改造智能体项目第一阶段,定为研发规范智能体 ⏰ 明天计划: 1. 刷一小时面试题 2. 智能体 AskHuman + 历史对话 📚 今日感悟: 今天看了大佬“执笔经年”的“从零构建企业级知识库平台“的帖子。看完觉得自己还是太菜了,了解的知识还是不够,还是存在着很多问题需要改进的,非常欠缺这种企业级项目的落地经验。 项目技术选型、架构权衡、版本迭代,背后的各种思考,AI 应用开发本质考查的还是后端的工程能力,官方文档的阅读应用能力,自己还有着太多需要进步的地方了。 终于知道为什么飞行员都用飞行时长来衡量技术了,作为开发者,项目时长也是衡量技术的核心参数。
4
下载 APP