Бэкап на sftp с ротацией

Исходные данные:
Необходимо делать бэкап чего-то раз в сутки. Нужно хранить последние 5 версий бэкапа. Бэкап надо сохранять на сервер бэкапа, доступ к которому предоставлен по sftp (в моем случае еще и ключа на sftp нет, будем делать по паролю. Если у вас ключ – поздравляю! Вы счастливчик!).
Проверяем установлен ли у нас пакет sshfs. Если нет – устанавливаем. Для RHEL/CentOS:

sudo yum install sshfs

Debian/Ubuntu:

sudo apt-get install sshfs

Cоздаем папку для монтирования:

sudo mkdir /mnt/sftp

Создаем скрипт sshfs_mount.sh для монтирования sftp к нашей файловой системе.Если у вас авторизация по ключу для sftp, содержание файла скрипта будет следующим:

#!/bin/bash
sshfs user@my.sftp.backup.server:/ /mnt/sftp/

Если вам необходимо авторизоваться по паролю, то можно сделать так:

#!/bin/bash
sshfs -o password_stdin user@my.sftp.backup.server:/ /mnt/sftp/ <<< "my_password"

Вообще, можно не выносить монтирование в отдельный скрипт, а просто команду с маунтом вписать в скрипт бэкапа (перед командой переноса файлов на sftp, естественно). Но мне удобнее делать именно так.

Теперь, когда мы смонтировали sftp в /mnt/sftp/, можем осуществить ротацию бэкапов на sftp.
Для этого мы не будем использовать время создания/изменения. Все наши бэкапы сейчас имеют имена вида YY-MM-DD.name.backup, которые можно отсортировать и удалить лишнее.
Бэкапы должны складываться в отдельную папку, где ничего кроме них не будет лежать. Это важно! Иначе вы просто наудаляете лишнего. У нас эти бэкапы складываются в /mnt/sftp/mysql_backup/
Назовем его mysql_backup.sh:

#!/bin/bash
BACKUP_DATE=`date +%Y-%M-%D_%H:%M:%S`
 
mysqldump -u root --databases table1 > /mnt/sftp/mysql_backup/$BACKUP_DATE.mysql/$BACKUP_DATE.table1.sql
mysqldump -u root --databases table2 > /mnt/sftp/mysql_backup/$BACKUP_DATE.mysql/$BACKUP_DATE.table2.sql
mysqldump -u root --databases table3 > /mnt/sftp/mysql_backup/$BACKUP_DATE.mysql/$BACKUP_DATE.table3.sql

Теперь, когда мы смонтировали sftp в /mnt/sftp/ и скопировали туда свежие дампы, можем осуществить ротацию бэкапов.
Все наши бэкапы сейчас имеют имена вида YY-MM-DD.name.backup, которые можно отсортировать и удалить лишнее. Я хочу хранить 4 последние версии.
Пусть это будет скрипт с именем rotate_backup.sh и следующим содержанием:

#!/bin/bash
 
MAX_COPIES_COUNTER=4 # Количество версий, которое вы хотите хранить
DIRECTORY=/mnt/sftp/mysql_backup # Директория, в которой лежат бэкапы
 
COPIES_COUNTER=`ls $DIRECTORY | wc -l` # Считаем количество папок с бэкапами
 
if [ $COPIES_COUNTER -gt $MAX_COPIES_COUNTER ] # Если текущее количество больше, чем то, что мы хотим, то
then
NEED_TO_DELETE_COUNTER=$(($(ls $DIRECTORY | wc -l)-$MAX_COPIES_COUNTER)) # Считаем сколько необходимо удалить
for (( i==1; i<$NEED_TO_DELETE_COUNTER; i++ ))
do
rm -rf $DIRECTORY/$(ls $DIRECTORY | sort | head -n 1) # Выводим список, сортируем, удаляем лишнее начиная с самого давнего
done
fi

Теперь эти три скрипта необходимо добавить в крон. Сначала sshfs_mount.sh и mysql_backup.sh. И где-нибудь потом rotate_backup.sh.
Выполним

crontab -e

И внесем их в крон:

9 0 * * * /bin/bash /home/Lector/sshfs_mount.sh
10 0 * * * /bin/bash /home/Lector/mysql_backup.sh
10 1 * * * /bin/bash /home/Lector/rotate_backup.sh

Все)

Добавить комментарий

Ваш адрес email не будет опубликован.