Provare a replicare un database da un sistema a un altro. Le versioni coinvolte sono 9.5.0 (fonte) e 9.5.2 (destinazione).Errore pg_restore: il ruolo XXX non esiste
Fonte nome db è foodb
con il proprietario pgdba
e la destinazione nome db sarà nominato foodb_dev
con il proprietario pgdev
.
Tutti i comandi vengono eseguiti sul sistema di destinazione che ospiterà la replica.
Il comando pg_dump
è:
pg_dump -f schema_backup.dump --no-owner -Fc -U pgdba -h $PROD_DB_HOSTNAME -p $PROD_DB_PORT -d foodb -s --clean;
Questo viene eseguito senza errori.
La corrispondente pg_restore
è:
pg_restore --no-owner --if-exists -1 -c -U pgdev -d foodb_dev schema_backup.dump
che getta errore:
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 ...
Se ho generare il file dump in formato testo (-Fp
) lo vedo comprende diverse voci come:
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;
che tenta di impostare i privilegi per l'utente pgdba
che ovviamente non esiste nemmeno come utente sul sistema di destinazione che ha solo l'utente pgdev
e quindi gli errori da pg_restore
.
Sulla fonte db i privilegi, per esempio della tabella 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 |
Una soluzione rapida sarebbe quella di aggiungere semplicemente un utente pgdba
sul cluster di destinazione e da fare con esso.
Ma non dovrebbe il --no-owner
occuparsi di non includere i comandi specifici del proprietario nel dump in primo luogo?
C'è un modo per ripristinare il database senza opzione -x ... nel mio caso il dump è dato a mr da qualcun altro quindi non posso modificarlo con) x opzione –
'pg_restore --no-privileges --no-owner ... 'consente di specificare di non includere la proprietà oi privilegi al momento del ripristino indipendentemente dal fatto che tali privilegi e proprietà siano stati inclusi nel' pg_dump' – user1448319