创建 template_postgis 时无法访问文件“$libdir/plpgsql”

could not access file "$libdir/plpgsql" while creating template_postgis

我已经在我的 Mac 上安装了 PostgreSQL 和 Postgis,当时它是 9.3 和 2.1,但从未使用过。 将 pg 升级到 4.5_2 并将 postgis 升级到 2.2(现在最新的)后,我尝试构建我的第一个基于 postgis 的应用程序并像这样创建 template_postgis:

createdb template_postgis
psql -d template_postgis -f /usr/local/share/postgis/postgis.sql

并得到这个错误:

SET
BEGIN
psql:/usr/local/share/postgis/postgis.sql:77: ERROR:  could not access file "$libdir/plpgsql": No such file or directory
...

所以我 运行 pg_config --libdir 它说 /usr/local/libpg_config --pkglibdir returns /usr/local/lib/postgresql。 而且我发现pkglibdir下的plpgsql.so不是libdir, 所以我在 libdir 下创建了一个名为 plpgsql.so 的符号 link 和另一个 plpgsql,但它仍然不起作用。

真正的问题是什么?我该如何解决这个问题?

我的 Mac 是 运行 最新的 OS X 10.11,它们都是通过自制软件安装和升级的。

更新: 受@Stefan D. 的启发,我 运行 psql -c "\dx" 列出所有已安装的扩展,结果:

  Name   | Version |   Schema   |                             Description
---------+---------+------------+---------------------------------------------------------------------
 plpgsql | 1.0     | pg_catalog | PL/pgSQL procedural language
 postgis | 2.1.7   | public     | PostGIS geometry, geography, and raster spatial types and functions

于是我运行ALTER EXTENSION postgis UPDATE TO "2.2.0";手动更新了postgis的版本,却又报错:could not open extension control file "/usr/local/Cellar/postgresql/9.4.5/share/postgresql/extension/postgis.control": No such file or directory.

这是有线的,因为我的 PostgreSQL 安装在 /usr/local/Cellar/postgresql/9.4.5_2/postgis.control 也没有列在 /usr/local/Cellar/postgresql/9.4.5_2/share/postgresql/extension/ 中。

定位后发现.control个文件在/usr/local/share/postgresql/extension/.

中都有一个符号link

巧合:我遇到了类似的问题,正在寻找解决方案时发现了您的问题。

我也在几天前更新了我的 postgresql/postgis 安装,当我想使用我的数据库(我在更新之前创建的)时,我今天遇到了一个类似于你的错误(对我来说是找不到postgis 2.1库)

与此同时我可以修复它。这是我的做法:

我的问题是:数据库是用旧 Postgresql/postgis 版本设置的。它仍然在寻找旧的图书馆。您可以使用以下命令列出所有扩展来检查这一点:

psql --username=gisuser --dbname=gis -c "\dx"

对我来说,这给了我这个输出:

                                         List of installed extensions
       Name       | Version |   Schema   |                             Description                             
------------------+---------+------------+---------------------------------------------------------------------
 plpgsql          | 1.0     | pg_catalog | PL/pgSQL procedural language
 postgis          | 2.1.7   | public     | PostGIS geometry, geography, and raster spatial types and functions
 postgis_topology | 2.1.7   | topology   | PostGIS topology spatial types and functions
(3 rows)

如您所见,postgispostgis_topology 扩展版本 (2.1.7) 不适合我安装的版本 (2.2.0) 为了解决这个问题,我执行了以下命令来更新扩展版本:

psql --username=gisuser --dbname=gis -c "ALTER EXTENSION postgis UPDATE;"
psql --username=gisuser --dbname=gis -c "ALTER EXTENSION postgis_topology UPDATE;"

您可能需要稍微更改一下命令(用户名、数据库和要更新的扩展名)

检查它是否再次适用于: psql --username=gisuser --dbname=gis -c "\dx"

现在输出是:

                                         List of installed extensions
       Name       | Version |   Schema   |                             Description                             
------------------+---------+------------+---------------------------------------------------------------------
 plpgsql          | 1.0     | pg_catalog | PL/pgSQL procedural language
 postgis          | 2.2.0   | public     | PostGIS geometry, geography, and raster spatial types and functions
 postgis_topology | 2.2.0   | topology   | PostGIS topology spatial types and functions
(3 rows)

(注意 postgispostgis_topology 的更改版本号)

可能您已经在 Mac.

上安装了 多个 Postgres 实例

当您执行 pg_config --pkglibdir 时,确保它是与您的安装相关联的那个。 运行:

which pg_config

最后,我弄清楚了导致这个问题的原因:虽然我的Mac上只安装了一个postgres,但是有两个个postgres退出!

真正发生的是我在没有关闭的情况下升级了postgres程序,brew也没有,所以我在本地安装了一个postgres 9.4。5_2并且内存中有一个旧的!

所以解决方案非常简单:关闭旧的并启动新安装的 postgres!

无论如何,感谢您的帮助!