Tunnel SSH temporaire à des fins de sauvegarde


11

Je voudrais écrire un script shell (utilisant actuellement bash) pour sauvegarder automatiquement le contenu de plusieurs schémas MySQL sur un serveur distant. Le serveur distant est verrouillé pour autoriser uniquement l'accès SSH, je dois donc créer un tunnel SSH avant de courir mysqldumpcontre les différents schémas.

Je peux créer un tunnel sans aucun problème, mais j'aimerais pouvoir le fermer automatiquement une fois le vidage de la base de données terminé.

Actuellement mon script fait ceci:

/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

Lorsque la connexion est maintenue ouverte pendant 600 secondes, il est évident cependant que si l'un des premiers vidages prend plus de temps, la connexion est fermée avant la fin des autres vidages. Je voudrais conserver des fichiers séparés pour chaque sauvegarde de schéma (évitez donc le --databasesmysqldump pour l'instant).

Aucune suggestion?

Réponses:


29

Vous n'avez pas besoin de vous embêter avec tout ce tunneling :-).

Laissez simplement mysqldump diffuser ses données en utilisant la connexion SSH:

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

1
+1 pour avoir évité le problème. Cela nécessite que mysqldump soit disponible sur l'hôte distant, et je pense que le mot de passe apparaît sur la liste des processus du serveur distant, mais en supposant que ces choses ne sont pas un problème, cela semble être une bien meilleure solution.
Mark

3
En réponse au commentaire des marqueurs "Mark Jul 6 '09 à 16:34" sur le mot de passe dans la liste des processus du serveur distant (je n'ai pas assez de réputation pour ajouter un commentaire): Vous pouvez créer un fichier .my.cnf dans la maison des utilisateurs répertoire sur le serveur distant et spécifiez le mot de passe ici: [client] password = "secret" Ensuite, utilisez simplement mysqldump (ici avec compression pour accélérer le transfert de données):$ ssh user@host "mysqldump foobar | gzip -9" | gzip -d > foobar.sql
Thomas Schuster

5

Ajoutez l'option -N, l'option -f et le sleep 600, cela ouvrira le tunnel sans l'exécuter en arrière-plan. Ensuite, vous pouvez exécuter la commande avec &, obtenir le PID, puis tuer le processus ssh une fois les travaux terminés.

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

(J'ai testé cela avec bash - vous devrez peut-être changer les choses pour un autre shell)


4

Une légère variation sur la suggestion de sleske, vous pouvez diriger la sortie mysqldump via gzip pour compresser avant le transfert:

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

Je soupçonne que cette commande ne se comprime qu'après le transfert, vous devrez peut-être citer le bit "mysql ... | gzip" pour que le tuyau soit évalué à distance
The Mighty Chris

3

Comme l'a dit Sleske, pourquoi s'embêter dans ce cas particulier? Cependant il existe une solution pour contrôler un tunnel ssh dans le cas général: utilisez un tube nommé. Créez d'abord le tuyau comme ceci:

ssh -l remoteuser 208.77.188.166 mkfifo /tmp/PIPO

Ensuite, vous écrivez (bloquant le tuyau) dans votre ssh pour créer le tunnel:

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

Lorsque vous souhaitez fermer le tunnel, lisez simplement le tuyau:

ssh -l remoteuser 208.77.188.166 cat /tmp/PIPO

Et voilà!


2

Voilà comment je l'écrirais,

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

Où se trouve le script,

#!/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

Enfin, l'archive peut être scpéditée avec une autre commande.
Oui, je n'ai ni pipe ni tunnel.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.