Copia del database PostgreSQL su un altro server


492

Sto cercando di copiare un database PostgreSQL di produzione su un server di sviluppo. Qual è il modo più rapido e semplice per farlo?

Risposte:


668

Non è necessario creare un file intermedio. Tu puoi 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 psqlo pg_dumpper connettersi a un host remoto.

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

Come ha detto Kornel, non è necessario eseguire il dump su un file intermedio, se vuoi lavorare compresso puoi usare un tunnel compresso

pg_dump -C dbname | bzip2 | ssh  remoteuser@remotehost "bunzip2 | psql dbname"

o

pg_dump -C dbname | ssh -C remoteuser@remotehost "psql dbname"

ma questa soluzione richiede anche di ottenere una sessione a entrambe le estremità.

Nota: pg_dump è per il backup ed psqlè per il ripristino. Quindi, il primo comando in questa risposta è copiare da locale a remoto e il secondo da remoto a locale . Altro -> https://www.postgresql.org/docs/9.6/app-pgdump.html


28
Non sono necessari file intermedi: è possibile utilizzare un tunnel SSH compresso o semplicemente pipe: pg_dump | bzip2 | ssh "bunzip2 | pg_restore"
Kornel,

4
Se usi bzip2, disattiva la compressione ssh per velocizzare il trasferimento!
lzap,

8
Come posso lavorare compresso se sto trasferendo i dati dalla produzione allo sviluppo? Ho impostato una connessione SSH dallo sviluppo alla produzione. Quindi sarebbe ssh remoteuser@remotehost "pg_dump -C dbname | bzip2" | bunzip2 | psql dbname?
Jeromy francese,

2
Mi aspetto che dovresti essere in grado di copiare un database remoto con il nome x in un database locale con il nome y, ma la soluzione di @ Ferran non funziona per questo ... Mi sembra che la soluzione di PorneL lasci i file bzip2 sul server, quindi non è un processo in un solo passaggio. Stando così le cose, immagino che lascerò cadere il database y, userò la parte "o" della soluzione di Ferran che ripristina x, quindi rinominerò il database in y.
Darin Peterson,

3
Questo è quello che ho fatto: (1) pg_dump -C -h remotehost -U remoteuser x | psql -h localhost -U localuser (2) dropdb y (3) psql -U postgres -c 'ALTER DATABASE "x" RENAME TO "y"'
Darin Peterson

131
pg_dump the_db_name > the_backup.sql

Quindi copia il backup sul tuo server di sviluppo, ripristina con:

psql the_new_dev_db < the_backup.sql

3
Qualcuno mi ha detto che questo può essere problematico: problemi di autorizzazioni che causano la morte del dump o del ripristino quando colpisce un grilletto?
Robin Barnes,

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

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

4
Per me, l'approccio sopra ha funzionato nel modo seguente: pg_dump -C -h host -U username db_name> / any_directory / dump_schema_and_data_file. E per il ripristino dal file: psql -h host -U username db_name <dump_schema_and_data_file
Ali Raza Bhayani

Ciò mi ha risparmiato MOLTO aggravamento. Ho usato Google Drive per spostare il file tra le macchine. Dato che avevo già il database sul nuovo computer (ma vuoto) ho avuto MOLTI errori di chiave duplicati. Tuttavia, è un ambiente di sviluppo e non hanno fatto nulla di male.
Chris Mendla,

37

Usa pg_dump e successivamente psql o pg_restore , a seconda che tu scelga le opzioni -Fp o -Fc su 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

22

Se stai cercando di migrare tra le versioni (ad esempio hai aggiornato postgres e 9.1 in esecuzione su localhost: 5432 e 9.3 in esecuzione su localhost: 5434) puoi eseguire:

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

Consulta i documenti di migrazione .


Mi viene richiesta la password (myuser91 / postgres) più volte, esiste un modo per cui devo inserire la password una sola volta?
Martin Weber,

@MartinWeber Crea un file pgpass come da questo documento postgresql.org/docs/9.4/static/libpq-pgpass.html
Scott Warren,

cosa succede se hanno entrambe le stesse porte?
ggnoredo,

Se si trovano su server diversi, è possibile utilizzare -h per specificare gli host.
Haroldo_OK

16

pg_basebackup sembra essere il modo migliore per farlo ora, specialmente per database di grandi dimensioni.

