2009-08-06 15 views

risposta

487

Non è necessario creare un file intermedio. Si può fare

pg_dump -C -h localhost -U localuser dbname | psql -h remotehost -U remoteuser dbname 

o

pg_dump -C -h remotehost -U remoteuser dbname | psql -h localhost -U localuser dbname 

utilizzando psql o pg_dump per connettersi a un host remoto.

Con un database di grandi dimensioni o una connessione lenta, scaricare un file e trasferire il file compresso potrebbe essere più veloce.

Come Kornel detto che non c'è bisogno di scaricare un file intermedio, se si desidera lavorare compressa è possibile utilizzare un tunnel compressa

pg_dump -C dbname | bzip2 | ssh [email protected] "bunzip2 | psql dbname" 

o

pg_dump -C dbname | ssh -C [email protected] "psql dbname" 

ma questa soluzione richiede anche per ottenere una sessione in entrambe le estremità.

+22

Non è necessario per i file intermedi - puoi usare il tunnel SSH compresso o semplicemente pipe: pg_dump | bzip2 | ssh "bunzip2 | pg_restore" – Kornel

+2

Se si utilizza bzip2, disattivare la compressione ssh per accelerare il trasferimento! – lzap

+0

Il comando ssh ha già disabilitato la compressione per impostazione predefinita. Nell'esempio quando si usa la compressione ssh, non sto usando bzip2 e quando uso bzip2 non sto usando la compressione ssh. – Ferran

97
pg_dump the_db_name > the_backup.sql 

quindi copiare il backup sul server di sviluppo, ripristino con:

psql the_new_dev_db < the_backup.sql 
+2

Qualcuno mi ha detto che può essere problematico - problemi di permessi che causano il dump o il ripristino di morire quando colpisce un trigger ? –

+9

@rmbarnes: Se ci sono problemi, devono essere corretti. Senza una conoscenza dettagliata di ciò che questo "Qualcuno" ha fatto - nessuno può confermare o respingere questa affermazione. –

+2

Usa il flag --no-owner con pg_dump. Questo salta il problema e la prima modifica di questo post lo ha usato, ma poi ho pensato che potresti aver bisogno di una fedeltà più precisa al database originale. – unmounted

33

Usa pg_dump, e più tardi psql o pg_restore - a seconda se si sceglie -FP o opzioni -Fc a pg_dump.

Esempio di utilizzo:

ssh production 
pg_dump -C -Fp -f dump.sql -U postgres some_database_name 
scp dump.sql development: 
rm dump.sql 
ssh development 
psql -U postgres -f dump.sql 
2

ho faticato un bel po 'e alla fine il metodo che mi ha permesso di farlo funzionare con Rails 4 è stato:

sul vostro vecchio server

sudo su - postgres 
pg_dump -c --inserts old_db_name > dump.sql 

ho dovuto usare l'utente postgres Linux per creare la discarica. inoltre ho dovuto usare -c per forzare la creazione del database sul nuovo server. --inserts dice di usare la sintassi INSERT(), che altrimenti non avrebbe funzionato per me :(

poi, sul nuovo server, simpy:

sudo su - postgres 
psql new_database_name < dump.sql 

per trasferire il file dump.sql tra il server Ho semplicemente usato il "gatto" per stampare il contenuto e poi "nano" per ricrearlo copiando il contenuto

Inoltre, il RUOLO che stavo usando sui due database era diverso, quindi ho dovuto trovare-sostituire tutto il proprietario nome nella discarica

13

pg_basebackup sembra essere th Il modo migliore per farlo ora, specialmente per i grandi database.

+7

Potresti fornire maggiori dettagli nella risposta, come un esempio? – Magnilex

+4

Questo funziona solo quando entrambe le macchine hanno le stesse versioni PG, comunque. –

+0

Le probabilità sono piccole per utilizzare una versione di database diversa per lo sviluppo e la produzione. L'ultima volta ho avuto una conversazione spiacevole con uno dei miei compagni di squadra mentre stava cercando di inviare un problema sul fatto che alcuni codici non funzionassero con PG 9.6 mentre in quel momento avevamo utilizzato 9,5 in produzione. Il backup di base è molto più veloce. Quindi pg_upgrade è la strada da percorrere se necessario. – Zorg

3

Eseguire questo comando con il nome del database, si desidera eseguire il backup, per eseguire il dump del DB.

pg_dump -U {user-name} {source_db} -f {dumpfilename.sql} 

eg. pg_dump -U postgres mydbname -f mydbnamedump.sql 

Ora scp questo file di dettagli nella macchina remota in cui si desidera copiare DB.

eg. scp mydbnamedump.sql [email protected]:~/some/folder/ 

Sulla macchina remota eseguire il comando seguente in ~/some/folder per ripristinare il DB.

psql -U {user-name} -d {desintation_db}-f {dumpfilename.sql} 

eg. psql -U postgres -d mynewdb -f mydbnamedump.sql 
16

Se siete alla ricerca di migrare tra le versioni (ad esempio, aggiornati Postgres e avete 9.1 in esecuzione su localhost: 5432 e 9.3 in esecuzione su localhost: 5434) è possibile eseguire:

pg_dumpall -p 5432 -U myuser91 | psql -U myuser94 -d postgres -p 5434 

Scopri i migration docs.

+0

Viene richiesta più volte la password (myuser91/postgres), c'è un modo per cui devo inserire la password una sola volta? –

+0

@MartinWeber Crea un file pgpass come da questo documento https://www.postgresql.org/docs/9.4/static/libpq-pgpass.html –

1

Lasciatemi condividere uno script di shell Linux per copiare i dati della tabella da un server a un altro server PostgreSQL.

Reference taken from this blog:

Linux Bash Shell Script per la migrazione dei dati tra i server PostgreSQL:

#!/bin/bash 
psql \ 
    -X \ 
    -U user_name \ 
    -h host_name1 \ 
    -d database_name \ 
    -c "\\copy tbl_Students to stdout" \ 
| \ 
psql \ 
    -X \ 
    -U user_name \ 
    -h host_name2 \ 
    -d database_name \ 
    -c "\\copy tbl_Students from stdin" 

io sono solo la migrazione dei dati; si prega di creare una tabella vuota a destinazione/secondo server database.

Questo è uno script di utilità. Inoltre, è possibile modificare lo script per uso generico, ad esempio aggiungendo parametri per nome_host, nome_database, nome_tabella e altri

Problemi correlati