我正在使用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镜像我将恢复到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.sql
(C:\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的问题,而是听起来像是安装程序问题。
答案 0 :(得分:0)
pg_dump不会更改这些值。它只是按原样从数据库中转储它们。如果使用绝对路径创建函数,则将使用绝对路径转储它们。这是有道理的,因为libdir可能会随着时间而改变,你不希望PostgreSQL 假设你想要改变位置只是因为你在当时碰巧是libdir的时候创建了它们。
这里的问题必须在别的地方。我希望Stackbuilder这样做,以便它可以确保加载它打包的版本。这当然会降低可移植性。