2016-05-17 14 views
11

Próba skopiowania bazy danych z jednego systemu do drugiego. Wymagane wersje to 9.5.0 (źródło) i 9.5.2 (cel).pg_restore error: rola XXX nie istnieje

Źródło nazwa db jest foodb z właścicielem pgdba i docelowej nazwie db zostanie nazwany foodb_dev z właścicielem pgdev.

Wszystkie polecenia są uruchamiane w systemie docelowym, który będzie hostował replikę.

Komenda pg_dump jest:

pg_dump -f schema_backup.dump --no-owner -Fc -U pgdba -h $PROD_DB_HOSTNAME -p $PROD_DB_PORT -d foodb -s --clean; 

ten przebiega bez błędów.

Odpowiedni pg_restore jest:

pg_restore --no-owner --if-exists -1 -c -U pgdev -d foodb_dev schema_backup.dump 

który wyrzuca błąd:

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 ... 

Gdybym wygenerować plik zrzutu w formacie zwykłego tekstu (-Fp) widzę, że zawiera kilka pozycji, takich jak:

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; 

które próbują ustawić uprawnienia dla użytkownika pgdba, który oczywiście nie istnieje nawet jako użytkownik systemu docelowego, który ma tylko użytkownika pgdev, a zatem błędy z pg_restore.

od źródła db przywilejów, na przykład stołu dump_thread:

# \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   | 

Szybkim rozwiązaniem byłoby po prostu dodać użytkownika pgdba w klastrze docelowym i być z nim zrobić.

Ale czy jednostka --no-owner nie powinna zadbać o to, aby w raporcie nie uwzględniać konkretnych poleceń właściciela?

Odpowiedz

10

Zrozumiałem, że --no-owner to nie to samo co -x. I dodaje -xpg_dump wszystkich poleceń, które oznacza

-x, --no-privileges   do not dump privileges (grant/revoke) 

co w efekcie wyklucza przeszkadzających GRANT/REVOKE polecenia z wysypiska. Problem rozwiązany.

+1

Czy istnieje sposób na przywrócenie bazy danych bez opcji -x .. w moim przypadku zrzut jest przekazywany do mr przez kogoś innego, dlatego nie mogę go zmodyfikować) x opcja –

+9

'pg_restore --no-uprawnienia - nie-właściciel ... 'pozwala ci na to, aby nie uwzględniać własności ani przywilejów w czasie przywracania, niezależnie od tego, czy te uprawnienia i prawa własności były zawarte w' pg_dump' – user1448319

Powiązane problemy