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?
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 –
'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