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)
添加 -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 进行更改)