Túnel SSH temporal para propósitos de respaldo

11

Me gustaría escribir un script de shell (actualmente usando bash) para hacer una copia de seguridad automática del contenido de varios esquemas MySQL en un servidor remoto. El servidor remoto está bloqueado para permitir solo el acceso SSH, por lo que tengo que crear un túnel SSH antes de ejecutar mysqldumpcontra los diversos esquemas.

Puedo crear un túnel sin ningún problema, sin embargo, me gustaría poder cerrarlo automáticamente una vez que se haya completado el volcado de la base de datos.

Actualmente mi script está haciendo esto:

/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

Cuando la conexión se mantiene abierta durante 600 segundos, obviamente, sin embargo, si uno de los primeros volcados tarda más que eso, la conexión se cierra antes de que se completen los otros volcados. Me gustaría conservar archivos separados para cada copia de seguridad del esquema (por lo que --databasesevitaré el de mysqldump por ahora).

¿Alguna sugerencia?

BenM
fuente

Respuestas:

29

No necesita molestarse con todo ese túnel :-).

Simplemente deje que mysqldump transmita sus datos utilizando la conexión SSH:

ssh usr@host mysqldump -u dbuser -ppasswd my-database-name >dumpfile
sleske
fuente
1
+1 por eludir el problema. Esto requiere que mysqldump esté disponible en el host remoto, y creo que muestra la contraseña en la lista de procesos del servidor remoto, pero suponiendo que esas cosas no sean un problema, eso parece una solución mucho mejor.
Marcar el
3
En respuesta al comentario de marcas "Marque el 6 de julio de 2009 a las 16:34" sobre la contraseña en la lista de procesos del servidor remoto (no tengo suficiente reputación para agregar un comentario): puede crear un archivo .my.cnf en la página de inicio de los usuarios directorio en el servidor remoto y especifique la contraseña allí: [cliente] contraseña = "secreto" Luego simplemente use mysqldump (aquí con compresión para acelerar la transferencia de datos):$ ssh user@host "mysqldump foobar | gzip -9" | gzip -d > foobar.sql
Thomas Schuster
5

Agregue la opción -N, la opción -f y el sleep 600, esto abrirá el túnel sin ejecutarlo en segundo plano. Luego puede ejecutar el comando con &, obtener el PID y luego eliminar el proceso ssh una vez que se hayan completado los trabajos.

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

(He probado esto con bash, es posible que deba cambiar las cosas para un shell diferente)

marca
fuente
4

Una ligera variación en la sugerencia de sleske, puede canalizar la salida de mysqldump a través de gzip para comprimir antes de la transferencia:

ssh SSH-USER@SERVER mysqldump -u DB-USER -pDB-PASSWORD DB-NAME | gzip -c > DB-NAME.sql.gz
eethann
fuente
Sospecho que este comando no se comprime hasta DESPUÉS de la transferencia, es posible que deba citar el bit "mysql ... | gzip" para que la tubería se evalúe de forma remota
The Mighty Chris
3

Como dijo sleske, ¿por qué molestarse en este caso particular? Sin embargo, hay una solución para controlar un túnel ssh en el caso general: use una tubería con nombre. Primero cree la tubería de esta manera:

ssh -l remoteuser 208.77.188.166 mkfifo /tmp/PIPO

Luego escribes (bloqueando la tubería) en tu ssh para crear el túnel:

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

Cuando quieras cerrar el túnel, solo lee la tubería:

ssh -l remoteuser 208.77.188.166 cat /tmp/PIPO

Et voilà!

wazoox
fuente
2

Así es como lo escribiría,

scp backup-db.sh [email protected]:/root/backups/
ssh [email protected] exec /root/backups/backup-db.sh

Donde está el guión,

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

Finalmente, el archivo se puede scpvolver a editar con otro comando.
Sí, no pipa ni túnel.

nik
fuente