Возрастающий файл создает резервную копию по дате

Вы пишете первую программу на первой строке.

Вы пишете вторую программу на второй строке.

И Вы повторяетесь.

3
31.05.2014, 11:24
1 ответ

Я не использовал для этого никаких специализированных программ, но это довольно легко организовать и точно настроить с помощью комбинации cron, bash, tar (инкрементные дампы) и/или rsync. На мой взгляд, есть два оптимальных решения, и я использую оба или одно из них в зависимости от контекста. Я думаю, что первое решение будет более подходящим для вас, но я опишу оба здесь.

Инкрементные tar-архивы

Ядром этого решения является сценарий, который может выглядеть примерно так:

#!/bin/bash

# You will need to set the variables $EXCLUDE, $DATA and $BACKUPS
# as environment variables, in ~/.bashrc or somewhere.

OPTS="--create --no-check-device --bzip2 --verbose -X $EXCLUDE"
for d in `ls $DATA`; do
    SNAPSHOT=$BACKUPS/$d.snar
    if [ $1 == full ]; then
        echo "Archiving $d (full)..."
        rm -rvf $SNAPSHOT
        ARCHIVE=$DATA/$d.`date --iso-8601`.full.tar.bz2
        tar $OPTS --file=$ARCHIVE --listed-incremental=$SNAPSHOT $DATA/$d
    fi
    if [ $1 == increment ]; then
        echo "Archiving data/$d (increment)..."
        ARCHIVE=$DATA/$d.`date --iso-8601`.tar.bz2
        tar $OPTS --file=$ARCHIVE --listed-incremental=$SNAPSHOT $DATA/$d
    fi
done

Здесь предполагается, что в $DATA есть подкаталоги, и резервное копирование каждого из них производится в отдельный архив. Если ваша настройка отличается, настройте сценарий.

Вы можете запланировать резервное копирование в crontab следующим образом:

# m  h  dom mon dow   command
  44 1  1   */2 *     ~/bin/backup_data full > ~/backups/data/logs/`date --iso-8601`.full.log 2>&1
  44 5  *   *   *     ~/bin/backup_data increment > ~/backups/data/logs/`date --iso-8601`.log 2>&1

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

Что касается синхронизации между машинами и удаления старых файлов, вам следует отделить эту задачу от самого резервного копирования, поскольку они действительно ортогональны. Конечно, для синхронизации используйте rsync, без опции --delete, чтобы не потерять данные на большом внешнем диске. Поэтому ваша команда для этого может быть такой:

rsync -av /backups/data /mnt/external

если внешний диск смонтирован на ноутбуке. В противном случае вам нужно будет сделать это по сети следующим образом:

rsync -av /backups/data user@external:/backups/data

Если вы хотите очистить архивы старше 90 дней с вашего ноутбука, вы можете сделать это следующим образом:

find /path/to/files -type f -mtime +90 -delete

Опять же, внесите эти вещи в ваш кронтаб.

Инкрементное резервное копирование с помощью rsync

Вы можете использовать только rsync для инкрементного резервного копирования. Мне особенно нравится использовать для этого снимки с временной меткой и жесткие ссылки, и это всего лишь одна команда. Вот пример, близкий к тому, что я обычно использую:

rsync --verbose --progress --stats --human-readable --archive --link-dest=/backups/data/`date --iso-8601 -d "one day ago"` /data/ /backups/data/`date --iso-8601`/

который в основном создает жесткие ссылки на снимок предыдущего дня (тот, который задан --link-dest) для файлов, которые не изменились. Если вы будете работать нерегулярно, вы можете использовать символическую ссылку, указывающую на последний снимок, и обновлять эту ссылку после резервного копирования, например, так:

rsync --verbose --progress --stats --human-readable --archive --link-dest=/backups/data/last /data/ /backups/data/`date --iso-8601`/ && rm -rvf /backups/data/last && ln -vs /backups/data/`date --iso-8601`/ /backups/data/last

Кроме того, вам нужно будет организовать синхронизацию с внешним диском и удалить старые снимки. В целом это делается так же, как и в первом решении, которое я описал выше. Однако при rsyncing моментальных снимков между машинами обязательно используйте опции -H, чтобы сохранить жесткие ссылки.

Резюме

По сравнению с решением, использующим tar, второй вариант, на мой взгляд, несколько проще в управлении и имеет все файлы доступными в любое время. Использование архивов, с другой стороны, позволяет использовать сжатие, использует меньше inodes и имеет другие преимущества на несерверных машинах.

Опять же, по возможности делайте все это в crontab, чтобы не помнить об этом. Если ноутбук не включен постоянно, выберите время, когда он часто используется, и, возможно, делайте это несколько раз в день, чтобы хотя бы некоторые задания cron запускались. Еще лучше использовать что-то вроде anacron.

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

Обновление: репозиторий с примером скрипта, который я использую: https://github.com/langner/backup.sh/blob/master/backup.sh

4
27.01.2020, 21:19

Теги

Похожие вопросы