当前位置: 首页 > news >正文

CentOS7.9宝塔安装PostgreSQL及ltree

一、前言及环境

先在软件商店中安装PostgreSQL管理器,然后安装PostgreSQL 15.5,不装16.1的原因后面再说。

装好后会自动创建一个叫postgres的库。

我需要保存类似人员组织架构那样的树形结构,所以采用PostgreSQL,这就用到了PostgreSQL的ltree。

还查到Neo4j也行,这俩在性能上都比MySQL 8.0+的CTE递归查询稍微好一些,MySQL 5.7不支持CTE。

二、问题

win11上我装了PostgreSQL 16.9,然后CREATE EXTENSION IF NOT EXISTS ltree;直接就能启用ltree,但在CentOS7.9上报错了,用SELECT * FROM pg_available_extensions WHERE name='ltree';和SELECT * FROM pg_extension WHERE extname = 'ltree';也查不到ltree。

进入PostgreSQL命令行,并执行SQL语句

# 切换到 postgres 用户
sudo -i -u postgres# 进入 psql
psql# 列出所有的数据库
\l# 切换到postgres库,可以不执行
\c postgres# 列出当前数据库中所有的表
\dt# 查询ltree
# 用于检查服务器上所有可安装的扩展(包括未安装的)
SELECT * FROM pg_available_extensions WHERE name='ltree';
# 仅显示当前数据库中已安装的扩展
SELECT * FROM pg_extension WHERE extname = 'ltree';# 创建扩展,创建完可以再查一下
CREATE EXTENSION IF NOT EXISTS ltree;

一开始以为是宝塔装的PostgreSQL不完整,然后试试官网的安装方法(这里还是装的16,是后来才换了15),结果也不行。

# Install the repository RPM:
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm# Install PostgreSQL:
sudo yum install -y postgresql16-server# Optionally initialize the database and enable automatic start:
sudo /usr/pgsql-16/bin/postgresql-16-setup initdb
sudo systemctl enable postgresql-16
sudo systemctl start postgresql-16

根据错误提示,ltree扩展未安装,需要先安装PostgreSQL的扩展支持包(postgresql-contrib),PostgreSQL 的扩展模块(如 ltree)通常包含在 postgresql-contrib 包中,可以用yum安装,例如yum install postgresql15-contrib,中间15是PostgreSQL版本号,不装16是因为现在CentOS7.9已停止维护,各种镜像站中已没有资源了,postgresql16-contrib无法安装,安装后用yum list installed | grep post查一下yum已安装的和PostgreSQL相关的。

然后重启PostgreSQL,还是无法启用ltree。可能是下面的原因:

  1. 安装路径不匹配。宝塔面板安装的 PostgreSQL 默认路径为 /www/server/pgsql,而通过 yum install postgresql15-contrib 安装的扩展文件可能位于系统默认路径(如 /usr/pgsql-15/share/extension/),导致宝塔安装的 PostgreSQL 无法找到 ltree.control 文件。
  2. 版本或依赖问题。postgresql15-contrib 包可能未正确安装或版本不匹配(例如,宝塔安装的 PostgreSQL 是 15.5,但 contrib 包是 15.0 或其他版本)。
  3. 扩展文件缺失。宝塔安装的 PostgreSQL 可能未包含 ltree 扩展,或 contrib 包未正确复制文件到预期路径。

三、解决

步骤 1:确认 PostgreSQL 安装路径和共享目录

宝塔安装的 PostgreSQL 实际路径:/www/server/pgsql/bin/postgres

确认 PostgreSQL 的共享目录(sharedir):/www/server/pgsql/share和/www/server/pgsql/share/extension,如果ltree.control文件缺失,则需手动处理。

步骤 2:检查 postgresql15-contrib 安装情况

查看 postgresql15-contrib 包安装的文件路径:

rpm -ql postgresql15-contrib
# 我这里输出下面的内容
/usr/pgsql-15/share/extension/ltree--1.0--1.1.sql
/usr/pgsql-15/share/extension/ltree--1.1--1.2.sql
/usr/pgsql-15/share/extension/ltree--1.1.sql
/usr/pgsql-15/share/extension/ltree.control

如果输出中包含/usr/pgsql-15/share/extension/ltree.control,说明扩展文件已安装,但路径不匹配宝塔的 PostgreSQL。

步骤3:手动复制扩展文件到宝塔路径

# 创建宝塔 PostgreSQL 的 extension 目录(如果不存在)
mkdir -p /www/server/pgsql/share/extension/# 复制 ltree 相关文件到宝塔路径
cp /usr/pgsql-15/share/extension/ltree.* /www/server/pgsql/share/extension/

然后再重启pgsql,再次进入命令行,CREATE EXTENSION IF NOT EXISTS ltree;报错ERROR: could not access file "$libdir/ltree": No such file or directory,表明明 PostgreSQL 无法找到 ltree 的共享库文件(.so 文件)。

