pg_dump und pg_restore: Eingabedatei scheint kein gültiges Archiv zu sein

66

Ich habe pg_dump auf einem Computer verwendet und die Ergebnisdatei in eine andere kopiert, wo ich versucht habe, sie wiederherzustellen. Ich glaube, das Schema ist dasselbe. Ich bekomme jedoch:

pg_restore: [archiver] input file does not appear to be a valid archive

Ich habe folgende Operationen durchgeführt:

pg_dump -a -f db.txt dbname

und:

pg_restore -a -d dbname db.txt

Was könnte falsch sein?

gruszczy
quelle
Versuchen Sie, den Speicherauszug auf demselben Computer zu importieren, auf dem er erstellt wurde. Überprüfen Sie auch die Postgres-Versionen.
Hank Gay
Ich kann nicht versuchen, es auf demselben Computer zu importieren, da es sich um einen Produktionscomputer handelt. Irgendeine Idee, was kann ich sonst noch tun?
Gruszczy
Diese Lösung ist möglicherweise auch für einige Benutzer
Muhammad Hannan

Antworten:

93

Sie speichern im einfachen SQL-Format, das für die Eingabe in psql entwickelt wurde. Dies wird von pg_restore nicht erkannt.

cat db.txt | psql dbname

sollte den Trick machen

Peter Tillemans
quelle
5
oder psql dbname < db.txt;)
Aleksey Deryagin
26

pg_dumpStandardmäßig werden die SQL-Befehle erstellt, die zum erneuten Erstellen der Daten erforderlich sind. Um es wiederherzustellen, müssen Sie nur die Datei als Eingabe aufrufen psql(nicht pg_restore). pg_restoreist nur für das binäre (nicht standardmäßige und weniger übliche nicht empfohlene ) Format von zu verwenden pg_dump. Lesen Sie die Dokumente .

Update: Die pg_dumpBinärformate ( -Fc -Ft), die verwendet werden sollen, pg_restoresind in Ordnung und bieten zusätzliche Flexibilität. Aber sie sind weniger standardisiert (nicht SQL), weniger geeignet für den Import aus einigen Tools (z. B. einem PHP-Frontend) oder die Bearbeitung mit einem Texteditor und ein bisschen weniger portabel für andere Versionen und sogar andere Datenbanken. Für Backups würde ich mich an das normale Standardformat halten. In anderen Szenarien kann die Option binary + pg_restore gleich oder passender sein.

Beachten Sie , dass in Postgresql im typischen Szenario die Sicherung normalerweise durch pg_dump ( normal ) und die Wiederherstellung mit dem Standardbefehlszeilenclient ( psql ) erfolgt.

Leonbloy
quelle
2
[OT] Ich möchte hinsichtlich des "nicht empfohlenen" Status des benutzerdefinierten Ausgabeformats streiten - der Satz "Dies ist das flexibelste Format, in dem das Nachbestellen von Ladedaten sowie Objektdefinitionen möglich ist ..." aus dem Handbuch scheint für mich eine ziemliche Bestätigung.
Milen A. Radev
"nicht empfehlenswert" war eine Übertreibung, da stimme ich zu. "Am flexibelsten" bedeutet jedoch nicht unbedingt "Am empfehlenswertesten". Geklärt.
Leonbloy
13

Versuchen Sie, die --format=cOption an zu übergeben pg_dump. Dadurch kann es pg_restorewiederhergestellt werden.

psmears
quelle
Würde jemand, der dies modifiziert hat, gerne erklären, warum? Die akzeptierte Antwort erklärt, dass dies funktionieren wird :-)
@skrafi: Was ist dein Punkt?
Psmears
1
Entschuldigung, Kopie eingefügt falsche Ausgabe, die richtige ist, pg_restore: [archiver] did not find magic string in file headerso dass dies nicht für einfache SQL-Dump
funktioniert
@skrafi: Ich bin mir nicht sicher, was du meinst. Wenn Sie verwenden pg_dump --format=c ...> archivefile, und verwenden Sie dann pg_restoreauf archivefile, dann (zumindest , wenn ich es gerade getestet) es funktioniert gut. Vielleicht ist Ihre Datei irgendwie beschädigt? Oder haben Sie einen bestimmten Fehler gefunden?
Psmears
6

Dies ist, was ich tun würde, um meine alte Datenbank zu sichern und wiederherzustellen

So sichern Sie Ihre Datenbank

pg_dump --format=c olddb_name > db_dump_file.dump

So stellen Sie diese Sicherung wieder her

pg_restore -v -d newdb_name db_dump_file.dump

Lesen Sie mehr über pg_dump und pg_restore

Techie
quelle
5

Für Windows-Benutzer versuchen

type db.txt | psql --username="YOURNAME" dbname

Klappt wunderbar


quelle
Das hat mich gerettet, danke! Sollte zumindest für Windows Antwort akzeptiert werden.
Daniel Butler
2

Sie können etwas mit dem MySQL- SOURCEBefehl tun :

psql dbname

Dann im Postgresql-Terminal:

\i filename
greg0ire
quelle
2

cat dumpFileName | psql -h ip -d Datenbankname -U Benutzername -W

Mayank Raipure
quelle
1
In der Regel ist es hilfreich, wenn Sie erklären, was dies bewirkt und warum es möglicherweise hilfreich ist.
Falcon Momot
1

Diese Fehlermeldung könnte auch bedeuten, dass tatsächlich etwas mit der Sicherungsdatei (oder Ihren Vermutungen dazu) nicht stimmt.

In einem Fall hatte ich eine Sicherungsdatei in einen Docker-Container eingehängt und versucht, sie wiederherzustellen, dies schlug jedoch fehl does not appear to be a valid archive. Tatsächlich war die Datei leer, weil das Mounten nicht korrekt durchgeführt wurde.

Dag Høidahl
quelle