Tunnel SSH temporaneo a scopo di backup


11

Vorrei scrivere uno script di shell (attualmente usando bash) per eseguire automaticamente il backup del contenuto di diversi schemi MySQL su un server remoto. Il server remoto è bloccato per consentire solo l'accesso SSH, quindi devo creare un tunnel SSH prima di eseguire mysqldumpcontro i vari schemi.

Posso creare un tunnel senza alcun problema, tuttavia mi piacerebbe essere in grado di chiuderlo automaticamente dopo il completamento del dump del database.

Attualmente la mia sceneggiatura sta facendo questo:

/usr/bin/ssh -T -f -L 4444:127.0.0.1:3306 -l remoteuser 208.77.188.166 sleep 600

/usr/bin/mysqldump --compress -h 127.0.0.1 -P 4444 -u user -ppassword db1 | gzip > /root/backups/snapshot/db1.sql.gz

/usr/bin/mysqldump --compress -h 127.0.0.1 -P 4444 -u user -ppassword db2 | gzip > /root/backups/snapshot/db2.sql.gz

/usr/bin/mysqldump --compress -h 127.0.0.1 -P 4444 -u user -ppassword db3 | gzip > /root/backups/snapshot/db3.sql.gz

Se la connessione viene mantenuta aperta per 600 secondi, ovviamente se uno dei primi dump richiede più tempo, la connessione viene chiusa prima del completamento degli altri dump. Vorrei conservare file separati per ogni backup dello schema (quindi --databasesper il momento eviterò di mysqldump).

Eventuali suggerimenti?

Risposte:


29

Non devi preoccuparti di tutto quel tunneling :-).

Lascia che mysqldump esegua lo streaming dei suoi dati utilizzando la connessione SSH:

ssh usr@host mysqldump -u dbuser -ppasswd my-database-name >dumpfile

1
+1 per evitare il problema. Ciò richiede che mysqldump sia disponibile sull'host remoto e credo che mostri la password nell'elenco dei processi del server remoto, ma supponendo che queste cose non siano un problema, sembra una soluzione molto migliore.
Segna il

3
In risposta al contrassegno commenta "Mark 6 '09 alle 16:34" sulla password nell'elenco dei processi del server remoto (non ho abbastanza reputazione per aggiungere un commento): puoi creare un file .my.cnf nella home degli utenti directory sul server remoto e specifica lì la password: [client] password = "secret" Quindi usa mysqldump (qui con la compressione per velocizzare il trasferimento dei dati):$ ssh user@host "mysqldump foobar | gzip -9" | gzip -d > foobar.sql
Thomas Schuster

5

Aggiungi l'opzione -N, l'opzione -f e lo sleep 600, questo aprirà il tunnel senza eseguirlo in background. Quindi è possibile eseguire il comando con &, ottenere il PID, quindi terminare il processo ssh una volta completati i lavori.

/usr/bin/ssh -T -L 4444:127.0.0.1:3306 -l remoteuser 208.77.188.166 &
PID=$!
do_stuff
kill $PID

(L'ho provato con bash - potrebbe essere necessario cambiare le cose per una shell diversa)


4

Una leggera variazione sul suggerimento di sleske, è possibile reindirizzare l'output di mysqldump tramite gzip per comprimerlo prima del trasferimento:

ssh SSH-USER@SERVER mysqldump -u DB-USER -pDB-PASSWORD DB-NAME | gzip -c > DB-NAME.sql.gz

Ho il sospetto che questo comando non comprima fino a DOPO il trasferimento, potrebbe essere necessario citare il bit "mysql ... | gzip" in modo che la pipe venga valutata in remoto
The Mighty Chris,

3

Come ha detto sleske, perché preoccuparsi di questo caso particolare? Tuttavia, esiste una soluzione per controllare un tunnel ssh nel caso generale: utilizzare una pipe denominata. Per prima cosa crea la pipe in questo modo:

ssh -l remoteuser 208.77.188.166 mkfifo /tmp/PIPO

Quindi scrivi (bloccando sulla pipe) nel tuo ssh per creare il tunnel:

/usr/bin/ssh -T -f -L 4444:127.0.0.1:3306 -l remoteuser 208.77.188.166 "echo T > /tmp/PIPO"

Quando vuoi chiudere il tunnel, leggi la pipe:

ssh -l remoteuser 208.77.188.166 cat /tmp/PIPO

Et voilà!


2

È così che lo scriverei

scp backup-db.sh remoteuser@208.77.188.166:/root/backups/
ssh remoteuser@208.77.188.166 exec /root/backups/backup-db.sh

Dov'è la sceneggiatura,

#!/bin/sh
# backup-db.sh
DUMPARGS=--compress -h 127.0.0.1 -P 4444 -u user -ppassword
BACKUP_PATH=/root/backups/snapshot

/usr/bin/mysqldump $DUMPARGS db1 | bzip2 > $BACKUP_PATH/db1.sql.bz2
/usr/bin/mysqldump $DUMPARGS db2 | bzip2 > $BACKUP_PATH/db2.sql.bz2
/usr/bin/mysqldump $DUMPARGS db3 | bzip2 > $BACKUP_PATH/db3.sql.bz2

Infine, è possibile scpripristinare l'archivio con un altro comando.
Sì, non ho fatto pipa o tunnel.

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.