PostGIS从3.1.11升级至3.2.7/3.3.x报错无更新路径,求解决
针对PostGIS+PostgreSQL跨版本升级的可行解决方案
问题背景
- 当前环境:PostgreSQL 13 + PostGIS 3.1.11
- 目标:通过
pg_upgrade升级至PostgreSQL 14/15,同步将PostGIS升级到3.2.7或3.3.4 - 已尝试的失败路径:
- 先升PG再升PostGIS:
PostGIS_Extensions_Upgrade()仅适配PG版本,安装PostGIS32_14后执行升级报错extension 'postgis' has no update path from version '3.1.11' to version '3.2.7' - 先升PostGIS再升PG:安装PG13对应的PostGIS32_13/33_13后升级,仍报相同错误
- 先升PG再升PostGIS:
- 额外限制:dnf无法同时安装新旧PostGIS版本(文件冲突),软链接
.so提示版本不匹配,数据库超1TB无法使用pg_dump全量导出
可行解决方案
方案1:利用PostGIS升级脚本+pg_upgrade链接模式(推荐)
核心是绕开直接升级的路径限制,先完成PG升级,再手动注入PostGIS升级逻辑:
- 准备目标版本的PostGIS组件
- 下载对应目标PG版本(14/15)的PostGIS 3.2.7/3.3.4离线RPM包
- 解压RPM到临时目录(如
/tmp/postgis_temp),提取核心文件:- 版本对应升级脚本:
postgis--3.1.11--3.2.7.sql - 动态库文件:
postgis.so、postgis-3.so等
- 版本对应升级脚本:
- 执行pg_upgrade升级PG
- 使用
--link模式节省磁盘空间(适合大库),执行标准升级流程:pg_upgrade -b /usr/pgsql-13/bin -B /usr/pgsql-14/bin -d /var/lib/pgsql/13/data -D /var/lib/pgsql/14/data -U postgres --link - 升级完成后不要启动新PG服务
- 使用
- 替换组件并执行升级脚本
- 将临时目录中的
.so文件复制到目标PG的lib目录(如/usr/pgsql-14/lib),覆盖原有文件 - 将升级脚本复制到目标PG的
share/extension目录 - 启动新PG服务,登录数据库执行:
ALTER EXTENSION postgis UPDATE TO '3.2.7'; -- 验证版本 SELECT postgis_version();
- 将临时目录中的
方案2:PostGIS unpackaged模式迁移
如果找不到对应版本的升级脚本,可通过重新注册扩展关联现有数据:
- 升级PG到目标版本后,先卸载旧PostGIS扩展(不会删除空间数据):
DROP EXTENSION postgis; - 安装目标版本PostGIS,执行以下命令重新关联空间对象:
该命令会自动将原有空间数据、函数重新绑定到新扩展上,无需重新导入数据CREATE EXTENSION postgis FROM unpackaged; -- 验证完整性 SELECT postgis_full_version();
方案3:临时目录隔离解决PostGIS安装冲突
通过指定安装路径绕过dnf的文件冲突限制:
- 将旧版PostGIS安装到临时路径(已安装可跳过):
rpm -ivh --relocate /usr/pgsql-13=/tmp/pgsql13_old postgis31_13-3.1.11-1.el8.x86_64.rpm - 安装新版PostGIS到目标PG路径:
rpm -ivh postgis32_14-3.2.7-1.el8.x86_64.rpm - 执行pg_upgrade时指定旧库路径:
升级完成后再按方案1/2处理PostGIS版本更新pg_upgrade -b /usr/pgsql-13/bin -B /usr/pgsql-14/bin -d /var/lib/pgsql/13/data -D /var/lib/pgsql/14/data -U postgres --link --old-libdir=/tmp/pgsql13_old/lib
关键注意事项
- 操作前必须完成全量冷备份(如
pg_basebackup),避免数据丢失 - 升级后需重新处理PostGIS依赖扩展(如
postgis_topology、postgis_raster),同样使用ALTER EXTENSION ... UPDATE或FROM unpackaged模式 - 验证空间数据完整性:检查
spatial_ref_sys表、执行空间查询测试
内容的提问来源于stack exchange,提问作者Karizma
相关产品推荐
相关产品推荐

