2015-08-21 2 views
7

Wenn pg_restore --clean --dbname=my_database backup_file.sql läuft eine Datenbanksicherung auf eine leere Datenbank wiederherzustellen, gelingt die Wiederherstellung, aber mit der folgenden Warnmeldung:Wie kann ich zuverlässig feststellen, ob pg_restore erfolgreich war, wenn der Erfolg manchmal zu einem Exit-Code von 1 führt?

pg_restore: [archiver (db)] Error while PROCESSING TOC: 
pg_restore: [archiver (db)] Error from TOC entry 161; 1259 16549 TABLE example_table root 
pg_restore: [archiver (db)] could not execute query: ERROR: table "example_table" does not exist 
    Command was: DROP TABLE public.example_table; 

WARNING: errors ignored on restore: 1 

Als die Nachricht anzeigt, gelang es der wieder herstellen. Es gab Fehler, aber pg_restore behauptet, sie ignoriert zu haben. Ich war auch in der Lage, die Datenbank manuell abzufragen, um zu überprüfen, dass alle Daten, von denen ich erwartete, dass sie in dem Speicherabzug vorhanden waren, nach der Wiederherstellung in der Datenbank vorhanden waren.

Das Problem ist der oben genannte Befehl mit einem Status von 1, nicht 0. Bei der Durchführung von Datenbankwiederherstellungen programmgesteuert (wie ich vorhabe, wenn ich diesen Prozess automatisiere), ist dies problematisch, da mein Skript dazu in der Lage sein muss zuverlässig feststellen, ob die Wiederherstellung erfolgreich war oder nicht

Gibt es eine Möglichkeit, pg_restore Warnungen zu ignorieren, wenn es seinen Ausgangsstatus feststellt? Oder gibt es eine alternative Methode zu pg_restore Ich kann verwenden, dass ich genauere Erfolgs-/Fehlerinformationen von bekommen kann? Wie kann ich die Datenbank wiederherstellen und programmatisch feststellen, ob die Wiederherstellung erfolgreich war?

Beachten Sie, dass ich derzeit PostgreSQL 9.1 verwende.

Antwort

8

Es stellt sich heraus, dass Postgres nicht wirklich weiß, dass der in der Frage erwähnte Fehler relativ harmlos ist; deshalb wird der Fehler nicht ignoriert. Der Grund pg_restore ignoriert diesen Fehler tatsächlich, weil pg_restore standardmäßig so konfiguriert ist, dass fast alle Fehler ignoriert werden, die während des Wiederherstellungsvorgangs auftreten. Wenn Sie sich für den Erfolgs-/Fehlerstatus der Wiederherstellung interessieren, ist dies wahrscheinlich nicht das gewünschte Verhalten. Die Ausführung von pg_restore mit den Optionen --exit-on-error oder --single-transaction wird Abhilfe schaffen, wird aber auch dazu führen, dass Postgres den Fehler in der obigen Frage als einen vollständigen fatalen Fehler behandelt, nicht nur als Warnung (weil er wiederum nicht weiß, dass es in Ordnung ist) dieser bestimmte Befehl fehlschlägt).

Die beste Lösung dafür ist, Schritte zu unternehmen, um den Fehler von vornherein zu vermeiden. In diesem Fall würden Sie dies wahrscheinlich mit dropping tables mit einem separaten Befehl ausführen, bevor Sie pg_restore ausführen und die Option --clean auslassen.

Verwandte Themen