用于备份目的的临时 SSH 隧道

Ben*_*enM 11 mysql backup ssh-tunnel

我想编写一个 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
Run Code Online (Sandbox Code Playgroud)

在连接保持打开 600 秒的情况下,显然,如果第一个转储之一花费的时间比这更长,那么在其他转储完成之前连接将关闭。我想为每个模式备份保留单独的文件(因此--databases现在将避免使用mysqldump)。

有什么建议?

sle*_*ske 32

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

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

ssh usr@host mysqldump -u dbuser -ppasswd my-database-name >dumpfile
Run Code Online (Sandbox Code Playgroud)

  • 回复关于远程服务器进程列表中的密码的标记评论“Mark Jul 6 '09 at 16:34”(我没有足够的声誉来添加评论):您可以在用户主页中创建一个 .my.cnf 文件远程服务器上的目录并在那里指定密码: [client] password="secret" 然后只需使用 mysqldump(此处使用压缩以加快数据传输):`$ ssh user@host "mysqldump foobar | gzip -9" | gzip -d > foobar.sql` (3认同)
  • +1 回避问题。这确实要求 mysqldump 在远程主机上可用,并且我相信在远程服务器进程列表上显示密码,但假设这些事情不是问题,这听起来像是一个更好的解决方案。 (2认同)

Mar*_*ark 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
Run Code Online (Sandbox Code Playgroud)

(我已经用 bash 对此进行了测试 - 您可能需要为不同的 shell 进行更改)