Как можно зациклить скрипт на 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

3 ответа

Можете ли вы 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 переключатель) только строки (имена файлов) в диапазоне от 31 до 1000.

| xargs rm -f

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

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

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

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

Существует множество примеров скриплетов, которые показывают, как это сделать, просто веб-поиск примеров "ротации резервных копий".

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

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

Другие вопросы по тегам