使用mysqldump备份远程数据库

我试图实现一个快速的方式来做一个备份和远程mysql数据库下载到我的本地机器,只使用terminal。 远程服务器使用ssh密钥进行authentication。 我可以通过在terminal上运行七个连续的命令来完成,一些在服务器上执行,另一些在本地机器上执行:

1)使用ssh键连接远程服务器; 2)将数据库转储到远程目录; 3)从服务器注销; 4)将备份下载到我的本地机器; 5)再次连接到服务器; 6)从远程目录中删除备份; 7)注销

#1 ssh -i my_rsa_key my_user@my_domain.tld #2 mysqldump -u my_db_user -pmy_db_password my_db > my_path_to_backup_directory/backup.sql #3 logout #4 rsync -chavzP -e 'ssh -i my_rsa_key -C -c blowfish' my_user@my_domain.tld:/my_path_to_backup_directory/backup.sql /my_path_to_local_directory #5 ssh -i my_rsa_key my_user@my_domain.tld #6 rm my_path_to_backup_directory/backup.sql #7 logout 

问题1:这个工作stream程是否正常,或者是否有“干净”的方式? 问题2:是否可以在一个批次中自动执行这些命令,我​​只需要在terminalinput一个命令,完成所有七个步骤? 我已经尝试使用链接命令

 && 

但我想这是行不通的,因为我执行从本地机器(如rsync)的一部分命令和部分从远程(如mysqldump)。

所有的帮助表示感谢,谢谢。

ssh mysqldump命令运行,但不要将其redirect到一个文件。 这将把mysqldump stdout返回到你的本地机器,你可以把它redirect到本地文件。

 ssh -i my_rsa_key my_user@my_domain.tld 'mysqldump -u my_db_user -pmy_db_password my_db' > /local/path/to/store/backup.sql 

我有一个脚本,我每天使用我的生产服务器转储到我的本地。

  #!/bin/sh ### System Setup ### NOW=`date +%Y-%m-%d` KEEPDAYS=20 $localBackup=/backups/mysql # ### SSH Info ### SHOST="ssh.yourhost.com" SUSER="username" SDIR="/backup/mysql" # ### MySQL Setup ### MUSER="username" MPASS="password" MHOST="hostname" DBS="SCHEMA1 SCHEMA2 SCHEMA3" # ### Start MySQL Backup ### attempts=0 for db in $DBS # for each listed database do echo "Start $db" attempts=`expr $attempts + 1` # count the backup attempts ssh -C $SUSER@$SHOST mkdir $SDIR/$NOW #create the backup dir FILE=$SDIR/$NOW/$db.sql.gz # Set the backup filename # Dump the MySQL and gzip it up ssh -C $SUSER@$SHOST "mysqldump -q -u $MUSER -h $MHOST -p$MPASS $db | gzip -9 > $FILE" echo "End $db" done ### Make local dir with today's date mkdir /"$localBackup"/$NOW scp -C $SUSER@$SHOST:/$SDIR/$NOW/* /backups/mysql/$NOW # copy all the files to backup server ssh -C $SUSER@$SHOST rm -rf $SDIR/$NOW # delete files on db server # deleting of old files on backup ########################################################################### ################### Save last month's last backup (this month's first day) ######################### ########################################################################### dayToKeep=`date +%d` if [ "$dayToKeep" = "01" ]; then permanents="/"$localBackup"/permanents/" cp -rl /"$localBackup"/$NOW $permanents fi # Deletes everything older than $KEEPDAYS days find "$localBackup" -type d -path "$permanents" -prune -o -daystart -mtime +$KEEPDAYS -exec rm -rf {} \; 

我使用-C参数的SCP,但它不是必需的,因为转储已经被压缩,只是我习惯了。

我假设运行脚本的用户有一个没有密码的密钥(cron)。 如果不是,只需添加-i参数。