Ich verwende Postgres für ein Django-Projekt und implementiere derzeit ein Datenbanksicherungs- / Wiederherstellungssystem, das so einfach wie möglich einen pg_dump ausführt, wenn der Benutzer auf Backup klickt, und dann pg_restore, wenn er auf Backup wiederherstellen klickt.
Alles scheint in Ordnung und gut zu sein, bis es tatsächlich versucht, den pg_restore auszuführen. Zu diesem Zeitpunkt gibt es diesen Fehler:
pg_restore: [archiver (db)] Fehler vom Inhaltsverzeichniseintrag 3206; 0 0 COMMENT EXTENSION plpgsql pg_restore: [archiver (db)] konnte keine Abfrage ausführen: ERROR: muss Eigentümer der Erweiterung sein plpgsql Befehl war: COMMENT ON EXTENSION plpgsql IS 'PL / pgSQL-Prozedurensprache';
Ich habe mir angesehen, 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 bei dem Versuch, einen Kommentar zu allen Dingen abzugeben
Dies alles wird automatisch von pg_dump erstellt, sodass die Kommentarzeile nicht entfernt werden kann und es keine Flags zum Deaktivieren von Kommentaren gibt (von denen ich weiß, dass sie deaktiviert sind). Daher bin ich wirklich festgefahren, wie dieses Problem gelöst werden kann.
quelle
\l
, was sehen Sie in der Spalte "Eigentümer" für diese Datenbank? Da plpgsql eine nicht vertrauenswürdige Sprache ist, kann sie nur vom Datenbankeigentümer oder einem Datenbank-Superuser geändert werden (und ich würde vermuten, dass dies auch für den Kommentar gilt).Antworten:
Es scheint, als ob pg_restore versucht, einige zusätzliche Daten wiederherzustellen, die Sie nicht besitzen. Versuchen Sie
-n public
, Ihrer pg_restore-Befehlszeile eine Option hinzuzufügen . Es wird pg_restore mitteilen, dass nur Inhalte des öffentlichen Schemas wiederhergestellt werden. Ihre Befehlszeile sollte so aussehenquelle
pg_restore
Versuch behoben, zusätzliche Erweiterungen zu laden, was in unserem Szenario nicht erlaubt war.Ich habe auf dieser Seite 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 zu ermitteln, für deren Wiederherstellung der Benutzer keine Berechtigung hat, und pg_restore -L zu verwenden, um diese elidierte Liste beim Wiederherstellen zu verwenden.
Zum Beispiel:
quelle
STDOUT
sodass Sie es wahrscheinlich stattdessen in eine Datei umleiten möchten.Wenn möglich, empfehle ich, den Kommentar zu entfernen, der nicht wiederhergestellt werden kann, bevor Dumps erstellt werden.
Sie können dies tun durch:
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 Datenbank mit dem Namen template1 (
CREATE DATABASE…
kopiert diese Datenbank.)Danach erstellte Dumps sollten fehlerfrei wiederhergestellt werden.
quelle
Wenn Sie die Version von Postgres 11 (oder höher) ausführen
pg_dump
, können Sie die neue--no-comments
Flagge nutzen.quelle
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.
quelle
Funktioniert für mich nach diesem Befehl -
Deepak@deepak:~$ sudo -i -u postgres postgres@deepak:~$ psql psql (9.3.5) Type "help" for help. postgres=# GRANT ALL PRIVILEGES ON DATABASE database_name TO user; postgres=# GRANT
quelle