Я использую 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, а скорее похоже на проблему с установщиком.