Como fazer o script de uma migração de banco de dados usando um túnel SSH?

7

Estou tentando criar um script sync.sh que coordena com nosso controle de versão abaixo do ideal para o nosso site. Este script irá migrar uma cópia ativa do banco de dados para o nosso ambiente de desenvolvimento e algumas outras coisas. Estou tendo problemas com a parte de migração do mysql.

Este script é executado em uma máquina de desenvolvimento. remote é o host ativo.

# --------------
# database

# ssh tunnel
ssh -L 3307:remote:3306 user@remote

# mysql dump
mysqldump -u someuser -h remote -P 3307 -p"p4ssw0rd" db > localfile.sql

# somehow close ssh tunnel ???

# populate local db with sql dump file
mysql -ulocal db < localfile.sql

# -----------------
# other sync stuff
# ...

Quando apenas executo a parte do mysql do script, recebo esta saída:

Pseudo-terminal will not be allocated because stdin is not a terminal.
Enter password: 

Temos a configuração das chaves ssh e posso enviar ssh para o controle remoto corretamente. No entanto, quando executado no contexto do script, as coisas estão dando errado. Eu acho que sou apenas um noob total. Eu estou supondo que se eu simplesmente mudar a estrutura da minha abordagem, eu não deveria ter nenhum problema. Eu só não sei como fazer isso ...

    
por user633183 14.03.2012 / 17:37

3 respostas

7

Basta puxar o lixo com um comando:

ssh user@host 'mysqldump -u -p databasename' > /path/to/local/file.sql

Você também pode compactar estes também se seu banco de dados for grande:

ssh user@host 'mysqldump -u -p databasename | gzip' > /path/to/local/file.sql.gz

e depois gunzip depois.

    
por 14.03.2012 / 18:23
4

O comando ssh -L 3307:remote:3306 user@remote nunca retornará, porque ele abrirá um shell e o manterá aberto.

O SSH se comporta da seguinte maneira: Ele mantém a conexão aberta enquanto um comando é executado ou o túnel é usado. Então, o que você quer fazer é ssh user@remote sleep 10 & . Isso dá ao comando mysqldump tempo suficiente para abrir a conexão, mas assim que o mysqldump fecha essa conexão, o túnel não é usado e o SSH sai.

btw, você pode ter que usar 3307: localhost: 3306, se o servidor não permitir conexões externas. (Isso funciona porque o nome do host é resolvido no lado do servidor, não no seu cliente)

    
por 14.03.2012 / 18:05
0

Talvez outra abordagem seja justificável - dois scripts. Script A seria o script que precisa ser executado no host remoto. Script B seria um script de controle que 1) copia Sctipt A para o servidor remoto, 2) SSHs para o servidor remoto e executa o script copiado, 3) copia o arquivo de despejo resultante de volta e 4) carrega o banco de dados local

    
por 14.03.2012 / 18:15