Sto cercando di copiare un database PostgreSQL di produzione su un server di sviluppo. Qual è il modo più rapido e semplice per farlo?
Sto cercando di copiare un database PostgreSQL di produzione su un server di sviluppo. Qual è il modo più rapido e semplice per farlo?
Risposte:
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 psql
o pg_dump
per 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
ssh remoteuser@remotehost "pg_dump -C dbname | bzip2" | bunzip2 | psql dbname
?
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
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
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 .
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_basebackup
funziona 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:
listen_addresses = '*'
per essere in grado di connettersi dal server di destinazione. Assicurarsi che la porta 5432 sia aperta per quella materia.max_wal_senders = 1
( -X fetch
), 2
per -X stream
(impostazione predefinita nel caso di PostgreSQL 12) o più.wal_level = replica
o superiore per poter impostare max_wal_senders > 0
.host replication postgres DST_IP/32 trust
in pg_hba.conf
. Ciò garantisce l'accesso al pg
cluster a chiunque dalla DST_IP
macchina. 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
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
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.
Scarica il tuo database: pg_dump database_name_name > backup.sql
Importa nuovamente il tuo database: psql db_name < backup.sql
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
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}}