Eu gostaria de escrever um script de shell (atualmente usando o bash) para fazer backup automático do conteúdo de vários esquemas do MySQL em um servidor remoto. O servidor remoto está bloqueado para permitir apenas o acesso SSH, então eu tenho que criar um túnel SSH antes de executar mysqldump
nos vários esquemas.
Posso criar um túnel sem nenhum problema, mas gostaria de poder fechá-lo automaticamente após a conclusão do dump do banco de dados.
Atualmente, meu script está fazendo isso:
/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
Onde a conexão é mantida aberta por 600 segundos, obviamente, se um dos primeiros despejos demorar mais que isso, a conexão será fechada antes que os outros despejos sejam concluídos. Eu gostaria de reter arquivos separados para cada backup do esquema (para evitar o --databases
mysqldump por enquanto).
Alguma sugestão?
fonte
$ ssh user@host "mysqldump foobar | gzip -9" | gzip -d > foobar.sql
Adicione a opção -N, a opção -f e o sleep 600, isso abrirá o túnel sem executá-lo em segundo plano. Em seguida, você pode executar o comando com &, obter o PID e interromper o processo ssh após a conclusão dos trabalhos.
(Eu testei isso com o bash - pode ser necessário mudar as coisas para um shell diferente)
fonte
Uma pequena variação na sugestão de sleske, você pode canalizar a saída do mysqldump através do gzip para compactar antes da transferência:
fonte
Como disse sleske, por que se preocupar nesse caso em particular? No entanto, existe uma solução para controlar um túnel ssh no caso geral: use um pipe nomeado. Primeiro, crie o pipe assim:
Então você escreve (bloqueando o pipe) no seu ssh para criar o túnel:
Quando você quiser fechar o túnel, basta ler o pipe:
Et voilà!
fonte
É assim que eu escreveria,
Onde está o script,
Finalmente, o arquivo morto pode ser
scp
editado novamente com outro comando.Sim, eu não cano ou túnel.
fonte