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 mysqldump
contra 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 --databases
evitaré el de mysqldump por ahora).
¿Alguna sugerencia?
fuente
$ ssh user@host "mysqldump foobar | gzip -9" | gzip -d > foobar.sql
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.
(He probado esto con bash, es posible que deba cambiar las cosas para un shell diferente)
fuente
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:
fuente
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:
Luego escribes (bloqueando la tubería) en tu ssh para crear el túnel:
Cuando quieras cerrar el túnel, solo lee la tubería:
Et voilà!
fuente
Así es como lo escribiría,
Donde está el guión,
Finalmente, el archivo se puede
scp
volver a editar con otro comando.Sí, no pipa ni túnel.
fuente