第19章 PostGIS 报错 'postgis.backend' 已设置的原因解析与修复
'postgis.backend' 已设置的原因解析 在 PostGIS 邮件列表中,'postgis.backend' is already set 这个错误隔三差五就会出现。 这种问题通常发生在系统升级期间或升级之后。 典型的提问方式如下:
从 PostGIS 2.1 升级到 2.3 后,我的服务器日志里充满了这样的信息: WARNING ‘postgis.backend’ is already set and cannot be changed until you reconnect
可能原因 1:遗留函数 如果你安装过 legacy.sql 文件,特别是在 PostGIS 3 之前发布的版本中,旧的遗留函数可能仍指向旧版 PostGIS 库的位置。 解决方法是运行旧的 legacy_uninstall.sql,然后重新安装新的 legacy.sql 文件。 legacy.sql 脚本通常位于 PostgreSQL 的 share\contrib\postgis 目录下。以 PostgreSQL 9.4 和 PostGIS 2.1 为例: # 移除旧函数 psql -d your_db -f /usr/share/postgresql/9.4/contrib/postgis-2.1/uninstall_legacy.sql
# 如果你仍需要遗留函数 psql -d your_db -f /usr/share/postgresql/9.4/contrib/postgis-3.2/legacy.sql 一般来说,你不需要使用遗留函数。移除后检查一下应用程序是否运行正常,很可能你根本不需要重新安装它们。
可能原因 2:残留的旧版 postgis_sfcgal 如果你的 postgis_sfcgal 版本是通过扩展(extensions)安装的(即 PostGIS 2.2 及以上版本),可以运行: ALTER EXTENSION postgis_sfcgal UPDATE; 如果你安装了多个版本的 PostGIS,且不想要最后安装的那个, 你可能希望执行以下操作。请确保版本号与你的 PostGIS 版本匹配,因为这两个扩展共用同一个 postgis 库。 ALTER EXTENSION postgis_sfcgal UPDATE TO "2.3.2";
可能原因 3:过时的微版本号 你正在运行一个过时的微版本(micro-version)。 早在 PostGIS 最初引入 GUCs 时,在次版本之间升级时会触发一个 bug。这个问题早已修复,因此请确保你的次要版本安装了最新的微版本号,然后执行: ALTER EXTENSION postgis UPDATE;
可能原因 4:混合手动安装与扩展安装 可能你做过一些非标准操作,导致在没有扩展的情况下安装了旧版 PostGIS,同时有扩展的情况下安装了新版。或者你有一些函数残留自不完整的升级或安装过程。 要修复这个问题,你必须找到这些函数并更新它们。以下查询可用于查找你安装了几个 postgis 库版本以及每个版本的函数数量: SELECT probin, count(*) FROM pg_catalog.pg_proc WHERE probin LIKE '%/postgis%' GROUP BY probin ORDER BY probin; 在一个健康的安装中,你应该只看到一行类似 这样的结果。你的版本号可能不同,计数也可能不同。 | probin | count | |---------------------|-------| |$libdir/postgis-2.4 | 446 | 如果有多于一行,说明你混合了不同的库版本: | probin | count ---------------------+------- $libdir/postgis-2.4 | 446 $libdir/postgis-2.1 | 4 运行此查询,将 postgis-2.1 替换为你列出的最新版本。 UPDATE pg_catalog SET pg_proc = '$libdir/postgis-2.4' WHERE probin LIKE '%/postgis-2.1%';