почему pg_restore игнорирует --create? Ошибка: сбой: FATAL: база данных «new_db» не существует

16

Я пытаюсь выполнить следующую команду:

sshpass  -p "pass" ssh  x@1.2.3.4 "pg_dump -Fc -U foo some_db" | pg_restore --create --dbname=new_db

Я получил:

failed: FATAL:  database "new_db" does not exist
andilabs
источник

Ответы:

19

Это потому, что так работает pg_restore.

Руководство pg_restore гласит следующее:

-C, --create Создать базу данных перед ее восстановлением. Если также указан параметр --clean, удалите и заново создайте целевую базу данных перед подключением к ней.

Когда используется эта опция, база данных с именем -d используется только для выдачи начальных команд DROP DATABASE и CREATE DATABASE . Все данные восстанавливаются в имени базы данных, которое появляется в архиве .

-D восстановит в данной базе данных, если и только если -C не используется. Если используется -C, база данных используется как «панель запуска», а не как место назначения.

ШОС
источник
6
Чтобы уточнить: нет никакого способа создать произвольное имя базы данных и восстановить его с помощью pg_restore. Опция -C может создать только базу данных, имя которой совпадает с именем базы данных в файле дампа. Чтобы восстановить произвольную базу данных, вы должны запустить CREATE DATABASE new_db;psql перед запуском pg_restore --dbname=new_db.
Люк
моя командаdocker-compose -p dump_import -f docker/dump_import.yml run --rm be bash -c 'waitforit -host=postgres -port=5432 -timeout=30 && export PGPASSWORD=$DATABASE_PASSWORD && createdb --echo --port=$DATABASE_PORT -host=$DATABASE_HOST --username=$DATABASE_USER $DATABASE_NAME && pg_restore --format=c --dbname=$DATABASE_URL_WITHOUT_QUERY tmp/full.dump && echo "Import done"'
srghma
5
Почему инструменты должны сбивать с толку, когда они могут быть легкими?
Августин Ридингер
8

Короче говоря, вы хотите (очистить существующий): (обратите внимание, имя базы данных postgres)

pg_restore -c -d postgres db.dump

или (создать новый)

pg_restore -C -d postgres db.dump

или (создать новое явно)

createdatabase the_database
pg_restore -d the_database db.dump

Посмотрите, что сказал SCO для более подробной информации.

lzap
источник
Ваше первое предложение не сработало на 9.1:pg_restore: [archiver] -C and -c are incompatible options
peetasan
Я могу подтвердить, что это работает (после редактирования и после исправления орфографической ошибки "postgres"). pg_restore -C -d postgres db.dumpможет показаться пугающим, но он ничего не делает с базой данных postgres, он использует ее только для первоначального подключения.
Зилк
0

Чтобы быть более ясным, это то, что я сделал, чтобы решить эту проблему для меня:

  1. Создайте пустую базу данных с нужным именем: (в моем случае имя пользователя было «postgres»)

    psql -U [username]

Затем вам будет предложено ввести пароль. На этом этапе вы будете зарегистрированы как [имя пользователя]. Введите следующее:

    CREATE DATABASE [dbname];

Теперь выйдите из сеанса и вернитесь к своему обычному терминальному сеансу.

  1. Восстановите базу данных из файла, для которого вы задали имя целевой базы данных как имя базы данных, которое вы только что создали.

    cat [your_file_path/filename] | psql -U [username] [dbname]

Где [your_file_path / filename] - это местоположение файла БД или текстового файла, который вы хотите восстановить.

AntiPawn79
источник
При создании резервной копии с использованием -Fопции de вы должны использовать pg_restore для восстановления резервной копии, если только вы не используете, -F pкоторая создает простой текстовый файл с предложениями sql.
EAmez