Сценарий инкрементного резервного копирования

Я использую команду rsync для инкрементного резервного копирования. Моим требованием является инкрементное резервное копирование измененных файлов в другом каталоге с тем же именем местоположения с текущей датой, но когда я использую rsync, оно сохраняет инкрементное резервное копирование в полном резервном копировании, а не в каталоге с именем даты. Я использую следующую команду для инкрементного резервного копирования.

rsync -av --backup --backup-dir=/mnt/`date +%Y.%m.%d.%T`  /etc/ /mnt/
4
задан 27 August 2015 в 09:59

3 ответа

Rsync выполнит возрастающие резервные копирования по умолчанию, но вероятно не, так что в итоге Вы ожидаете. Команда

rsync -av /etc/ /mnt/

передает только измененные файлы. Для этого это сравнивает содержание /etc и /tmp. Если Вы добавляете вычисленную дату, например, /tmp/$(date), целевая папка пуста и поэтому, все файлы будут переданы снова.

<час>

опции --backup и --backup-dir только полезны при необходимости в резервном копировании файлов которые были бы удалены, если Вы запустите эти rsync команда с опцией --delete.

<час>

Сводка

Для создания истинных возрастающих резервных копий, Вам будет нужен другой инструмент, например, rsnapshot .

0
ответ дан 27 August 2015 в 19:59
  • 1
    Нет проблем. Каково было название программы с ошибками, которая была начата? Это поможет для дальнейшего использования. – Krieger 18 November 2016 в 17:09

Зависит от того, под чем Вы подразумеваете возрастающий . Один прием должен использовать hardlinks на диске EXT4. Это означает, что, если файлы не изменяются, они появятся в каждом снимке, но будут только существовать (и будут скопированы в диск однажды). Вот сценарий, который я использовал прежде:

#!/bin/sh
NEW_FOLDER="$(date +%F\ %H-%M-%S)"
rsync --archive --human-readable --progress --link-dest /media/current "/etc/" "/media/incomplete/
mv /media/incomplete /media/'$NEW_FOLDER'
rm -f /media/current
ln -s /media/'$NEW_FOLDER' /media/current

При помощи неполный папка, если резервное копирование останавливается на полпути через (очень полезный для больших резервных копий), оно возьмет снова, когда Вы затем попробуете. Можно затем просмотреть каждую папку как полное инкрементное резервное копирование. Это - аналогичный подход к Apple Time Machine.

, Если Вы не побеспокоены об использовании hardlinks, чтобы оставить свободное место, и не возражать против дублирования файла, удалить --link-dest /media/current установка.

0
ответ дан 27 August 2015 в 19:59
  • 1
    Хорошо, таким образом, я понял его, по-видимому, процесс становился начатым, но тогда застревал в цикле или чем-то и препятствовал тому, чтобы компьютер продолжил свою стандартную программу начальной загрузки. Благодаря Вашей подсказке и теперь знающий, как вскочить в терминал, я смог отладить это и отключить его. – Sj. 18 November 2016 в 17:07

Я искал ответ здесь раньше и сначала выбрал ответ @Hadog. Он работает отлично, пока вы не запустите rsync через сетевое соединение, и при подключении не возникнет сбоев. Rsync просто выйдет и больше не будет пытаться. Проблема в том, что хотя это и не удается, символическая ссылка изменяется на новую несуществующую папку (неработающая ссылка), что приводит к тому, что rsync игнорирует --link-dest. Это означает, что полная копия создается снова вместо использования жестких ссылок.

Вот мой вариант сценария @Hadog с улучшенной обработкой ошибок:

#!/bin/sh

# determine how the new folder should be called
NEW_FOLDER="$(date +%F\ %H-%M-%S)"

rsync --archive --human-readable --progress --link-dest $PWD/current source "$PWD/destination"

# get exit code of rsync. -> don't put anything between this line and the rsync command!
rsync_exit_code=$?

# if the rsync command exited with a code that we consider "successfull" ...
if [ "$rsync_exit_code" -eq "0" ] || [ "$rsync_exit_code" -eq "23" ] || [ "$rsync_exit_code" -eq "24" ] 
then
    # move files to their actual destination
    mv $PWD/incomplete $PWD/"$NEW_FOLDER"
    
    # remove the old symlink
    rm -f current
    
    # set the symlink to the newest backup that we have just created
    ln -s $PWD/"$NEW_FOLDER" $PWD/current 
else
    echo "No moving of incomplete folder! Rsync exited with code $rsync_exit_code"
fi

Существенное отличие заключается в условии. Мы должны сбросить «текущую» символическую ссылку только в том случае, если у нас действительно есть новая рабочая резервная копия. Для моего приведенного выше примера, когда создание сетевого соединения не удается, это будет означать, что сценарий резервного копирования завершается без повторной попытки. Повторной попыткой будет повторный запуск сценария. Вместо использования условий if вы можете использовать цикл do-while, чтобы повторять команду rsync до тех пор, пока она не завершится успешно.

В моем коде я считаю коды выхода rsync 0, 23 и 24 успешными. Вот что они означают (см. справочную страницу rsync для всех кодов):

  • 0: успех
  • 23: Частичный перенос из-за ошибки
  • 24: Частичный перенос из-за исчезнувших исходных файлов

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

1
ответ дан 17 June 2020 в 15:41

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

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