Odpowiedzi:
Jest tak, ponieważ tak działa pg_restore.
Instrukcja pg_restore brzmi następująco:
-C, --create Utwórz bazę danych przed jej przywróceniem. Jeśli podano również opcję --clean, usuń i ponownie utwórz docelową bazę danych przed nawiązaniem z nią połączenia.
Gdy ta opcja jest używana, baza danych o nazwie -d jest używana tylko do wydawania początkowych poleceń DROP DATABASE i CREATE DATABASE . Wszystkie dane są przywracane do nazwy bazy danych, która pojawia się w archiwum .
Opcja -d przywróci w podanej bazie danych tylko wtedy, gdy nie użyto opcji -C. W przypadku użycia opcji -C baza danych jest używana jako „starter”, a nie jako miejsce docelowe.
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"'
Krótko mówiąc, chcesz albo (wyczyścić istniejące): (zwróć uwagę, że nazwa bazy danych to postgres
)
pg_restore -c -d postgres db.dump
lub (utwórz nowy)
pg_restore -C -d postgres db.dump
lub (utwórz nowe jawnie)
createdatabase the_database
pg_restore -d the_database db.dump
Zobacz więcej informacji SCO.
pg_restore: [archiver] -C and -c are incompatible options
pg_restore -C -d postgres db.dump
może wyglądać przerażająco, ale nie robi nic z bazą danych Postgres, używa go tylko do pierwszego połączenia.
Mówiąc ściślej, to, co zrobiłem, rozwiązało problem:
Utwórz pustą bazę danych z żądaną nazwą: (w moim przypadku nazwa użytkownika to „postgres”)
psql -U [username]
Następnie wyświetli monit o podanie hasła. W tym momencie zostaniesz zalogowany jako [nazwa użytkownika]. Wpisz następujące polecenie:
CREATE DATABASE [dbname];
Teraz zakończ sesję i wróć do swojej zwykłej sesji terminalowej.
Przywróć bazę danych z pliku, w którym ustawiono docelową nazwę bazy danych jako właśnie utworzoną nazwę bazy danych.
cat [your_file_path/filename] | psql -U [username] [dbname]
Gdzie [ścieżka_pliku / nazwa pliku] to lokalizacja pliku db lub pliku tekstowego, który chcesz przywrócić.
-F
opcji de musisz przywrócić kopię zapasową za pomocą pg_restore, chyba że używasz tego, -F p
który tworzy zwykły plik tekstowy ze zdaniami sql.
pg_restore
. Opcja -C może tworzyć tylko bazę danych, której nazwa odpowiada nazwie bazy danych w pliku zrzutu. Aby przywrócić do dowolnej bazy danych, musisz uruchomićCREATE DATABASE new_db;
w psql przed uruchomieniempg_restore --dbname=new_db
.