Назад | Перейти на главную страницу

Резервное копирование удаленной базы данных с помощью mysqldump

Я пытаюсь найти быстрый способ сделать резервную копию и загрузить удаленную базу данных mysql на свой локальный компьютер, используя только терминал. Удаленный сервер использует ключи ssh для аутентификации. Я могу сделать это, запустив семь последовательных команд на терминале, некоторые из которых выполняются на сервере, а другие - на моем локальном компьютере:

1) подключиться к удаленному серверу с помощью ключа ssh; 2) выгрузить базу данных в удаленный каталог; 3) выход с сервера; 4) загрузите резервную копию на локальную машину; 5) снова подключиться к серверу; 6) удалить резервную копию из удаленного каталога; 7) logout (выход)

#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).

Любая помощь приветствуется, спасибо.

Дайте 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

У меня есть сценарий, который я использую каждый день для сброса рабочего сервера на локальный.

     #!/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.