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

Как может цикл сценария на 30 дней?

У меня есть сценарий backup.sh, который создает резервную копию базы данных MySQL, а затем отправляет ее на удаленный сервер. Это отлично работает, и я могу запускать это один раз в день с помощью crontab без проблем.

Однако я хочу хранить резервные копии только за последние 30 дней, иначе через несколько месяцев у меня будут сотни избыточных файлов SQL. Я действительно не знаю, с чего начать. Единственный способ, который я могу придумать, - это иметь 31 подпапку, по одной для каждого дня месяца, а затем заменять каждый файл каждый день. Это немного меньше, чем идеально, и кажется немного грязным.

Ниже приведено содержимое моего файла backup.sh с явно удаленной ключевой информацией:

#!/bin/bash
today=`date +%Y-%m-%d.%H%M%S`

mysqldump -u rails -p******** rails > backups/backup-$today.sql
sshpass -p '********' scp backups/backup-$today.sql m***d@******.co.uk:custom_backups/backup-$today.sql

Можете ли вы использовать ssh на удаленной машине? Если да, вы можете написать сценарий remover.sh

#!/bin/bash
sshpass -p '********' ssh m***d@******.co.uk: "ls -t custom_backups/backup-*.sql | sed -n -e '31,1000 s#^#custom_backups/#p' | xargs rm -f"

Как это устроено?

ls -t custom_backups/backup-*.sql

Список всех файлов, отсортированных по времени - самый старый последний

| sed -n -e '31,1000 s#^#custom_backups/#p'

sed добавить префикс каталога (custom_backups/) и распечатать (спасибо p switch) только строки (имена файлов) от 31 до 1000.

| xargs rm -f

xargs удаляет перечисленные файлы. -f гарантия переключения не будет ошибок, если список пуст, т.е. у вас 30 или менее файлов резервных копий.

Скрипт удаляет самые старые файлы, только если у вас на удаленной машине не менее 30 резервных копий.

Я использую два решения этой проблемы:

  1. создавайте по одной резервной копии на каждый день, как указано выше. Проблема в том, что у вас не может быть старых резервных копий.
  2. создаю резервные копии в каталоге, а затем - с помощью скрипта - сохраняю (например):
    • резервные копии за последние 30 дней
    • резервные копии с каждого воскресенья не старше 1 года
    • резервные копии каждые 1 день месяца
    • все остальное - убрать.

Существует множество примеров скриптлетов, которые показывают, как это сделать, просто поиск в Интернете примеров «чередования резервных копий».

Кроме того, у вас, вероятно, есть по крайней мере шаблонный сценарий на той самой машине, на которой вы пытаетесь это сделать: большинство дистрибутивов имеют возможность ротации журналов, вы также можете найти вдохновение в этих сценариях :-)

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