Создать новый tar-файл из папки рекурсивно, исключая файлы, содержащиеся в другом tar-файле - PullRequest
0 голосов
/ 13 ноября 2018

Я делаю ежедневные резервные копии электронной почты моих почтовых серверов.

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

Со временем этот tar-файл становится слишком большим для обработки.

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

Затем я могу перенести этот значительно меньший файл на свой резервный сервер.

Наконец, я могу объединить новый файл tar с мастером на обоих серверах, готовый к следующему дню.

Есть идеи, как мне это сделать?

1 Ответ

0 голосов
/ 14 ноября 2018

Использование tar с find Вот пример сценария для создания full и incremental резервных копий с использованием find и tar

#!/bin/bash
bkdir="/home/backup"
bklog="/var/log/backup.log"
dbkdir="/home/backup/files/daily"
wbkdir="/home/backup/files/weekly"


curdate=`date +%Y-%M-%d-%H:%M:%S`
ardate=`echo $curdate  | sed -e 's/:/_/g' -e 's/-/_/g'`
wday=`date +%a`

files_full_backup () {
  echo -e "Archiving files...n"
  tar cjpf "$1/full_files_$ardate.tar.bz2" "$bkdir"
}

files_inc_backup () {
  echo -e "Archiving files...n"
  find $bkdir -mtime -1 -exec tar cvjpf "$1/inc_files_$ardate.tar.bz2" {} ;
}

### add some choice what kind of backup to do - full or incremental
if [ $wday != Sun ]
  then
    echo -e "As today is not Sunday - I'll start incremental backup.n"
    files_inc_backup $dbkdir
  else
    echo -e "As today is Sunday - I'll start full backup.n"
    files_full_backup $wbkdir
fi

Использование только tar (инкрементное резервное копирование)

man tar показывает, что имеет «инкрементную особенность»:

-g, --listed-incremental=FILE
              Handle new GNU-format incremental backups.  FILE is the name of a snapshot file, where tar stores addi‐
              tional information which is used to decide which files changed since the previous incremental dump and,
              consequently, must be dumped again.  If FILE does not exist when creating an archive, it will  be  cre‐
              ated  and  all  files will be added to the resulting archive (the level 0 dump).  To create incremental
              archives of non-zero level N, create a copy of the snapshot file created during the level N-1, and  use
              it as FILE.

              When listing or extracting, the actual contents of FILE is not inspected, it is needed only due to syn‐
              tactical requirements.  It is therefore common practice to use /dev/null in its place.

Для создания инкрементной резервной копии используйте:

tar --create --file=`date +%s`.tbz2 --bzip --listed-incremental=example.snar --verbose example/

или в краткой форме:

   tar -cvjg example.snar -f `date +%s`.tbz2  example/

Для восстановления резервной копии необходимо распаковать всю часть bcakup от самой старой до самой новой:

 tar --extract --incremental --file level0.tar
 tar --extract --incremental --file level1.tar
 tar --extract --incremental --file level2.tar

Или в краткой форме:

   for i in *.tbz2; do tar -xjGf "$i"; done;

А вот скрипт для создания архива нулевого уровня будет один раз в неделю (или один раз в месяц, зависит от закомментированной строки):

#!/bin/sh
   SOURCE="$1"
   test -d "$SOURCE" || exit 1

   DEST_DIR=`date +%G-%V`; #weekly
   #DEST_DIR=`date +%Y-%m`; #monthly

   mkdir -p $DEST_DIR;
   shift;
   tar --create "$@" --preserve-permissions --totals --bzip \
   --file="$DEST_DIR"/`date +%F-%s`.tbz2 \
   --listed-incremental="$DEST_DIR"/backup.snar \
   --no-check-device --exclude-vcs \
   --exclude-tag-under=access.log --exclude='*.log' \
   --exclude-caches --exclude-tag-under=IGNORE.TAG "$SOURCE"

И выполнить его:

   ./backup.sh example/ -v
...