临时SSH隧道用于备份目的

我想编写一个shell脚本(目前使用bash)来自动备份远程服务器上几个MySQL模式的内容。 远程服务器被locking,只允许SSH访问,所以我必须创build一个SSH隧道,然后对各种模式运行mysqldump

我可以创build一个没有任何问题的隧道,但我希望能够在数据库转储完成后自动closures它。

目前我的脚本是这样做的:

 /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 

在连接保持打开600秒的情况下,很显然,如果第一个转储中的一个花费比这更长的时间,那么在其他转储完成之前连接closures。 我想为每个模式备份保留单独的文件(所以现在可以避免使用mysqldump的数据库)。

有什么build议么?

你不需要打扰所有的隧道:-)。

让mysqldump使用SSH连接来传输数据:

 ssh usr@host mysqldump -u dbuser -ppasswd my-database-name >dumpfile 

添加-N选项,-f选项和sleep 600,这将打开隧道而不在后台运行。 然后你可以用&运行命令,得到PID,然后在作业完成后杀掉ssh进程。

 /usr/bin/ssh -T -L 4444:127.0.0.1:3306 -l remoteuser 208.77.188.166 & PID=$! do_stuff kill $PID 

(我已经用bashtesting过了 – 你可能需要改变一个不同的shell)

对sleske的build议略有差异,你可以通过gzip压缩mysqldump输出到压缩之前进行压缩:

 ssh SSH-USER@SERVER mysqldump -u DB-USER -pDB-PASSWORD DB-NAME | gzip -c > DB-NAME.sql.gz 

正如sleske所说,为什么在这个特殊情况下呢? 但是,在一般情况下,有一个解决scheme来控制SSH隧道:使用命名pipe道。 首先像这样创buildpipe道:

 ssh -l remoteuser 208.77.188.166 mkfifo /tmp/PIPO 

然后你在你的ssh中写入(阻塞到pipe道)来创build隧道:

 /usr/bin/ssh -T -f -L 4444:127.0.0.1:3306 -l remoteuser 208.77.188.166 "echo T > /tmp/PIPO" 

当你想closures隧道时,只需要阅读pipe道:

 ssh -l remoteuser 208.77.188.166 cat /tmp/PIPO 

Etvoilà!

这是我如何写它,

 scp backup-db.sh [email protected]:/root/backups/ ssh [email protected] exec /root/backups/backup-db.sh 

脚本在哪里,

 #!/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 

最后,档案可以用另一个命令回来。
是的,我没有pipe道或隧道。