临时SSH隧道,用于备份


11

我想编写一个shell脚本(当前使用bash)来自动备份远程服务器上几个MySQL模式的内容。远程服务器被锁定为仅允许SSH访问,因此我必须在mysqldump针对各种模式运行之前创建SSH隧道。

我可以毫无问题地创建隧道,但是我希望能够在数据库转储完成后自动关闭它。

目前,我的脚本正在执行此操作:

/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秒钟的情况下,显然,如果第一个转储花费的时间长于连接转储的时间,则在其他转储完成之前关闭连接。我想为每个架构备份保留单独的文件(因此暂时避免使用--databasesmysqldump)。

有什么建议?

Answers:


29

您无需为所有隧道操作烦恼:-)。

只需让mysqldump使用SSH连接流式传输其数据即可:

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

1
+1以避开此问题。这确实要求mysqldump在远程主机上可用,并且我相信会在远程服务器进程列表上显示密码,但是假设这些都不是问题,那听起来是一个更好的解决方案。
标记

3
回应关于远程服务器进程列表中密码的标记注释“ 09年7月6日标记为16:34”(我没有足够的声誉来添加注释):您可以在用户主目录中创建一个.my.cnf文件。远程服务器上的目录,并在其中指定密码:[client] password =“ secret”然后只需使用mysqldump(此处使用压缩功能以加快数据传输速度):$ ssh user@host "mysqldump foobar | gzip -9" | gzip -d > foobar.sql
Thomas Schuster

5

添加-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

(我已经使用bash进行了测试-您可能需要为其他shell进行更改)


4

与sleske的建议略有不同,您可以在传输前通过gzip将mysqldump输出通过管道压缩以进行压缩:

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

我怀疑该命令在传输之后才会压缩,您可能需要引用“ mysql ... | gzip”位,以便对管道进行远程评估
The Mighty Chris

3

正如sleske所说,在这种特殊情况下为什么要打扰?但是,在一般情况下,有一种控制ssh隧道的解决方案:使用命名管道。首先创建这样的管道:

ssh -l remoteuser 208.77.188.166 mkfifo /tmp/PIPO

然后在ssh中写入(阻塞到管道)以创建隧道:

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

当您想关闭隧道时,只需阅读管道:

ssh -l remoteuser 208.77.188.166 cat /tmp/PIPO

等等!


2

我就是这样写的

scp backup-db.sh remoteuser@208.77.188.166:/root/backups/
ssh remoteuser@208.77.188.166 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

最后,可以scp使用另一个命令来编辑存档。
是的,我没有管道或隧道。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.