dlaczego pg_restore ignoruje --create? Błąd: nieudany: FATAL: baza danych „new_db” nie istnieje

16

Próbuję uruchomić następujące polecenie:

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

Dostaję:

failed: FATAL:  database "new_db" does not exist
andilabs
źródło

Odpowiedzi:

19

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.

SCO
źródło
6
Aby wyjaśnić: nie ma możliwości utworzenia dowolnej nazwy bazy danych i przywrócenia jej za pomocą 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 uruchomieniem pg_restore --dbname=new_db.
Luke
moje poleceniedocker-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
Dlaczego narzędzia muszą być mylące, skoro mogą być łatwe?
Augustin Riedinger
8

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.

lzap
źródło
Twoja pierwsza sugestia nie zadziałała w dniu 9.1:pg_restore: [archiver] -C and -c are incompatible options
peetasan
Mogę potwierdzić, że to działa (po edycji i po naprawieniu błędów pisowni „postgres”). pg_restore -C -d postgres db.dumpmoże wyglądać przerażająco, ale nie robi nic z bazą danych Postgres, używa go tylko do pierwszego połączenia.
Zilk,
0

Mówiąc ściślej, to, co zrobiłem, rozwiązało problem:

  1. 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.

  1. 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ć.

AntiPawn79
źródło
Podczas tworzenia kopii zapasowej za pomocą -Fopcji de musisz przywrócić kopię zapasową za pomocą pg_restore, chyba że używasz tego, -F pktóry tworzy zwykły plik tekstowy ze zdaniami sql.
EAmez