È possibile copiare un database da un server con la versione principale uguale o precedente. O più precisamente :

pg_basebackupfunziona con server della stessa versione precedente o precedente, fino a 9.1. Tuttavia, la modalità di streaming WAL ( -X stream) funziona solo con la versione 9.3 e successive del server e la modalità di formato tar ( --format=tar) della versione corrente funziona solo con la versione 9.5 o successiva del server.

Per questo è necessario sul server di origine:

  1. listen_addresses = '*'per essere in grado di connettersi dal server di destinazione. Assicurarsi che la porta 5432 sia aperta per quella materia.
  2. Almeno 1 connessione di replica disponibile: max_wal_senders = 1( -X fetch), 2per -X stream(impostazione predefinita nel caso di PostgreSQL 12) o più.
  3. wal_level = replicao superiore per poter impostare max_wal_senders > 0.
  4. host replication postgres DST_IP/32 trustin pg_hba.conf. Ciò garantisce l'accesso al pgcluster a chiunque dalla DST_IPmacchina. Potresti voler ricorrere a un'opzione più sicura.

Le modifiche 1, 2, 3 richiedono il riavvio del server, la modifica 4 richiede il ricaricamento.

Sul server di destinazione:

# systemctl stop postgresql@VERSION-NAME
postgres$ pg_basebackup -h SRC_IP -U postgres -D VERSION/NAME --progress
# systemctl start postgresql@VERSION-NAME

11
Potresti fornire maggiori dettagli nella tua risposta, come ad esempio un esempio?
Magnilex,

7
Questo funziona solo quando entrambe le macchine hanno le stesse versioni PG.
sm

Le possibilità sono poche di utilizzare versioni di database diverse per lo sviluppo e la produzione. L'ultima volta ho avuto una conversazione spiacevole con una delle mie compagne di squadra mentre cercava di inviare un problema per cui un codice non funzionava con PG 9.6 mentre in quel momento ne avevamo usati 9.5 in produzione. Il backup di base è molto più veloce. Quindi pg_upgrade è la strada da percorrere se necessario.
Zorg,

2
È probabile che desideri migrare a una versione più recente e non vuoi interrompere PostgreSQL.
x-yuri,

1
È probabile che ogni volta che aggiorni il tuo database, lo aggiorni su sviluppo e messa in scena prima di farlo sulla produzione.
Andrew Lorien,

8

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 dump sul computer remoto in cui si desidera copiare DB.

eg. scp mydbnamedump.sql user01@remotemachineip:~/some/folder/

Sulla macchina remota eseguire il comando seguente nella cartella ~ / some / per ripristinare il DB.

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

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

7

Ho faticato parecchio e alla fine il metodo che mi ha permesso di farlo funzionare con Rails 4 era:

sul tuo vecchio server

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

Ho dovuto usare l'utente Linux di Postgres per creare il dump. inoltre ho dovuto usare -c per forzare la creazione del database sul nuovo server. --inserti gli dice di usare la sintassi INSERT () che altrimenti non funzionerebbe per me :(

quindi, sul nuovo server, semplificare:

sudo su - postgres
psql new_database_name < dump.sql

per trasferire il file dump.sql tra server ho semplicemente usato "cat" per stampare il contenuto e poi "nano" per ricrearlo copypasting il contenuto.

Inoltre, il ruolo che stavo usando sui due database era diverso, quindi ho dovuto trovare e sostituire tutto il nome del proprietario nel dump.


6

Scarica il tuo database: pg_dump database_name_name > backup.sql


Importa nuovamente il tuo database: psql db_name < backup.sql


5

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

Riferimento tratto da questo blog:

Linux Bash Shell Script per la migrazione dei dati tra 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"

Sto solo migrando i dati; creare una tabella vuota sul server di database di destinazione / secondo.

Questo è uno script di utilità. Inoltre, è possibile modificare lo script per uso generico, ad esempio aggiungendo parametri per host_name, database_name, table_name e altri


5

La risposta accettata è corretta, ma se si desidera evitare di inserire la password in modo interattivo, è possibile utilizzare questa:

PGPASSWORD={{export_db_password}} pg_dump --create -h {{export_db_host}} -U {{export_db_user}} {{export_db_name}} | PGPASSWORD={{import_db_password}} psql -h {{import_db_host}} -U {{import_db_user}} {{import_db_name}}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.