Ich habe mit dem Befehl eine saubere Sicherung ohne Eigentümer für die Postgres-Datenbank gespeichert
pg_dump sample_database -O -c -U
Später, wenn ich die Datenbank mit wiederherstelle
psql -d sample_database -U app_name
Es sind jedoch mehrere Fehler aufgetreten, die mich daran hindern, die Daten wiederherzustellen:
ERROR: must be owner of extension plpgsql
ERROR: must be owner of schema public
ERROR: schema "public" already exists
ERROR: must be owner of schema public
CREATE EXTENSION
ERROR: must be owner of extension plpgsql
Ich habe mich mit dem Klartext befasst, den SQL pg_dump
generiert, und festgestellt, dass er SQL enthält
CREATE SCHEMA public;
COMMENT ON SCHEMA public IS 'standard public schema';
CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
Ich denke, die Ursachen sind, dass der Benutzer app_name
nicht die Berechtigungen hat, das public
Schema und zu ändern plpgsql
.
Wie könnte ich dieses Problem lösen?
postgresql
database-backups
rails-postgresql
steveyang
quelle
quelle
plpgsql
, dannDROP EXTENSION plpgsql
vor Ihnenpg_dump
. Dies ist sicherer, als Ihre App zu einem Superuser zu machen, und es ist bequemer, als Fehler zu ignorieren (welche Bomben, wenn Sie--single-transaction
oder verwenden-v ON_ERROR_STOP=1
). Dies ist ein bekanntes Problem, das von den Postgres-Entwicklern ausführlich erörtert wurde postgresql.org/message-id/… aber nicht behoben ab 9.3.Antworten:
Um das Problem zu lösen, müssen Sie die entsprechenden Eigentumsrechte zuweisen. Versuchen Sie Folgendes, um alle Probleme im Zusammenhang mit Berechtigungen für bestimmte Benutzer zu beheben. Wie in den Kommentaren angegeben, sollte dies jedoch nicht in der Produktion verwendet werden:
Stellen Sie also unter einem Superuser-Konto
sudo -u postgres psql
eine Verbindung zur Datenbank her und führen Sie eineALTER ROLE <user-name> Superuser;
Anweisung aus.Beachten Sie, dass dies nicht die beste Lösung für Hosting-Server mit mehreren Standorten ist. Sehen Sie sich stattdessen die Zuweisung einzelner Rollen an: https://www.postgresql.org/docs/current/static/sql-set-role.html und https : //www.postgresql.org/docs/current/static/sql-alterrole.html .
quelle
app_user
ist nicht ein Super - User.superuser
AWS RDS-Benutzer, wenn Sie dies erhalten, liegt es daran, dass Sie kein Superuser sind und laut aws-Dokumentation keiner sein können. Ich habe festgestellt, dass ich diese Fehler ignorieren muss.
quelle
COMMENT ON EXTENSION
, nichtCREATE EXTENSION
. Entfernen Sie die Kommentare und es sollte Ihnen gut gehen.Für Benutzer von Google Cloud Platform wird der Importvorgang durch jeden Fehler gestoppt. Persönlich sind je nach dem von mir ausgegebenen Befehl pg_dump zwei verschiedene Fehler aufgetreten:
1-
The input is a PostgreSQL custom-format dump. Use the pg_restore command-line client to restore this dump to a database.
Tritt auf, wenn Sie versucht haben, Ihre Datenbank in einem nicht einfachen Textformat zu sichern. Dh wenn dem Befehl der Parameter -Fp oder --format = plain fehlt. Wenn Sie es jedoch zu Ihrem Befehl hinzufügen, kann der folgende Fehler auftreten:
2-
SET SET SET SET SET SET CREATE EXTENSION ERROR: must be owner of extension plpgsql
Dies ist ein Berechtigungsproblem, das ich mit dem Befehl in den GCP-Dokumenten , den Tipps aus diesem aktuellen Thread oder den Ratschlägen des Google Postgres-Teams hier nicht beheben konnte . Welche empfahl, den folgenden Befehl auszugeben:
pg_dump -Fp --no-acl --no-owner -U myusername myDBName > mydump.sql
Das einzige, was in meinem Fall den Trick gemacht hat, war das manuelle Bearbeiten der Dump-Datei und das Auskommentieren aller Befehle in Bezug auf plpgsql.
Ich hoffe, das hilft GCP-abhängigen Seelen.
Update:
Es ist einfacher, die Datei zu sichern, indem Erweiterungen auskommentiert werden, zumal einige Speicherauszüge sehr groß sein können:
pg_dump ... | grep -v -E '(CREATE\ EXTENSION|COMMENT\ ON)' > mydump.sql
Was auf plpgsql eingegrenzt werden kann:
pg_dump ... | grep -v -E '(CREATE\ EXTENSION\ IF\ NOT\ EXISTS\ plpgsql|COMMENT\ ON\ EXTENSION\ plpgsql)' > mydump.sql
quelle
pg_dump
Befehl, den sie in ihren Dokumenten verwenden können :pg_dump -U [USERNAME] --format=plain --no-owner --no-acl [DATABASE_NAME] \ | sed -E 's/(DROP|CREATE|COMMENT ON) EXTENSION/-- \1 EXTENSION/g' > [SQL_FILE].sql
In diesem Fall können Sie die Fehlermeldungen wahrscheinlich ignorieren. Wenn Sie dem öffentlichen Schema keinen Kommentar hinzufügen und plpgsql installieren (das bereits installiert sein sollte), treten keine wirklichen Probleme auf.
Wenn Sie jedoch eine vollständige Neuinstallation durchführen möchten, benötigen Sie einen Benutzer mit den entsprechenden Berechtigungen. Das sollte natürlich nicht der Benutzer sein, den Ihre Anwendung routinemäßig ausführt.
quelle
Kürzere Antwort: Ignorieren Sie es.
Dieses Modul ist der Teil von Postgres, der die SQL-Sprache verarbeitet. Der Fehler tritt häufig beim Kopieren einer entfernten Datenbank auf, z. B. bei einem 'heroku pg: pull'. Es überschreibt Ihren SQL-Prozessor nicht und warnt Sie davor.
quelle
Versuchen Sie, das
-L
Flag mit pg_restore zu verwenden, indem Sie die Datei angeben, aus der entnommen wurdepg_dump -Fc
https://www.postgresql.org/docs/9.5/app-pgrestore.html
Hier können Sie sehen, dass die Umkehrung wahr ist, indem Sie nur den Kommentar ausgeben:
quelle
Für Menschen mit AWS , das
COMMENT ON EXTENSION
ist nur möglich , als Super - User , und wie wir durch die docs wissen, werden die RDS - Instanzen von Amazon verwaltet. Um zu verhindern, dass Sie beispielsweise die Replikation beschädigen, verfügen Ihre Benutzer - selbst der Root-Benutzer, den Sie beim Erstellen der Instanz eingerichtet haben - nicht über die vollständigen Superuser-Berechtigungen:http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.html
Um diesen Fehler zu beheben
--
, kommentieren Sie einfach die enthaltenen SQL-Zeilen ausCOMMENT ON EXTENSION
quelle
pg_dump --no-comments
.Verwenden Sie den Benutzer postgres (admin), um das Schema zu sichern, neu zu erstellen und Berechtigungen zur Verwendung zu erteilen, bevor Sie die Wiederherstellung durchführen. In einem Befehl:
quelle
Für mich habe ich eine Datenbank mit pgAdmin eingerichtet und es scheint nicht genug zu sein, den Eigentümer während der Datenbankerstellung festzulegen . Ich musste zum 'öffentlichen' Schema hinunter navigieren und dort auch den Besitzer festlegen (war ursprünglich 'postgres').
quelle
Für Personen, die das Problem auf die
COMMENT ON
Anweisungen eingegrenzt haben (siehe verschiedene Antworten unten) und Superuser-Zugriff auf die Quelldatenbank haben, aus der die Dump-Datei erstellt wird, besteht die einfachste Lösung möglicherweise darin, zu verhindern, dass die Kommentare in den Dump aufgenommen werden Datei in erster Linie, indem Sie sie aus der Quelldatenbank entfernen, die gesichert wird ...Zukünftige Dumps enthalten dann keine
COMMENT ON
Anweisungen.quelle
rails db:reset
jeder Ausführung einer Schemamigration automatisch eine neue Speicherauszugsdatei erstellt wird). Mit dieser Lösung kann ich einfach eine Postgresql-Instanz von AWS RDS ausführen, ohne jedes Mal, wenn ich ein Schema ausführe, COMMENT ON-Zeilen aus der Speicherauszugsdatei entfernen zu müssen Migration.