¿Cómo hacer un script para migrar una base de datos usando un túnel SSH?

7

Estoy tratando de crear un sync.sh Script que coordina con nuestro control de versión menos que ideal para nuestro sitio web. Este script migrará una copia en vivo de la base de datos a nuestro entorno de desarrollo y un par de cosas más. Estoy teniendo problemas con la parte de migración de mysql.

Este script se ejecuta en una máquina de desarrollo. remote es el anfitrión en vivo.

# --------------
# 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
# ...

Cuando acabo de ejecutar la parte mysql de la secuencia de comandos, obtengo esta salida:

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

Tenemos configuración de teclas ssh y puedo ssh al control remoto correctamente. Sin embargo, cuando se ejecuta en el contexto del script, las cosas van mal. Creo que soy un total bash noob. Supongo que si simplemente cambio la estructura de mi enfoque, no debería tener ningún problema. Simplemente no estoy seguro de cómo hacer eso ...

user633183
fuente

Respuestas:

7

Simplemente tire del volcado con un comando:

ssh usuario @ host 'mysqldump -u -p databasename' & gt; /path/to/local/file.sql

También puede comprimir estos también si su base de datos es grande:

ssh usuario @ host 'mysqldump -u -p databasename | gzip '& gt; /path/to/local/file.sql.gz

y luego gunzip después.

InChargeOfIT
fuente
Oh, maldita sea, parece que no vi el bosque por los árboles ;-)
Marian
1
Esto requiere que mysqldump está instalado en la máquina remota y es la versión deseada, etc.
AndreKR
4

los ssh -L 3307:remote:3306 user@remote el comando nunca volverá, porque solo abrirá un shell y lo mantendrá abierto.

SSH se comporta de la siguiente manera: Mantiene la conexión abierta mientras se ejecute un comando o se use el túnel. Entonces lo que quieres hacer es ssh user@remote sleep 10 &. Esto le da al comando mysqldump el tiempo suficiente para abrir la conexión, pero tan pronto como mysqldump cierra esa conexión, el túnel no se utiliza y SSH sale.

por cierto, puede que tenga que usar 3307: localhost: 3306, si el servidor no permite conexiones externas. (Esto funciona porque el nombre de host se resuelve en el lado del servidor, no en su cliente)

Marian
fuente
1
Utilizando -f en lugar de & permite ingresar una contraseña primero
AndreKR
0

Quizás se justifique otro enfoque: dos guiones. La secuencia de comandos A sería la secuencia de comandos que debe ejecutarse en el host remoto. El script B sería un script de control que 1) copia Sctipt A al servidor remoto, 2) SSHs al servidor remoto y ejecuta el script copiado, 3) copia el archivo de volcado resultante y 4) carga la db local

uSlackr
fuente