Ответы:
Это потому, что так работает pg_restore.
Руководство pg_restore гласит следующее:
-C, --create Создать базу данных перед ее восстановлением. Если также указан параметр --clean, удалите и заново создайте целевую базу данных перед подключением к ней.
Когда используется эта опция, база данных с именем -d используется только для выдачи начальных команд DROP DATABASE и CREATE DATABASE . Все данные восстанавливаются в имени базы данных, которое появляется в архиве .
-D восстановит в данной базе данных, если и только если -C не используется. Если используется -C, база данных используется как «панель запуска», а не как место назначения.
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"'
Короче говоря, вы хотите (очистить существующий): (обратите внимание, имя базы данных 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 для более подробной информации.
pg_restore: [archiver] -C and -c are incompatible options
pg_restore -C -d postgres db.dump
может показаться пугающим, но он ничего не делает с базой данных postgres, он использует ее только для первоначального подключения.
Чтобы быть более ясным, это то, что я сделал, чтобы решить эту проблему для меня:
Создайте пустую базу данных с нужным именем: (в моем случае имя пользователя было «postgres»)
psql -U [username]
Затем вам будет предложено ввести пароль. На этом этапе вы будете зарегистрированы как [имя пользователя]. Введите следующее:
CREATE DATABASE [dbname];
Теперь выйдите из сеанса и вернитесь к своему обычному терминальному сеансу.
Восстановите базу данных из файла, для которого вы задали имя целевой базы данных как имя базы данных, которое вы только что создали.
cat [your_file_path/filename] | psql -U [username] [dbname]
Где [your_file_path / filename] - это местоположение файла БД или текстового файла, который вы хотите восстановить.
-F
опции de вы должны использовать pg_restore для восстановления резервной копии, если только вы не используете, -F p
которая создает простой текстовый файл с предложениями sql.
pg_restore
. Опция -C может создать только базу данных, имя которой совпадает с именем базы данных в файле дампа. Чтобы восстановить произвольную базу данных, вы должны запуститьCREATE DATABASE new_db;
psql перед запускомpg_restore --dbname=new_db
.