Você não precisa se preocupar com todo esse tunelamento: -).
Apenas deixe o mysqldump transmitir seus dados usando a conexão SSH:
ssh usr@host mysqldump -u dbuser -ppasswd my-database-name >dumpfile
Eu gostaria de escrever um script de shell (atualmente usando o bash) para fazer o 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, portanto, preciso criar um túnel SSH antes de executar mysqldump
nos vários esquemas.
Eu posso criar um túnel sem nenhum problema, no entanto, gostaria de poder fechá-lo automaticamente após a conclusão do despejo 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, no entanto, se um dos primeiros dumps demorar mais do que isso, a conexão é fechada antes que os outros dumps sejam concluídos. Gostaria de manter arquivos separados para cada backup do esquema (por isso, evitará o --databases
do mysqldump por enquanto).
Alguma sugestão?
Adicione a opção -N, a opção -f e o sleep 600, isso abrirá o túnel sem executá-lo em segundo plano. Então você pode executar o comando com & amp ;, obter o PID e depois matar o processo ssh assim que os trabalhos forem concluídos.
/usr/bin/ssh -T -L 4444:127.0.0.1:3306 -l remoteuser 208.77.188.166 &
PID=$!
do_stuff
kill $PID
(Eu testei isso com bash - você pode precisar mudar as coisas para um shell diferente)
Uma pequena variação na sugestão do sleske, você pode canalizar a saída mysqldump através do gzip para comprimir antes da transferência:
ssh SSH-USER@SERVER mysqldump -u DB-USER -pDB-PASSWORD DB-NAME | gzip -c > DB-NAME.sql.gz
Como disse o sleske, por que se preocupar neste caso 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:
ssh -l remoteuser 208.77.188.166 mkfifo /tmp/PIPO
Então você escreve (bloqueando o pipe) no seu ssh para criar o túnel:
/usr/bin/ssh -T -f -L 4444:127.0.0.1:3306 -l remoteuser 208.77.188.166 "echo T > /tmp/PIPO"
Quando você quiser fechar o túnel, basta ler o canal:
ssh -l remoteuser 208.77.188.166 cat /tmp/PIPO
Et voilà!
É assim que eu escrevo,
scp backup-db.sh [email protected]:/root/backups/
ssh [email protected] exec /root/backups/backup-db.sh
Onde o 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
Finalmente, o arquivo pode ser scp
ed de volta com outro comando.
Sim, eu não canalizei nem fiz túnel.
Tags backup mysql ssh-tunnel