it-swarm.com.de

PostgreSQL 9.1 pg_restore Fehler bezüglich PLPGSQL

Ich verwende Postgres für ein Django= Projekt und implementiere derzeit ein Datenbanksicherungs-/Wiederherstellungssystem, das so einfach wie möglich einen pg_dump durchführt, wenn der Benutzer auf backup klickt, und dann pg_restore, wenn er auf restore backup klickt.

Alles scheint in Ordnung und fehlerfrei zu sein, bis tatsächlich versucht wird, die pg_restore auszuführen. Zu diesem Zeitpunkt wird der folgende Fehler ausgegeben:

pg_restore: [archiver (db)] Fehler vom Inhaltsverzeichniseintrag 3206; 0 0 COMMENT EXTENSION plpgsql pg_restore: [archiver (db)] konnte die Abfrage nicht ausführen: ERROR: muss Eigentümer der Erweiterung plpgsql sein Befehl lautete: COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedure language' ;

Ich habe nachgesehen, was plpgsql usw. ist, und ich verstehe das. In Bezug auf den Fehler habe ich versucht, den "Eigentümer der Erweiterung" manuell auf den Benutzer festzulegen, der das Skript ausführt und die Datenbank selbst besitzt, aber das hat nichts geändert, was seitdem wirklich ärgerlich ist Es ist ein Fehler, wenn versucht wird, einen Kommentar zu allen Dingen zu verfassen

Dies alles wird automatisch von pg_dump erstellt, sodass die Kommentarzeile nicht entfernt werden kann und es keine Flags zum Deaktivieren von Kommentaren gibt (deren Deaktivierung ich kenne).

63
fury-s12

Es scheint, als ob pg_restore versucht, einige zusätzliche Daten wiederherzustellen, die Sie nicht besitzen. Versuchen Sie, -n public Option zu Ihrer pg_restore Kommandozeile. Es teilt pg_restore mit, dass nur Inhalte des öffentlichen Schemas wiederhergestellt werden sollen. Ihre Kommandozeile sollte so aussehen

pg_restore -U username -c -n public -d database_name
112
Roman Akinfold

Auf dieser Seite habe ich die folgende Problemumgehung gefunden:

http://archives.postgresql.org/pgsql-general/2011-10/msg00826.php

Die Idee ist, pg_restore -l zu verwenden, um den Inhalt des Archivs aufzulisten, die Erweiterung, für die der Benutzer keine Berechtigung zum Wiederherstellen hat, zu ermitteln und pg_restore -L zu verwenden, um diese Liste beim Wiederherstellen zu verwenden.

Beispielsweise:

pg_restore -l ~/database.dump | grep -v "EXTENSION - plpgsql" > ~/restore_elements
pg_restore -L ~/restore_elements ~/database.dump
14
rantler

Wenn möglich, empfehle ich Ihnen, den Kommentar zu entfernen, der nicht wiederhergestellt werden kann, bevor Sie Speicherauszüge erstellen.

Sie können dies tun, indem Sie:

COMMENT ON EXTENSION plpgsql IS null;

Wenn Sie dies nicht für jede neu erstellte Datenbank tun möchten, entfernen Sie den Kommentar aus der DB template1 (CREATE DATABASE… kopiert diese Datenbank.)

Danach erstellte Speicherauszüge sollten fehlerfrei wiederhergestellt werden.

4
Peter Gerber

Laden Sie in eine Datenbank, die von einem anderen Benutzer erstellt wurde? Versuchen Sie nach Möglichkeit, die Wiederherstellung mit demselben Benutzer durchzuführen, der die Datenbank und ihre vorhandenen Objekte erstellt hat.

2
Edmund

Funktioniert für mich nach diesem Befehl -

[email protected]:~$ Sudo -i -u postgres
[email protected]:~$ psql 
psql (9.3.5)
Type "help" for help.

postgres=# GRANT ALL PRIVILEGES ON DATABASE database_name TO user;
postgres=# GRANT
2
Deepak Mahakale