warum ignoriert pg_restore --create? Fehler: fehlgeschlagen: FATAL: Die Datenbank "new_db" existiert nicht

16

Ich versuche folgenden Befehl auszuführen:

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

Ich bekomme:

failed: FATAL:  database "new_db" does not exist
andilabs
quelle

Antworten:

19

Dies liegt daran, dass pg_restore auf diese Weise funktioniert.

Das Handbuch von pg_restore lautet wie folgt:

-C, --create Erstellt die Datenbank vor dem Wiederherstellen. Wenn auch --clean angegeben ist, löschen Sie die Zieldatenbank und erstellen Sie sie erneut, bevor Sie eine Verbindung herstellen.

Wenn diese Option verwendet wird, wird die mit -d bezeichnete Datenbank nur zur Ausgabe der ersten Befehle DROP DATABASE und CREATE DATABASE verwendet . Alle Daten werden in dem Datenbanknamen wiederhergestellt, der im Archiv angezeigt wird .

Das -d wird in der angegebenen Datenbank nur dann wiederhergestellt, wenn -C nicht verwendet wird. Wenn -C verwendet wird, wird die Datenbank als "Launchpad" und nicht als Ziel verwendet.

SCO
quelle
6
Zur Verdeutlichung: Es gibt keine Möglichkeit, einen beliebigen Datenbanknamen zu erstellen und mit wiederherzustellen pg_restore. Mit der Option -C kann nur eine Datenbank erstellt werden, deren Name mit dem Datenbanknamen in der Sicherungsdatei übereinstimmt. Um eine Wiederherstellung in einer beliebigen Datenbank CREATE DATABASE new_db;durchzuführen , müssen Sie vor der Ausführung psql ausführen pg_restore --dbname=new_db.
Luke
Mein Befehldocker-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
Warum müssen Werkzeuge verwirrend sein, wenn sie auch einfach sein können?
Augustin Riedinger
8

Kurz gesagt, Sie möchten entweder (vorhandene bereinigen): (Beachten Sie, dass der Datenbankname ist postgres)

pg_restore -c -d postgres db.dump

oder (neu erstellen)

pg_restore -C -d postgres db.dump

oder (explizit neu anlegen)

createdatabase the_database
pg_restore -d the_database db.dump

Sehen Sie, was SCO für weitere Details gesagt hat.

lzap
quelle
Dein erster Vorschlag hat am 9.1. Nicht funktioniert:pg_restore: [archiver] -C and -c are incompatible options
peetasan
Ich kann bestätigen, dass dies funktioniert (nach der Bearbeitung und nach dem Beheben der Rechtschreibfehler von "Postgres"). pg_restore -C -d postgres db.dumpmag beängstigend aussehen, aber es hat nichts mit der postgres-Datenbank zu tun, sondern verwendet sie nur für die anfängliche Verbindung.
Zilk
0

Um es etwas genauer auszudrücken, dies ist das, was ich getan habe, um das Problem für mich zu lösen:

  1. Erstellen Sie eine leere Datenbank mit dem gewünschten Namen: (in meinem Fall war der Benutzername 'postgres')

    psql -U [username]

Sie werden dann zur Eingabe Ihres Passworts aufgefordert. An diesem Punkt werden Sie als [Benutzername] angemeldet. Geben Sie Folgendes ein:

    CREATE DATABASE [dbname];

Beenden Sie nun die Sitzung und kehren Sie zu Ihrer regulären Terminalsitzung zurück.

  1. Stellen Sie die Datenbank aus der Datei wieder her, in der Sie den Namen der Zieldatenbank als den gerade erstellten Datenbanknamen festgelegt haben.

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

Dabei ist [Ihr_Dateipfad / Dateiname] der Speicherort der DB-Datei oder Textdatei, die Sie wiederherstellen möchten.

Donald Vetal
quelle
Wenn Sie das Backup mit der -FOption de erstellen, müssen Sie pg_restore verwenden, um das Backup wiederherzustellen, es sei denn, Sie verwenden -F p, um eine Nur-Text-Datei mit SQL-Sätzen zu erstellen.
EAmez