2011-01-05 11 views
9

Ho un server DB (di produzione) che esegue PostgreSQL v9.0 e una macchina di sviluppo che esegue PostgreSQL v8.4. Vorrei fare un dump del DB di produzione e usarlo sulla macchina di sviluppo. Non riesco ad aggiornare i postgres sulla macchina dev.Utilizzare pg_restore per ripristinare da una versione più recente di PostgreSQL

Sulla macchina di produzione, corro:

pg_dump -f nvdls.db -F p -U nvdladmin nvdlstats 

Sulla macchina di sviluppo, corro:

pg_restore -d nvdlstats -U nvdladmin nvdls.db 

E ho ottenuto questo errore:

pg_restore: [archiver] unsupported version (1.12) in file header 

Ciò si verifica a prescindere se scelgo il formato personalizzato, tar o plain_text durante il dumping.

Ho trovato one discussion online che suggerisce che dovrei usare una versione più recente di pg_restore sulla macchina di sviluppo. Ho provato questo semplicemente copiando il file binario 9.0 sulla macchina di sviluppo, ma questo non riesce (non inaspettatamente) a causa di problemi di collegamento.

Ho pensato che il punto di utilizzo di un dump di plain_text era che sarebbe un SQL raw e portatile. Apparentemente no.

Come posso ottenere il DB 9.0 nell'installazione 8.4?

+0

Si potrebbe avere sia 8.4 che 9.0 in esecuzione in parallelo (questo è quello che sto facendo, funziona bene), in questo modo è possibile mantenere 8.4 per i progetti locali che dipendono da esso, eppure avere 9.0 per quella appplicazione che utilizza 9 : a lungo termine, pagherà meglio di provare a ripristinare un dump da una versione diversa. – wildpeaks

+0

[Esportazione e importazione di PostgresSQL con pgAdmin III] (http://stackoverflow.com/a/39167526/1045444) –

risposta

25

pg_restore è solo per il ripristino di dump nel formato "personalizzato".

Se si fanno un "testo semplice" dump bisogna usare psql per eseguire lo script SQL generato:

 
psql -f nvdls.db dbname username 
+0

Questo ha funzionato, grazie! – Phrogz

3

Utilizzando pg_dump/pg_restore per passare 9,0-8,4 non è supportata - solo andare avanti IS supportato.

Tuttavia, in genere è possibile ottenere i dati (in un dump di soli dati) e in alcuni casi è possibile ottenere lo schema, ma è soprattutto una fortuna, dipende dalle funzionalità che si stanno utilizzando.

Normalmente si dovrebbe usare la versione di destinazione di pg_dump e pg_restore, il che significa che in questo caso si dovrebbero usare i binari da 8.4. Ma dovresti usare la versione stessa di pg_dump e pg_restore nella stessa versione. Entrambi gli strumenti funzioneranno bene attraverso la rete, quindi non ci dovrebbe essere bisogno di copiare i binari in giro.

E come dice a_horse_with_no_name, è meglio usare pg_dump in modalità di testo in chiaro, che consente di modificare manualmente il dump se necessario. In particolare, è possibile eseguire uno solo dump dello schema (con -s) e un dump solo dati - è probabile che solo il dump dello schema richieda una modifica.

+0

Buon suggerimento sullo schema del dumping separato dai dati. Ho avuto alcuni errori usando il plain_text, ma niente di irrecuperabile. Non ho potuto provare a utilizzare pg_dump dalla macchina di sviluppo in quanto il server di produzione è configurato per disabilitare le connessioni remote, ma anche questo sembra promettente. – Phrogz

+1

È possibile utilizzarlo da remoto purché si abbia la possibilità di utilizzare il port forwarding SSH (o simile). –

2

Se il database 9.0 contiene colonne qualsiasi, i problemi più grandi attendono.

Queste colonne verranno esportati da pg_dump utilizzando la rappresentazione "hex" e appaiono nel file di dump come:

SELEZIONA pg_catalog.lowrite (0, '\ x0a2')

qualsiasi versione di postgres backend sotto 9.0 non può contenere la rappresentazione esadecimale di bytea, e non riesco a trovare un'opzione per dire pg_dump sul lato 9.0 per non usarlo.L'impostazione predefinita di "bytea_output" su ESCAPE per il database o per l'intero server è apparentemente ignorata da pg_dump.

Suppongo che sarebbe possibile post-processo il file dump ed effettivamente cambiare ogni valore bytea esadecimale codificato ad uno scampato, ma il rischio di untraceably corrompere il genere di cose di solito memorizzati in una bytea (immagini, file PDF ecc) non mi eccita.

+0

Atleast in 9.2.2 le impostazioni bytea_output ora sono rispettate per pg_dump, quindi impostandolo su 'escape' si otterrà un dump compatibile con 8.4, almeno per i campi bytea. Hai ancora alcuni avvertimenti sulle procedure. – jishi

2

Ho risolto questo aggiornando postgresql da 8.X a 9.2.4. Se stai usando birra su Mac OS-X, usare -

brew upgrade postgresql 

Una volta fatto questo, basta assicurarsi che la nuova installazione postgres è nella parte superiore del vostro percorso. Sembrerà qualcosa di simile (a seconda del percorso di installazione della versione) -

export PATH=/usr/local/Cellar/postgresql/9.2.4/bin:$PATH 
0

Ho avuto lo stesso problema. Ho usato pgdump e psql per il DB di esportazione/importazione.

1.Set PGPASSWORD

export PGPASSWORD='h0ld1tn0w'; 

2.Export DB con pg_dump

pg_dump -h <<host>> -U <<username>> <<dbname>> > /opt/db.out 

/opt/db.out è percorso discarica. Puoi specificare il tuo.

3.Poi impostare nuovamente PGPASSWORD di un altro host. Se l'host è lo stesso o la password è la stessa, questo non è richiesto.

4.Import db a vostra un altro host

psql -h <<host>> -U <<username>> -d <<dbname>> -f /opt/db.out 

Se il nome utente è diverso quindi trovare e sostituire con il tuo nome utente locale db.out file. E assicurati che il nome utente sia sostituito e non i dati.

Problemi correlati