使用 mysqldump 备份远程数据库

使用 mysqldump 备份远程数据库

我正在尝试实现一种快速备份并将远程 mysql 数据库下载到本地计算机的方法,只需使用终端即可。远程服务器使用 ssh 密钥进行身份验证。我可以通过在终端上运行七个连续命令来实现这一点,其中一些命令在服务器上执行,其他命令则从我的本地计算机执行:

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:这个工作流程可以吗?或者有没有“更干净”的方法?问题 2:我可以在单个批处理中自动执行这些命令吗?我只需在终端中输入一个命令即可完成所有七个步骤?我尝试使用以下方法链接命令

&&

但我猜它不起作用,因为我正在从本地机器执行部分命令(例如 rsync),并从远程执行部分命令(例如 mysqldump)。

感谢所有帮助,谢谢。

答案1

给出运行ssh命令mysqldump但不要将其重定向到文件。这stdout将从mysqldump后台带回您的本地计算机,然后您可以将其重定向到本地文件。

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

答案2

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

     #!/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 {} \;

我对 scp 使用了 -C 参数,但由于转储已经被压缩,所以不需要它,只是我已经习惯了它。

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

相关内容