pg_dump не использует $ libdir в Linux для postgis - PullRequest
1 голос
/ 14 марта 2011

Я использую pg_dump для резервного копирования базы данных 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 будет установлен точно в том же месте. Можно ли заставить pg_dump в Linux использовать $libdir?

Обновление:

В обоих случаях 9.0.3-1 Установщики PostgreSQL были загружены с EnterpriseDB . PostGIS был установлен с помощью инструмента StackBuilder, поставляемого вместе с установкой.

Пространственная база данных была создана в соответствии со стандартными инструкциями PostGIS :

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;

Итак, файлы SQL PostGIS, которые создают функции PostGIS, используют $libdir в Windows, но полный путь в Linux. Это не проблема с pg_dump, а скорее похоже на проблему с установщиком.

1 Ответ

0 голосов
/ 21 марта 2013

pg_dump не меняет эти значения. Он просто сбрасывает их из базы данных, как они есть. Если вы создали функции с абсолютными путями, они будут сброшены с абсолютными путями. Это имеет смысл, поскольку со временем libdir может меняться, и вы не хотите, чтобы PostgreSQL предполагал , вы хотите, чтобы местоположения менялись только потому, что вы создали их в том, что в то время было libdir.

Проблема здесь должна быть где-то еще. Я ожидаю, что Stackbuilder делает это так, чтобы он мог гарантировать, что версии, с которыми он упакован, загружены. Это уменьшает мобильность, конечно.

...