Postgresql - tworzenie kopii zapasowych bazy danych i przywracanie danych u innego właściciela?

88

Zrobiłem kopię zapasową bazy danych na innym serwerze i ma inną rolę niż potrzebuję, za pomocą tego polecenia:

pg_dump -Fc db_name -f db_name.dump

Następnie skopiowałem kopię zapasową na inny serwer, na którym muszę przywrócić bazę danych, ale nie ma takiego właściciela, który byłby używany dla tej bazy danych. Powiedzmy, że baza danych ma właściciela owner1, ale na innym serwerze mam tylko owner2i muszę przywrócić tę bazę danych i zmienić właściciela.

Co zrobiłem na innym serwerze podczas przywracania:

createdb -p 5433 -T template0 db_name 
pg_restore -p 5433 --role=owner2 -d db_name db_name.dump

Ale po uruchomieniu przywracania otrzymuję następujące błędy:

pg_restore: [archiver (db)] could not execute query: ERROR:  role "owner1" does not exist

Jak mogę to określić, aby zmieniło właściciela? Czy to niemożliwe?

Andrius
źródło
1
Poza tym, --no-ownerjak zasugerowano w zaakceptowanej odpowiedzi, możesz również potrzebować --no-privileges. Zobacz tę odpowiedź
mivk

Odpowiedzi:

134

Powinieneś użyć --no-owneropcji, to przestaje pg_restorepróbować ustawić własność obiektów na pierwotnego właściciela. Zamiast tego obiekty będą własnością użytkownika określonego przez--role

createdb -p 5433 -T template0 db_name 
pg_restore -p 5433 --no-owner --role=owner2 -d db_name db_name.dump

pg_restore doc

Gary
źródło
14
pg_dump --no-ownerteż powinien to zrobić
Nick Barnes
11
Wolę odłożyć tego rodzaju decyzje do czasu przywrócenia. Jeśli zrobisz to na etapie zrzutu, oznacza to, że nie możesz zmienić zdania bez eksportu. Zrobienie tego podczas przywracania oznacza, że ​​opcje pozostają otwarte na wypadek, gdybyś zdecydował, że naprawdę powinieneś był utworzyć tę brakującą rolę itp.
Gary
1
Więc jeśli chcę zmienić właściciela, muszę wykonać kopię zapasową bez właściciela? Ponieważ myślałem, że mogę zmienić właściciela podczas przywracania. Ale nawet ustawianie --rolena innego właściciela, nadal próbowało użyć oryginalnego właściciela (ale wtedy nie użyłem --no-owner.
Andrius
2
@Andrius: Nie musisz zmieniać kopii zapasowej, odpowiedź Gary'ego powinna rozwiązać twój problem
Nick Barnes.
5
Przeglądając wszystkie posty na ten temat, wydaje się, że pomijają również fakt, że takie podejście wymaga, aby nowy właściciel roli był superużytkownikiem, przynajmniej na czas przywracania. Wtedy wszystko działa
chrismarx