2013-06-17 6 views
35

Mam bazę danych, który został wyeksportowany z pg_dump, ale teraz gdy próbuję go importować dzięki:importu bazy danych PostgreSQL bez ról

psql -d databasename < mydump.sql 

zawiedzie próbuje udzielać role ludzi, którzy nie istnieć. (Błąd mówi „Rola«xxx»nie istnieje”)

Czy istnieje sposób importować i ustawia wszystkie role automatycznie do mojego użytkownik?

Odpowiedz

30

Domyślne zachowanie importu jest to, że zastępuje wszystkie role nie wie o roli robisz z importu. Tak więc, w zależności od tego, do czego potrzebujesz bazy danych, możesz po prostu mieć się dobrze z jej importowaniem i ignorowaniem komunikatów o błędach.

Cytując http://www.postgresql.org/docs/9.2/static/backup-dump.html#BACKUP-DUMP-RESTORE

Przed odtworzeniem zrzutu SQL, wszystkich użytkowników, którzy są właścicielami obiektów lub zostały przyznane uprawnienia do obiektów w bazie danych po cenach dumpingowych musi już istnieć. Jeśli nie, przywracanie nie powiedzie się odtworzyć obiektów z pierwotnym właścicielem i/lub uprawnień. (Czasami jest to, co chcesz, ale zwykle tak nie jest.)

+2

Ponieważ na moim pierwszym odczycie tej odpowiedzi, brakowało mi część z napisem „może po prostu być w porządku” Aby wyjaśnić tę odpowiedź, komenda prawdopodobnie pracował podczas biegu. Wyświetlane błędy nie zatrzymały importu danych. Role używane w źródle nie znajdowały się w miejscu docelowym, a wszelkie powiązane z nimi dane byłyby teraz powiązane z użytkownikiem uruchamiającym komendę. – shanemgrey

8

Tak, można zrzucić wszystkie „globalne” obiekty ze źródła DB z opcją -g pg_dumpall za:

pg_dumpall -g > globals.sql 

Następnie uruchom globals.sql przeciwko docelowego DB przed importem.

15

Z pg_restore można użyć opcji --role=rolename wymusić nazwę roli zostać wykorzystane do przeprowadzenia przywracania. Ale zrzut musi mieć format inny niż zwykły tekst.
Na przykład można zrzucić z:

pg_dump -F c -Z 9 -f my_file.backup my_database_name 

i nie można przywrócić go z:

pg_restore -d my_database_name --role=my_role_name my_file.backup 

o więcej informacji: http://www.postgresql.org/docs/9.2/static/app-pgrestore.html

-2

No może po prostu utworzyć nową rolę z taką samą nazwę, jakiej brakuje, a następnie importuj zrzut bez żadnych błędów.

błąd mówi „Rola«xxx»nie istnieje” - tak go utworzyć :)

22

Odpowiedź które mogą być szukasz jest dodanie --no-owner dowodzić pg_restore. W przeciwieństwie do obecnie akceptowanej odpowiedzi, polecenie powinno utworzyć każdy obiekt z bieżącym użytkownikiem, nawet jeśli rola w zrzucie nie istnieje w bazie danych.

Żaden element nie zostanie pominięty przez pg_restore, ale jeśli niektóre elementy zostaną zaimportowane przez różnych użytkowników, wszystkie rekordy będą w posiadaniu tylko jednego użytkownika, o ile wiem.

+0

To działało idealnie, dzięki! –