postgresql: jak zrzucić i przywrócić role dla klastra?

27

Gdzie są przechowywane role w klastrze i jak je zrzucić?

Zrobiłem pg_dump bazy danych, a następnie załadowałem ją do innego klastra, ale otrzymuję wiele z tych błędów:

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

Więc najwyraźniej zrzut mojej bazy danych nie obejmuje ról. Próbowałem zrzucić db bazy danych „postgres”, ale nie widzę tam również ról.

Czy muszę używać pg_dumpall --roles-only?

Wersje Postgresql 8.4.8 i 9.1.4 OS: Ubuntu 11.04 Natty

Rob Bednark
źródło

Odpowiedzi:

37

Z CREATE ROLEdokumentacji :

Należy zauważyć, że role są zdefiniowane na poziomie klastra bazy danych, a zatem są poprawne we wszystkich bazach danych w klastrze.

Ponieważ pg_dumpzrzuca pojedynczą bazę danych, nie można wyodrębnić ról za pomocą tego narzędzia. pg_dumpall --roles-onlyKomenda proponowane będą wykonywać pracę - jednak może trzeba filtrować swoje wyjście tak, że tylko pożądane role zostanie utworzony w nowym klastrze.

Role są przechowywane w pg_authidkatalogu, który jest fizycznie przechowywany w data/global/podfolderze instalacji PostgreSQL, wraz z innymi tabelami obejmującymi cały klaster. Możesz przeszukać zawartość pg_authidpoprzez pg_roleswidok.

UWAGA : do zrzucenia ról potrzebne będą uprawnienia administratora. W przeciwnym razie, można by uzyskać pozwolenie odmowy SELECTna pg_authid- i nawet jeśli superuser przyznaje SELECTprawa, można uzyskać ten sam błąd. W tym przypadku można jednak wymienić role, wysyłając zapytanie pg_authidbezpośrednio COPYdo pliku i rzucając trochę magii, aby utworzyć niezbędne CREATE ROLEi ALTER ROLEinstrukcje.

dezso
źródło
Czy możesz dodać, jak przywrócić wszystkie role (tj. Nie wymaga filtrowania)?
Ethan Furman,
1
aby przywrócić wszystkie role, po prostu skopiuj i wklej dane wyjściowe pg_dumpall --roles-onlydo żądanej powłoki psql. Lub konkretne CREATE ROLEi ALTER ROLEwiersze
Fernando Fabreti