我想编写一个 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 秒的情况下,很明显,如果第一个转储中的一个转储时间比这更长,则连接在其他转储完成之前关闭。我想为每个模式备份保留单独的文件(因此暂时避免使用--databases
mysqldump)。
有什么建议么?
你不需要为所有的隧道而烦恼:-)。
只需让 mysqldump 使用 SSH 连接流式传输其数据:
添加 -N 选项、-f 选项和 sleep 600,这将打开隧道而不在后台运行它。然后您可以使用 & 运行命令,获取 PID,然后在作业完成后终止 ssh 进程。
(我已经用 bash 对此进行了测试——您可能需要为不同的 shell 更改内容)
与 sleske 的建议略有不同,您可以通过 gzip 将 mysqldump 输出通过管道传输以在传输前进行压缩:
正如 sleske 所说,为什么要在这种特殊情况下打扰?但是,在一般情况下有一个控制 ssh 隧道的解决方案:使用命名管道。首先像这样创建管道:
然后在 ssh 中写入(阻塞到管道)以创建隧道:
当您想关闭隧道时,只需阅读管道:
瞧!
我就是这样写的
剧本在哪里,
最后,可以
scp
使用另一个命令来编辑存档。是的,我没有管道或隧道。