Ich verwende pg_dump / pg_restore zum Sichern und Wiederherstellen einer PostgreSQL-Datenbank, erhalte jedoch einige Fehlermeldungen (und einen Exit-Status ungleich Null) von pg_restore. Ich habe einen supereinfachen Basisfall ausprobiert (siehe unten), habe aber trotzdem folgende Fehler erhalten:
pg_restore: [archiver (db)] Fehler beim Verarbeiten des Inhaltsverzeichnisses: pg_restore: [archiver (db)] Fehler von Inhaltsverzeichniseintrag 5; 2615 2200 SCHEMA öffentliche Postgres pg_restore: [archiver (db)] konnte Abfrage nicht ausführen: FEHLER: Schema "public" existiert bereits Befehl war: CREATE SCHEMA public;
Schritte zum Reproduzieren:
- Installiere eine frische Vanille Ubuntu 14.04 Distribution (ich benutze Vagrant mit dieser Vagrant Box ).
- Installieren Sie PostgreSQL 9.3 und konfigurieren Sie es so, dass lokale Verbindungen von jedem Linux-Benutzer als PostgreSQL-Benutzer "postgres" zugelassen werden.
Erstellen Sie eine Testdatenbank. Ich mache nur:
vagrant @ vagrant-ubuntu-trusty-64: ~ $ psql --username = postgres postgres psql (9.3.5) Geben Sie "help" ein, um Hilfe zu erhalten. postgres = # create database mydb; DATENBANK ERSTELLEN postgres = # \ q vagrant @ vagrant-ubuntu-trusty-64: ~ $ psql --username = postgres mydb psql (9.3.5) Geben Sie "help" ein, um Hilfe zu erhalten. mydb = # Tabellendaten erstellen (Eintrag bigint); TABELLE ERSTELLEN mydb = # Einfügen in Datenwerte (1); INSERT 0 1 mydb = # Einfügen in Datenwerte (2); INSERT 0 1 mydb = # Einfügen in Datenwerte (3); INSERT 0 1 mydb = # \ q
Erstellen Sie eine Sicherungskopie der Datenbank wie folgt:
PGPASSWORD = "postgres" pg_dump --dbname = mydb --username = postgres --format = custom> pg_backup.dump
Löschen Sie einige Zeilen aus der Datentabelle in mydb, damit wir feststellen können, ob die Daten erfolgreich wiederhergestellt wurden.
Stellen Sie die Datenbank wieder her mit:
PGPASSWORD = "postgres" pg_restore --clean --create --dbname = postgres --username = postgres pg_backup.dump
Die Daten werden wiederhergestellt, aber der Befehl pg_restore in Schritt 6 wird mit dem Status beendet 1
und zeigt die folgende Ausgabe an:
pg_restore: [archiver (db)] Fehler beim Verarbeiten des Inhaltsverzeichnisses: pg_restore: [archiver (db)] Fehler von Inhaltsverzeichniseintrag 5; 2615 2200 SCHEMA öffentliche Postgres pg_restore: [archiver (db)] konnte Abfrage nicht ausführen: FEHLER: Schema "public" existiert bereits Befehl war: CREATE SCHEMA public; WARNUNG: Fehler, die bei der Wiederherstellung ignoriert werden: 1
Ich kann dies nicht einfach ignorieren, da ich diesen Befehl programmgesteuert ausführe und anhand des Beendigungsstatus feststellen muss, ob die Wiederherstellung fehlgeschlagen ist oder nicht. Anfangs habe ich mich gefragt, ob dieses Problem darauf zurückzuführen ist, dass ich meine Datenbank öffentlich zugänglich gemacht habe (das Standardschema). Ich dachte, dass public als Ergebnis der --create
Option von pg_restore erstellt würde, bevor die Daten wiederhergestellt wurden (was möglicherweise auch versuchen könnte, dieses Schema zu erstellen, da sich dort meine Tabelle befindet), aber als ich die obigen Schritte mit meiner Tabelle ausprobierte In einem anderen Schema waren die Ergebnisse gleich und die Fehlermeldungen identisch.
Mache ich etwas falsch? Warum sehe ich diesen Fehler?
quelle
--create
ohneclean
behebt das Problem nicht.In meinem Fall lag der Grund darin, dass ich mit
pg_restore
postgresql-contrib Version 11.2 einen vonpg_dump
9.6 erstellten Dump in einem PostgreSQL-Cluster 9.6 wiederhergestellt habe .Nachdem ich mein
pg_restore
Back auf 9.6 heruntergestuft hatte , war dieserschema "public" already exists
Fehler behoben und der Wiederherstellungsprozess funktionierte wie zuvor.quelle