PostgreSQL 9.6升级至10版本:pg_upgrade库检查报错求助
我来帮你搞定这个pg_upgrade的报错!这个问题的核心是目标PostgreSQL 10实例缺少旧版本(9.6)中使用的PostGIS拓扑扩展库,pg_upgrade要求新旧实例的可加载库必须一致才能通过一致性检查。下面是具体的解决步骤:
步骤1:在PostgreSQL 10实例中安装对应版本的PostGIS拓扑库
你需要确保PG10的环境里安装了和PG9.6完全同版本的PostGIS(这里是2.3版本),因为pg_upgrade对扩展版本的匹配要求很严格。
包管理器安装(推荐)
根据你的操作系统选择对应的命令:
- Debian/Ubuntu:
sudo apt update sudo apt install postgresql-10-postgis-2.3 postgis - CentOS/RHEL:
sudo yum install postgis23_10
这些命令会自动把postgis_topology-2.3库文件部署到PG10的$libdir目录下。
源码编译安装(如果包管理器没有对应版本)
如果你需要手动编译,要确保编译时指定PG10的pg_config路径:
# 下载PostGIS 2.3源码包 wget https://download.osgeo.org/postgis/source/postgis-2.3.9.tar.gz tar -xvf postgis-2.3.9.tar.gz cd postgis-2.3.9 # 指定PG10的pg_config路径,比如/usr/lib/postgresql/10/bin/pg_config ./configure --with-pgconfig=/usr/lib/postgresql/10/bin/pgconfig make && sudo make install
步骤2:验证库文件是否存在
登录服务器,找到PG10的lib目录(通常路径是/usr/lib/postgresql/10/lib/),检查是否存在postgis_topology-2.3.so(Linux系统)或postgis_topology-2.3.dll(Windows系统):
ls /usr/lib/postgresql/10/lib/postgis_topology-2.3.so
如果输出文件名,说明库已经正确安装。
步骤3:确认新旧实例的PostGIS版本一致
登录旧的PostgreSQL 9.6实例,执行以下SQL查询,确认拓扑扩展的版本:
SELECT extname, extversion FROM pg_extension WHERE extname = 'postgis_topology';
确保查询结果的extversion是2.3.x,并且PG10中安装的PostGIS版本完全匹配。
步骤4:重新运行pg_upgrade一致性检查
完成上面的步骤后,重新执行pg_upgrade的检查命令(替换成你自己的路径参数):
pg_upgrade \ --old-datadir=/var/lib/postgresql/9.6/main \ --new-datadir=/var/lib/postgresql/10/main \ --old-bindir=/usr/lib/postgresql/9.6/bin \ --new-bindir=/usr/lib/postgresql/10/bin \ --check
如果检查通过,就可以正式执行升级了。
备选方案:临时卸载拓扑扩展(万不得已时使用)
如果实在无法安装对应版本的库,你可以先在旧实例中卸载postgis_topology扩展,完成升级后再重新创建:
- 登录PG9.6,对每个包含拓扑扩展的数据库执行:
DROP EXTENSION postgis_topology CASCADE; - 执行pg_upgrade完成升级。
- 登录PG10,重新创建拓扑扩展:
CREATE EXTENSION postgis_topology;
⚠️ 注意:这个方案会删除拓扑相关的对象,如果你需要保留拓扑数据,尽量优先用前面的安装库文件的方法。
内容的提问来源于stack exchange,提问作者Namrata Shilpi

