postgresql: Wie kann ich Rollen für einen Cluster sichern und wiederherstellen?

27

Wo werden Rollen in einem Cluster gespeichert und wie kann ich sie sichern?

Ich habe einen pg_dump einer Datenbank erstellt und ihn dann in einen anderen Cluster geladen, aber ich bekomme viele dieser Fehler:

psql:mydump.sql:3621: ERROR:  role "myrole" does not exist 

Anscheinend enthält der Dump meiner Datenbank keine Rollen. Ich habe versucht, die 'postgres'-Datenbank zu löschen, aber ich sehe die Rollen dort auch nicht.

Muss ich verwenden pg_dumpall --roles-only?

Postgresql-Versionen 8.4.8 und 9.1.4 Betriebssystem: Ubuntu 11.04 Natty

Rob Bednark
quelle

Antworten:

37

Aus der CREATE ROLEDokumentation :

Beachten Sie, dass Rollen auf Datenbankclusterebene definiert werden und daher in allen Datenbanken im Cluster gültig sind.

Da pg_dumpeine einzelne Datenbank gesichert wird, können Sie mit diesem Dienstprogramm keine Rollen extrahieren. Der von pg_dumpall --roles-onlyIhnen vorgeschlagene Befehl erledigt die Arbeit. Möglicherweise müssen Sie jedoch die Ausgabe filtern, damit nur die gewünschten Rollen im neuen Cluster erstellt werden.

Rollen werden im pg_authidKatalog gespeichert data/global/, der sich zusammen mit den anderen clusterweiten Tabellen physisch im Unterordner einer PostgreSQL-Installation befindet. Sie können den Inhalt von pg_authidüber die pg_rolesAnsicht abfragen .

ANMERKUNG : Sie benötigen Superuser-Rechte, um die Rollen zu sichern. Andernfalls würden Sie eine Berechtigung für verweigert bekommen SELECTauf pg_authid- und selbst wenn ein Super - User gewährt SELECTRechte, dann würden Sie den gleichen Fehler. In diesem Fall jedoch können Sie die Rollen auflisten , indem Sie die Abfrage pg_authiddirekt COPYin eine Datei und etwas Magie rollen die notwendigen zu erstellen CREATE ROLEund ALTER ROLEAussagen.

dezso
quelle
Können Sie hinzufügen, wie alle Rollen wiederhergestellt werden (dh es ist keine Filterung erforderlich)?
Ethan Furman
1
Um alle Rollen wiederherzustellen, kopieren Sie einfach die Ausgabe von und fügen Sie sie pg_dumpall --roles-onlyin die gewünschte psql-Shell ein. Oder spezifische CREATE ROLEund ALTER ROLELinien
Fernando Fabreti