这是因为PostgreSQL 扩展(如 ltree)需要两部分文件:

  1. 元数据文件(.control 和 .sql):定义扩展的安装逻辑。
  2. 共享库文件(.so 文件):包含扩展的实际功能代码(由 C/C++ 编译生成)。

目前只复制了元数据文件,但缺少关键的共享库文件(ltree.so),导致 PostgreSQL 无法加载扩展功能。

步骤4:确认 PostgreSQL 的库文件路径($libdir

查看 PostgreSQL 的 sharedir 和 libdir 配置:

# 查看 PostgreSQL 的安装路径
/www/server/pgsql/bin/pg_config# 输出示例
...
sharedir : /www/server/pgsql/share
libdir   : /www/server/pgsql/lib
...

libdir 是 PostgreSQL 的动态库目录($libdir 对应此处路径)。

ltree.so 应位于 /www/server/pgsql/lib/ltree.so。

步骤5:检查 ltree.so 是否存在

检查宝塔 PostgreSQL 的库目录:

ls /www/server/pgsql/lib/ltree.so

如果不存在,需手动安装或编译生成。

检查 postgresql15-contrib 安装的 ltree.so 路径:

rpm -ql postgresql15-contrib | grep ltree.so# 输出示例
/usr/pgsql-15/lib/ltree.so

如果存在,可复制到宝塔的 lib 目录

cp /usr/pgsql-15/lib/ltree.so /www/server/pgsql/lib/

步骤6:验证共享库文件

检查 ltree.so 是否已正确安装:

ls /www/server/pgsql/lib/ltree.so

确保 postgres 用户有读取权限:

chown postgres:postgres /www/server/pgsql/lib/ltree.so
chmod 755 /www/server/pgsql/lib/ltree.so

重启 PostgreSQL 服务,systemctl restart postgresql

步骤7:在 PostgreSQL 中创建扩展

切换到 postgres 用户并进入 psql

sudo -u postgres psql

创建 ltree 扩展

CREATE EXTENSION IF NOT EXISTS ltree;

验证是否成功

SELECT * FROM pg_extension WHERE extname = 'ltree';

四、其他补充内容

1.navicat的截断表,pgsql不会自动重置id,需要手动用命令

# 截断表并重置自增id,Navicat的截断只有TRUNCATE操作,没有RESTART IDENTITY
TRUNCATE TABLE table_name RESTART IDENTITY;

2.本地windows连接

3.一些命令

# 备份整个库
mkdir -p /home/python/hangzhou_shop/sql
chown postgres:postgres /home/python/hangzhou_shop/sql  # 确保保存导出文件的路径,postgres用户有权限
sudo -i -u postgres
pg_dump -U postgres -d postgres -f /home/python/hangzhou_shop/sql/output_file_20250826.sql
# 删除表
DROP TABLE IF EXISTS table_name CASCADE;

http://www.dtcms.com/a/526582.html

相关文章:

  • 数据库第一次练习
  • 连山建设局网站宁波seo网络推广推荐
  • 想要黑掉一个网站 要怎么做曹县做网站
  • wordpress 5.0多站点石家庄制作网站推广
  • 谷歌登录突然失效且错误码为12500
  • Linux16-进程间的通信--共享内存
  • 长沙企业网站建设分公司wordpress 调用全文
  • vs做网站示例中国室内设计网站有哪些
  • 男女做那个是的视频网站海曙网站设计建设
  • 装饰网站建设运营网页设计特效网站
  • 企业网站设计制作收费wordpress找人
  • 广东省建设厅的注册中心网站首页制作公司网站源代码怎么弄
  • 网站建设职员长沙设计网站多少钱
  • 佛山深圳建网站旅游网站的规划与建设开题报告
  • 淄博企业网站建设公司太原网站运营优化
  • 欧米茄官方手表价格湛江seo排名外包
  • 做网站都要买服务器吗京东物流网站建设策划书
  • 舆情分析报告seo 网站关键词
  • 自己做网站要会什么软件北京海淀公司注册
  • 南通网站建设制作中建建筑网站
  • 连云港建网站苏州市建设局招标网站首页
  • 做外贸的如何上国外网站旅游网站开发意义
  • asp做网站步骤建网站有什么好处
  • 加速进化发布Booster K1,打造AI时代的苹果公司
  • 北京南站属于哪个街道用dreammwea怎么做视频网站
  • 制作网站哪家强平面设计正规培训机构
  • 做旅游网站运营制作h5用什么软件比较好
  • 织梦网站程序下载ppt做杂志模板下载网站
  • 自己做视频网站收益怎么来本地建站工具
  • 南京做网站软件wordpress 优秀博客