На установке PostgreSQL 12 / PostGIS 3.0 с MacPorts под MacOS, как использовать скрипт postgis_restore.pl? - PullRequest
1 голос
/ 07 апреля 2020

У меня есть бесплатная sh установка PostgreSQL 12 / PostGIS 3.0, сделанная с MacPorts под MacOS (Mojave), и я пытаюсь восстановить базу данных с поддержкой PostGIS с помощью традиционного сценария postis_restore.pl.

Сначала я создал пустую базу данных с включенной в нее PostGIS 3.0. Мой дамп базы данных приходит из Posgtres SQL 9.4 с PostGIS 2.5. Это было сделано в формате -F c.

Я пытаюсь:

perl /opt/local/share/postgresql12/contrib/postgis-3.0/postgis_restore.pl /Users/me/Documents/db/dump_file.dump | psql -h localhost -U postgres target_db 2>errors.txt

Я получаю следующий ответ:

Converting /Users/me/Documents/db/dump_file.dump to ASCII on stdout...
Reading list of functions to ignore...
Writing manifest of things to read from dump file...
Writing ASCII to stdout...
ALTER TABLE
ALTER TABLE
pg_restore: error: one of -d/--dbname and -f/--file must be specified
Done.
SELECT 8500
DELETE 8500
UPDATE 0
INSERT 0 8500
DROP TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE

Как решить:

pg_restore: error: one of -d/--dbname and -f/--file must be specified

Спасибо

Ответы [ 3 ]

1 голос
/ 07 апреля 2020

В PostgreSQL 12 поведение pg_restore было изменено так, чтобы оно требовало либо -f, либо -d. Ранее, если ни один из них не был указан, он выводил свой вывод на стандартный вывод, что теперь можно получить, указав -f -. Это было изменено, потому что многие люди были смущены старым поведением (хотя само изменение также сбивает с толку).

Очевидно, что postgis_restore.pl никогда не обновлялся, чтобы отразить это изменение. Вы должны быть в состоянии найти место, которое вызывает pg_restore, и добавить к нему -f -. Несмотря на то, что этот сценарий, по-видимому, никогда не тестировался, я бы с осторожностью использовал его без дальнейшей проверки.

0 голосов
/ 07 апреля 2020

Поскольку обновленная версия PostGIS 3 в данный момент недоступна в MacPorts, я исправил скрипт таким образом, и он решил мою проблему:

String

open( INPUT, "pg_restore -L $manifest $dumpfile

заменен

open( INPUT, "pg_restore -f - -L $manifest $dumpfile
0 голосов
/ 07 апреля 2020

Кажется, вы забыли, что в дампе может быть больше, чем база данных. Просто сообщите ту, которую вы хотите восстановить, даже если в вашем файле есть только одна база данных. Просмотр документации pg_restore также может помочь.

...