我想编写一个 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)。
有什么建议么?
答案1
您不需要为所有这些隧道而烦恼:-)。
只需让 mysqldump 使用 SSH 连接传输其数据:
ssh usr@host mysqldump -u dbuser -ppasswd my-database-name >dumpfile
答案2
添加 -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 进行一些更改)
答案3
对 sleske 的建议稍作修改,您可以通过 gzip 管道传输 mysqldump 输出,以便在传输之前进行压缩:
ssh SSH-USER@SERVER mysqldump -u DB-USER -pDB-PASSWORD DB-NAME | gzip -c > DB-NAME.sql.gz
答案4
我会这样写,
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
scp
最后,可以使用另一个命令重新编辑存档。
是的,我没有使用管道或隧道。