Используя rsync для инкрементного резервного копирования

Я размещаю страницу и имею ssh-доступ к webspace.

Сайт позволяет модификацию, он - пользователи. Чтобы смочь вернуться он назад к более старому состоянию, я думал о rsync для создания инкрементного резервного копирования каждые 30 минут с помощью крона для запуска следующего сценария.

#!/bin/bash

# Binaries
RSYNC=`which rsync`
LN=`which ln`
MKDIR=`which mkdir`
#TODO: Is this enough to make the script distro independent?

# Other Variables
source="<username>@<provider>:<workspace path>"
target="<local backup path>"
# Date ...
year=$(date +%Y)
month=$(date +%m)
day=$(date +%d)
# ... and time
hour=$(date +%H)
minute=$(date +%M)

# Prepare directories
$MKDIR -p $target/$year/$month/$day/"$hour"_"$minute"/
# TODO: Why is this necessary? The actual backup won't work without this line
# saying "directory does not exist...".

# Actual backup
$RSYNC -av --delete "$source" "$target/$year/$month/$day/"$hour"_"$minute"/" --link-dest="$target/latest/"
$LN -nsf "$target/$year/$month/$day/"$hour"_"$minute"/" "$target/latest"

# End script
exit 0

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

Возрастающее резервное копирование должно только привести к маленькому увеличению, правильно?

Что я делаю неправильно?

Заранее спасибо

Markus

2
задан 11 August 2018 в 12:37

4 ответа

На самом деле уже существует инструмент, созданный, который делает точно это, на основе rsync. Это назвало rdiff-резервное-копирование, и я использовал его много раз в прошлом для создания возрастающих резервных копий, и это поддерживает откат к предыдущим состояниям. Это может также быть настроено для чистки старых резервных копий так, чтобы резервный каталог не продолжал расти навсегда.

Узнайте больше об этом здесь и посмотрите на примеры использования на странице документации: http://rdiff-backup.nongnu.org/

1
ответ дан 2 December 2019 в 02:42

Если Ваши резервные носители имеют формат Linux, например, ext3 или ext4 (и он, вероятно, должен, или атрибуты файла не будут сохранены), то существует аккуратный прием, можно сделать с rsync и CP-al making good use of функция файловой системы: Вы делаете инкрементное резервное копирование, но затем Вы создаете жесткие ссылки на файлы в каждом резервном копировании. Это означает, что Вы только копируете файлы, которые изменились, но резервные носители только имеют одну копию каждого файла, так не увеличивается в размере, (я не могу взять кредит на это; именно в комментарии к длинно-предыдущему вопросу я не мог начать находить снова.)

Мое (ежедневное) резервное копирование идет что-то как:

DEST=/media/$USER/backups         # the name my backup media is mounted under
rsync -av --progress --delete --exclude ".[!.]*"  ~/ $DEST/current
DATE=`date -I`
mkdir $DEST/$DATE
cp -al $DEST/current/ $DEST/$DATE

это обновляет "текущий" только с файлами, которые изменились, но создает каталог, названный в честь сегодняшней даты с жесткими ссылками на все файлы. Таким образом ls каждого, дневные резервные копии, кажется, содержат все файлы на месте, но существует на самом деле только одна копия на резервных носителях. Последняя точка является также оборотной стороной: как существует только одна копия каждого файла, необходимо повернуть медиа, таким образом, у Вас есть несколько копий, но это - хорошая резервная практика так или иначе.

2
ответ дан 2 December 2019 в 02:42

rsync программа уже имеет резервные опции, которые делают то, что Вы хотите.

Это - сценарий, который я использую для резервных копий, работая как корень в 23:45 каждый день:

#!/bin/bash -e
# This is run as root at the end of the day

(   echo ">>>>>>>>>>>>>>>>>>>>>>>" $(date)
    today=$(date +%Y-%m-%d)
    month=$(date +%Y-%m)
    # USB backups
    cd /media/ray/Backup-Ray
    rsync --archive --one-file-system --delete --backup \
        --backup-dir="../../$today/etc" "/etc/" "mostrecent/etc/"
    rsync --archive --one-file-system --delete --backup \
        --backup-dir="../../$today/home" \
        --exclude=".config/google-chrome/" \
        --exclude=".local/share/zeitgeist/" \
        --exclude=".cache/" --exclude="Trash/" --exclude="Downloads/" \
        "/home/" "mostrecent/home/"
    rsync --archive --ignore-existing $today/ $month/
    echo "<<<<<<<<<<<<<<<<<<<<<<<" $(date)
) &>>/home/ray/Log/root.out

exit 0

Сохраняются все измененные и удаленные файлы. Это просто в использовании стандартные инструменты Unix, чтобы исследовать и восстановить файлы:

$ cd /media/ray/Backup-Ray
$ ls -l {,*}/home/ray/public/Log/wait.xhtml
-rw-r--r-- 1 ray ray 14002 Dec  3 21:04 2018-12-16/home/ray/public/Log/wait.xhtml
-rw-r--r-- 1 ray ray 14102 Dec 16 09:28 2018-12-17/home/ray/public/Log/wait.xhtml
-rw-r--r-- 1 ray ray 14202 Dec 17 20:47 2018-12-20/home/ray/public/Log/wait.xhtml
-rw-r--r-- 1 ray ray 14302 Dec 20 15:12 2018-12-25/home/ray/public/Log/wait.xhtml
-rw-r--r-- 1 ray ray 14402 Dec 25 21:21 2018-12-26/home/ray/public/Log/wait.xhtml
-rw-r--r-- 1 ray ray 14002 Dec  3 21:04 2018-12/home/ray/public/Log/wait.xhtml
-rw-r--r-- 1 ray ray 14452 Dec 26 18:43 /home/ray/public/Log/wait.xhtml
-rw-r--r-- 1 ray ray 14452 Dec 26 18:43 mostrecent/home/ray/public/Log/wait.xhtml

Только "mostrecent" каталог является большим.

Ежемесячный каталог (2018-12) накопления содержит самые старые изменения в течение месяца. Не необходимо сделать этот шаг, но когда я должен оставить свободное место, это позволяет мне удалять все ежедневные обновления в течение того месяца (Год с этого времени, я мог бы заботиться о том, на что вещи были похожи в конце декабря, но не так как вещи, измененные в течение месяца.)

Очевидно, необходимо было бы изменить частоту, метки времени, и т.д., и добавить код мобильности, но тот же механизм должен сделать то, что Вы хотите.

0
ответ дан 2 December 2019 в 02:42

на основе B.Tanner отвечают, что это - сценарий, который тестирует каждые 60 секунд, если какой-либо файл изменился, он создаст резервное копирование, у Вас должно быть 2 папки, backups/OLD и резервные копии / текущий

while true  
do 
DEST=/home/$USER/backups         # the name my backup media is mounted under
if [ -n "$(rsync -ai --delete  --exclude ".[!.]*"  $(pwd)/ $DEST/current)" ]; then
    DATE=`date +"%m-%d-%y"`
    TIME=`date +"%T"`
    mkdir -p $DEST/OLD/$DATE
    mkdir $DEST/OLD/$DATE/$TIME
    cp -al $DEST/current/ $DEST/OLD/$DATE/$TIME
    echo "done:$DATE/$TIME"
fi
sleep 60   
done
0
ответ дан 2 December 2019 в 02:42

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

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