pg_dump没有在Linux上使用$ libdir用于postgis

时间:2011-03-14 15:52:39

标签: postgresql postgis

我正在使用pg_dump备份包含几GB预先计算的静态地理数据的PostgreSQL(9.0.3)+ PostGIS(1.5.2)数据库。 PostGIS功能包含在输出文件中。

在Linux上,纯文本.SQL输出如下所示:

CREATE FUNCTION geography_out(geography) RETURNS cstring
    LANGUAGE c IMMUTABLE STRICT
    AS '/opt/PostgreSQL/9.0/lib/postgis-1.5', 'geography_out';

在Windows上,相同的.SQL文件包含:

CREATE FUNCTION geography_out(geography) RETURNS cstring
    LANGUAGE c IMMUTABLE STRICT
    AS '$libdir/postgis-1.5', 'geography_out';

在这两种情况下,运行pg_config都会显示LIBDIR

的正确值
  • Linux: LIBDIR = /opt/PostgreSQL/9.0/lib
  • Windows: LIBDIR = C:/PROGRA~2/POSTGR~1/9.0/lib

不能保证Linux镜像我将恢复到Postgres安装在完全相同的位置。是否可以强制Linux上的pg_dump使用$libdir

更新

在这两种情况下,9.0.3-1 PostgreSQL安装程序都是从EnterpriseDB下载的。 PostGIS是使用随安装附带的StackBuilder工具安装的。

standard PostGIS instructions

之后创建了启用空间的数据库
createdb mydb
createlang plpgsql mydb
psql -d mydb -f postgis.sql
psql -d mydb -f spatial_ref_sys.sql

有趣的是......在Windows上,文件postgis.sqlC:\Program Files (x86)\PostgreSQL\9.0\share\contrib\postgis-1.5\postgis.sql):

CREATE OR REPLACE FUNCTION geography_out(geography)
    RETURNS cstring
    AS '$libdir/postgis-1.5','geography_out'
    LANGUAGE 'C' IMMUTABLE STRICT; 

在Linux上(/opt/PostgreSQL/9.0/share/postgresql/contrib):

CREATE OR REPLACE FUNCTION geography_out(geography)
    RETURNS cstring
    AS '/opt/PostgreSQL/9.0/lib/postgis-1.5','geography_out'
    LANGUAGE 'C' IMMUTABLE STRICT;

因此,创建PostGIS函数的PostGIS SQL文件在Windows上使用$libdir,但在Linux上使用完整路径。这不是pg_dump的问题,而是听起来像是安装程序问题。

1 个答案:

答案 0 :(得分:0)

pg_dump不会更改这些值。它只是按原样从数据库中转储它们。如果使用绝对路径创建函数,则将使用绝对路径转储它们。这是有道理的,因为libdir可能会随着时间而改变,你不希望PostgreSQL 假设你想要改变位置只是因为你在当时碰巧是libdir的时候创建了它们。

这里的问题必须在别的地方。我希望Stackbuilder这样做,以便它可以确保加载它打包的版本。这当然会降低可移植性。