pg_restore Fehler: Rolle XXX nicht vorhanden ist
Versuchen zu replizieren, eine Datenbank von einem system auf ein anderes. Die Versionen beteiligt sind 9.5.0 (Quelle) und 9.5.2 (Ziel).
Quell-db name ist foodb
mit dem Besitzer pgdba
- und Ziel-db name wird genannt werden foodb_dev
mit dem Besitzer pgdev
.
Alle Befehle werden ausgeführt, auf dem Ziel-system, das als host für die Replik.
Den pg_dump
Befehl:
pg_dump -f schema_backup.dump --no-owner -Fc -U pgdba -h $PROD_DB_HOSTNAME -p $PROD_DB_PORT -d foodb -s --clean;
Dieser ohne Fehler läuft.
Den entsprechenden pg_restore
ist:
pg_restore --no-owner --if-exists -1 -c -U pgdev -d foodb_dev schema_backup.dump
dem Fehler:
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 3969; 0 0 ACL public pgdba
pg_restore: [archiver (db)] could not execute query: ERROR: role "pgdba" does not exist
Command was: REVOKE ALL ON SCHEMA public FROM PUBLIC;
REVOKE ALL ON SCHEMA public FROM pgdba;
GRANT ALL ON SCHEMA public TO pgdba;
GRANT ...
Wenn ich generieren die dump-Datei im nur-text-format (-Fp
) ich sehe es umfasst mehrere Einträge wie:
REVOKE ALL ON TABLE dump_thread FROM PUBLIC;
REVOKE ALL ON TABLE dump_thread FROM pgdba;
GRANT ALL ON TABLE dump_thread TO pgdba;
GRANT SELECT ON TABLE dump_thread TO readonly;
die versuchen, die Privilegien für Benutzer pgdba
wer natürlich gar nicht gibt, wie ein Benutzer auf dem Zielsystem, das nur user pgdev
, und damit die Fehler aus pg_restore
.
In der Quell-db die Rechte für das Beispiel der dump_thread
Tabelle:
# \dp+ dump_thread
Access privileges
-[ RECORD 1 ]-----+--------------------
Schema | public
Name | dump_thread
Type | table
Access privileges | pgdba=arwdDxt/pgdba+
| readonly=r/pgdba
Column privileges |
Policies |
Eine schnelle Lösung wäre, einfach einen Benutzer hinzufügen pgdba
auf den Ziel-cluster-und mit ihm getan werden.
Aber sollte nicht die --no-owner
kümmern sich nicht, einschließlich Eigentümer-spezifische Befehle im dump in den ersten Platz?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erkannte ich die
--no-owner
ist nicht das gleiche wie die-x
. Ich fügte hinzu, die-x
allepg_dump
- Befehle, was bedeutet:die in der Tat schließt die problematische
GRANT
/REVOKE
Befehle aus dem dump. Problem gelöst.pg_restore --no-privileges --no-owner ...
können Sie angeben, nicht an Besitz oder Privilegien zum Zeitpunkt der Wiederherstellung, ob oder nicht diese Berechtigungen und ownerships wurden in derpg_dump