Исходные данные:
Необходимо делать бэкап чего-то раз в сутки. Нужно хранить последние 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 |
Все)