无法创建扩展 postgis,找不到 $libdir/postgis-2.1

Cannot CREATE EXTENSION postgis, $libdir/postgis-2.1 not found

我在使用 Debian Wheezy,并且安装了 PostgreSQL 9.3。 最近我安装了 Postgis 2.1.7,还有脚本包(63 个 .sql 文件总计 38.7 MB)

apt-get install postgresql-9.3-postgis-2.1

根据aptitude,一切都安装好了。但是,它似乎不起作用。安装后,这是我得到的错误:

CREATE EXTENSION postgis;
ERROR:  could not open extension control file "/usr/local/pgsql-9.3.2/share/extension/postgis.control": File or directory not found

使用查找,我发现它在另一个文件夹中:

root@server:/# find / -name postgis.control
/usr/share/postgresql/9.3/extension/postgis.control

我将文件复制到 /usr/local/pgsql-9.3.2/share/extension。然后错误变为:

ERROR: could not access file "$libdir/postgis-2.1": No such file or directory

这就是我似乎无能为力的地方。到目前为止我已经尝试过,但没有成功:

1- 编辑 postgis.control 并更改以下行。 CREATE EXTENSION 一直给出关于 $libdir

的相同错误
# module_pathname = '$libdir/postgis-2.1'
module_pathname = '/usr/local/pgsql-9.3.2/share/extension/'

2- 完全卸载 Postgis 并重新安装。什么都没有改变。

3- 创建指向 /usr/lib/postgresql/9.3/lib/postgis-2.1.so 的符号 link。同样的错误

4- 创建一个名为 libdir 的环境变量指向以下路径:

/usr/local/pgsql-9.3.2/share/extension/
/usr/share/postgresql/9.3/extension/
/usr/lib/postgresql/9.3/
/usr/lib/postgresql/9.3/lib

None 这些有效,错误消息一直是 "could not access $libdir/postgis"。我想指出的是,在最后一个上,我还尝试创建一个名为 postgis-2.1 的新文件夹并将 postgis-2.1.so 复制到其中,但无济于事。

我还有哪些选项可以使 postgis 正常工作?我忽略了什么?

EDIT1: 这是 dpkg -S psql

的结果
postgresql-client-9.3: /usr/share/locale/zh_TW/LC_MESSAGES/psql-9.3.mo
postgresql-client-9.3: /usr/share/locale/es/LC_MESSAGES/psql-9.3.mo
postgresql-client-9.3: /usr/share/locale/de/LC_MESSAGES/psql-9.3.mo
postgresql-client-9.3: /usr/share/locale/zh_CN/LC_MESSAGES/psql-9.3.mo
postgresql-client-9.3: /usr/share/locale/ru/LC_MESSAGES/psql-9.3.mo
postgresql-client-9.3: /usr/lib/postgresql/9.3/bin/psql
postgresql-client-9.3: /usr/share/locale/pt_BR/LC_MESSAGES/psql-9.3.mo
postgresql-client-9.3: /usr/share/postgresql/9.3/man/man1/psql.1.gz
postgresql-client-9.3: /usr/share/locale/pl/LC_MESSAGES/psql-9.3.mo
postgresql-client-9.3: /usr/share/locale/ja/LC_MESSAGES/psql-9.3.mo
postgresql-client-9.3: /usr/share/locale/fr/LC_MESSAGES/psql-9.3.mo
postgresql-client-9.3: /usr/share/locale/it/LC_MESSAGES/psql-9.3.mo
postgresql-client-9.3: /usr/share/locale/cs/LC_MESSAGES/psql-9.3.mo
bash-completion: /usr/share/bash-completion/completions/psql
postgresql-client-9.3: /usr/share/postgresql/9.3/psqlrc.sample
odbcinst1debian2:amd64: /usr/lib/x86_64-linux-gnu/odbc/libodbcpsqlS.so

EDIT2: 出于某种原因,这一行在 /home/postgres/.bashrc 文件中。建立数据库的人至少在2年前就离职了,所以我什至不能问 "why?":

export LD_LIBRARY_PATH=/usr/local/pgsql/lib:$LD_LIBRARY_PATH

移动 postgis-2.1.so 成功了 "work",但现在我面临另一个问题。

create extension postgis;
ERROR:  could not load library "/usr/local/pgsql-9.3.2/lib/postgis-2.1.so": /usr/local/pgsql-9.3.2/lib/postgis-2.1.so: undefined symbol: HeapTupleHeaderGetDatum

我正在寻找类似的问题,大多数似乎与 postgresql 9.3.3 或更低版本以及为 9.3.4 或更高版本设计的 postgis 有关。从 source/script 构建让我觉得升级我当前的 Postgres (9.3.2) 并不是一个简单的 apt-get 升级。

我会继续寻找解决方案,但如果有人能想到什么并愿意指点我,我将不胜感激。

由于我使用的 PostgreSQL 版本在从源代码安装时有一些自定义行,因此它几乎不受次要版本更新和扩展安装的影响。

我不得不停止服务,复制配置(postgresql.config 和 pg_hba.conf),卸载它并通过 apt-get 重新安装。

卸载

root@host:/home# wget http://ftp.postgresql.org/pub/source/v9.3.2/postgresql-9.3.2.tar.bz
root@host:/home# tar xfvz postgresql-9.3.2
root@host:/home# cd postgresql-9.3.2
root@host:/home/postgresql-9.3.2# ./configure -prefix=/usr/local/pgsql-9.3.2
root@host:/home/postgresql-9.3.2# make uninstall
root@host:/home/postgresql-9.3.2# apt-get install postgresql-9.3 postgresql-server-dev-9.3 postgresql-doc-9.3 postgresql-contrib-9.3 postgresql-client-9.3 postgresql-client-common postgresql-9.3-postgis-2.1

此后一切运行顺利,新版本立马识别旧数据库users/roles。我还成功执行了 CREATE EXTENSION postgis 而无需执行任何其他操作。

我遇到了同样的问题,我花了两天时间才解决。 我手动创建了一个新的 PostGIS.control 文件,并从 plpgsql.control 文件中复制了内容并放在上面。 然后它说我缺少postgis--1.0.sql。 我也这样做了,手动创建它并留空。

在做这一切之前,我只是 运行 "CREATE EXTENSION postgis;"