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。可能是下面的原因:
- 安装路径不匹配。宝塔面板安装的 PostgreSQL 默认路径为 /www/server/pgsql,而通过 yum install postgresql15-contrib 安装的扩展文件可能位于系统默认路径(如 /usr/pgsql-15/share/extension/),导致宝塔安装的 PostgreSQL 无法找到 ltree.control 文件。
- 版本或依赖问题。postgresql15-contrib 包可能未正确安装或版本不匹配(例如,宝塔安装的 PostgreSQL 是 15.5,但 contrib 包是 15.0 或其他版本)。
- 扩展文件缺失。宝塔安装的 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)需要两部分文件:
- 元数据文件(.control 和 .sql):定义扩展的安装逻辑。
- 共享库文件(.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;
