从PostgreSQL 9.3迁移到9.4,PostGIS

5
我升级了从PostgreSQL 9.3到9.4,现在我想迁移我的数据。
所以这是我尝试做的。首先我这样运行旧的PostgreSQL
/opt/pgsql-9.3/bin/pg_ctl -D /var/lib/postgres/data/ start

接着,我尝试将旧数据库导出到文件中:

/opt/pgsql-9.3/bin/pg_dumpall >> old_backup.sql

并且它告诉我:
pg_dump: [archiver (db)] query failed: ERROR:  could not access file "$libdir/postgis-2.1": No such file or directory

好的,我尝试找到postgis-2.1文件并将它们复制到libdir中。

find / -name "*postgis-2.1*"
/usr/lib/postgresql/rtpostgis-2.1.so
/usr/lib/postgresql/postgis-2.1.so
/usr/lib/postgresql/postgis-2.1 <-----

好的,现在什么是libdir呢?
/opt/pgsql-9.3/bin/pg_config --pkglibdir
/opt/pgsql-9.3/lib

所以我在 /opt/pgsql-9.3/lib 中创建了一个符号链接指向 /usr/lib/postgresql/postgis-2.1 目录,操作如下:

 pwd
/opt/pgsql-9.3/lib
ls -l postgis-2.1
postgis-2.1 -> /usr/share/postgresql/contrib/postgis-2.1

但我仍然收到错误提示:查询失败:错误:无法访问文件“$libdir/postgis-2.1”:没有那个文件或目录

我已经没有更多的想法了。也许有人可以帮忙吗?

我正在使用Arch Linux。

P.S:

Postgis 已经安装好了:

pacman -S postgis
warning: postgis-2.1.5-1 is up to date -- reinstalling

以下是二进制文件:

find / -name "*postgis-2.1*"
/usr/lib/postgresql/rtpostgis-2.1.so   <---- binary
/usr/lib/postgresql/postgis-2.1.so     <----- binary
/opt/pgsql-9.3/lib/postgis-2.1         <----- that's the symlink from earlier
/usr/share/postgresql/contrib/postgis-2.1

你在升级后尝试过运行pg_dump吗? - wildplasser
升级是使用 pg_upgrade 进行的吗?顺便问一下:在你用符号链接的共享库进行折腾后,是否运行了 ldconfig? - wildplasser
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Jenia Ivanov
好的,非常感谢您提供的ldconfig提示。我已经了解了它,但是我不确定在这种情况下应该如何使用它,而且我也不敢尝试。您能否告诉我在这些特定情况下应该如何运行它? - Jenia Ivanov
通常情况下,作为root用户执行ldconfig或者ldconfig -v以获取更多详细信息。你的.so文件应该会在输出中显示出来(如果没有显示,则说明你的配置文件存在问题)。我不知道pacman。 - wildplasser
3个回答

9

我有类似的问题,但是解决方法略有不同:

dbname=#\dx

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


dbname=#ALTER EXTENSION postgis UPDATE TO '2.2.0';
dbname=#\dx

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

1
刚刚从2.1.7升级到了OS X(Homebrew)上的PostGIS 2.2.0,这个解决方案对我很有用。谢谢! - Geoff
1
这是升级已安装在数据库中的postgis扩展的官方方法,因此应优先考虑该方法而非其他回答。 - Mauricio Pasquier Juan

5
符号链接指向“share”文件,用于 CREATE EXTENSION 和相关操作。您需要做的是将 .so 文件指向由 pg_config --pkglibdir 返回的目录:
$ rm /opt/pgsql-9.3/lib/postgis-2.1 # it is a wrong link, so undo it
$ ln -s /usr/lib/postgresql/postgis-2.1.so /opt/pgsql-9.3/lib/

现在,PostGIS的.so文件将位于"$libdir"中,您将能够执行pg_dumpall
当然,保持这种方式并不是我认为理智的设置,但是由于您正在升级,我假设这只是一个中间状态,之后您将完全删除PostgreSQL 9.3。您还必须验证PostGIS是否链接到9.3库,如果没有,您可能会遇到一些问题。

0

我曾经遇到过同样的问题。我的Docker解决方案如下:

docker exec -i $(docker-compose ps -q postgis) ln -s /usr/lib/postgresql/9.6/lib/postgis-2.3.so /usr/lib/postgresql/9.6/lib/postgis-2.1.so

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接