2016-05-17 76 views
11

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?

risposta

10

Ho realizzato che lo --no-owner non è lo stesso del -x. Ho aggiunto il -x a tutti pg_dump comandi, il che significa:

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

che in effetti esclude l'incriminata GRANT/REVOKE comandi dal discarica. Problema risolto.

+1

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 –

+9

'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

Problemi correlati