2015-04-15 18 views
14

Sto provando a pg_dump un database SQL su un server remoto nella nostra DMZ. Ci sono 2 problemi.pg_dump database postgres dal server remoto

1) non è rimasto molto spazio sul server remoto, quindi il normale comando eseguito per eseguire il backup locale del database pg_dump -C database > sqldatabase.sql.bak non funzionerà a causa di problemi di spazio.

2) anche io non posso correre l'altra versione del comando pg_dump per eseguire il dump del database da un server remoto al server locale utilizzando:

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

come il server è nel nostro DMZ e la porta 5432 è bloccata. Quello che sto cercando di vedere è se è possibile pg_dump del database e immediatamente salvarlo (ssh o qualche altro modulo) come file su un server remoto. Quello che stavo cercando era: pg_dump -C testdb | ssh [email protected] | > /home/admin/testdb.sql.bak

Qualcuno sa se ciò che sto cercando di ottenere è possibile?

+0

[non testati] (1) Impostare un netcat ascoltatore ** sulla macchina locale ** (con un numero porta che non è in uso o bloccato), ad esempio 'netcat -l -p 1234> il file & '. (2) ** dalla macchina remota **, fare: 'pg_dump ... | netcat your.local.ip 1234' – wildplasser

risposta

31

È possibile connettersi con ssh al server remoto, eseguire la connessione della chiamata pg_dump e inviare l'output allo stdout della macchina locale.

ssh [email protected]_machine "pg_dump -U dbuser -h localhost -C --column-inserts" \ 
>> backup_file_on_your_local_machine.sql 

Modifica: corretto un errore di battitura.

+0

Questo è molto più semplice del mio hack netcat. – wildplasser

+0

Grazie mille per risolvere il problema, il lavoro mi mancava il \ è tutto –

2

Una possibile soluzione - pipe through ssh - è stata menzionata.

È inoltre possibile che il server DB sia in ascolto sull'indirizzo pubblico inet, aggiungere una voce hostssl per la macchina di backup a pg_hba.conf, magari configurare un certificato client per la sicurezza e quindi eseguire semplicemente il dump sul client/backup macchina con pg_dump -h dbserver.example.com ...

Questo è più semplice per i backup non presidiati.

Per la configurazione della connessione (sslmode) vedere anche the supported environment variables.

+0

Sarebbe utile mostrare l'intero comando qui, dato che non riesco a capire come sia possibile ripristinare la macchina di destinazione in questo modo (ovviamente è possibile prima scaricare e poi ripristinare, ma ciò non corrisponde alla domanda) –

+0

Spiacente di non avere un semplice esempio di comando, la mia configurazione è abbastanza evoluta con i file di configurazione per ssh (per l'alternativa ssh pipe) e per psql con i nomi di servizio per il collegamento. Il comando è il problema? Devi solo aggiungere il nome host alla riga di comando. Preferirei pensare che il problema/attività sia la configurazione di TLS sul server! Una volta fatto, è semplicemente la riga di comando psql e pg_dump con un nome host diverso da localhost. –

0

Si può cercare di scaricare parte della tabella in un file nel computer locale come questo (assumere computer locale ha installato psql):

psql -h ${db_host} -p 5432 -U ${db_user} -d ${db_name} \ 
-c "\copy (SELECT * FROM my_table LIMIT 10000) to 'some_local_file.csv' csv;" 

Ed è possibile importare il file CSV esportato in un altro db tardi in questo modo:

COPY my_table FROM '/path/to/some_local_file.csv' WITH (FORMAT csv);