LINUX.ORG.RU
ФорумAdmin

Дифференциальный бэкап средствами tar

 , ,


0

3

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

Сейчас это работает как инкрементальный бэкап.

#!/bin/bash
set -exu
######################### Начальные переменные #################################################
DAY=$(date +%Y%m%d_%H%M%S)
SOURCE="/test_folder"
BACKUP_FOLDER="/mnt/Backup_Files/current"
ARCHIVE_BACKUP_FOLDER="/mnt/Backup_Files/archive"
ARCHIVE_BACKUP_FOLDER_LOG="/mnt/Backup_Files/archive_log"
EXCLUDE_FILE="/tmp/.nobackup_dir"
NAME_SNAR="FILE.SNAR"
MAX_KOL_BACKUPS=7
VAR=0
FULL_BACK=0
######################### Проверка и создание директорий ########################################
if [[ ! -d ${BACKUP_FOLDER} ]]
then
  mkdir -p ${BACKUP_FOLDER}
  VAR=1
  FULL_BACK=1
else
  echo &>/dev/null
fi
 
if [[ ! -d ${ARCHIVE_BACKUP_FOLDER} ]]
then
  mkdir -p ${ARCHIVE_BACKUP_FOLDER}
else
  echo &>/dev/null
fi
 
if [[ ! -d ${ARCHIVE_BACKUP_FOLDER_LOG} ]]
then
  mkdir -p ${ARCHIVE_BACKUP_FOLDER_LOG}
else
  echo &>/dev/null
fi
 
if [[ ! -f ${EXCLUDE_FILE} ]]
then
  touch ${EXCLUDE_FILE}
else
  echo &>/dev/null
fi
 
########################### Счетчик количества бэкапов  ###########################################
if [[ VAR -eq 0 ]]
then
 KOL_BACKUPS=`ls -al  ${BACKUP_FOLDER}/ | grep .tar.gz | wc -l` 2>/dev/null
else
 KOL_BACKUPS=0
fi
 
########################### Перенос бэкапа в архив #################################################
if [[ ${KOL_BACKUPS} -eq ${MAX_KOL_BACKUPS} ]]
then
 mv ${BACKUP_FOLDER}/*.tar.gz ${ARCHIVE_BACKUP_FOLDER}/
 mv ${BACKUP_FOLDER}/*.log ${ARCHIVE_BACKUP_FOLDER_LOG}/
 rm ${BACKUP_FOLDER}/*.SNAR
 FULL_BACK=1
else
 echo &>/dev/null
fi
 
########################### Создание резервной копии ###############################################
if [[ ${FULL_BACK} -eq 1 ]] || [[ ${KOL_BACKUPS} -eq 0  ]]
then
 tar --exclude-from=${EXCLUDE_FILE} -v -c \
 -f ${BACKUP_FOLDER}/FULL-${DAY}.tar.gz -I pigz \
 --listed-incremental=${BACKUP_FOLDER}/${NAME_SNAR} $SOURCE &> ${BACKUP_FOLDER}/FULL-${DAY}.log
else
  tar --exclude-from=${EXCLUDE_FILE} -v -c \
 -f ${BACKUP_FOLDER}/DIFF-${DAY}.tar.gz -I pigz \
 --listed-incremental=${BACKUP_FOLDER}/${NAME_SNAR} $SOURCE &> ${BACKUP_FOLDER}/DIFF-${DAY}.log
fi
########################## Удаление старых бэкапов #################################################
cd ${ARCHIVE_BACKUP_FOLDER}/ && ls -t | tail -n+15 | xargs -i rm '{}'
cd ${ARCHIVE_BACKUP_FOLDER_LOG}/ && ls -t | tail -n+15 | xargs -i rm '{}'

Рано или поздно надоест писать закат солнца вручную, и перейдёшь на что-нибудь типа borg. Рекомендую сразу исключить промежуточные шаги.

Лучше, чем borg самостоятельно не сделаешь (особенно, средствами tar).

На каком-то этапе у всех чешутся руки, я десятки подобных скриптов писал. Не знаю, напрасно ли это потраченное время, но склоняюсь к мысли, что всё-таки да, напрасно.

emorozov
()

решил добавлением в блок создания копий


########################### Создание резервной копии ###############################################
if [[ ${FULL_BACK} -eq 1 ]] || [[ ${KOL_BACKUPS} -eq 0  ]]
then
 tar --exclude-from=${EXCLUDE_FILE} -v -c \
 -f ${BACKUP_FOLDER}/FULL-${DAY}.tar.gz -I pigz \
 --listed-incremental=${BACKUP_FOLDER}/${NAME_SNAR} $SOURCE &> ${BACKUP_FOLDER}/FULL-${DAY}.log
 cp ${BACKUP_FOLDER}/${NAME_SNAR} ${BACKUP_FOLDER}/${NAME_SNAR}.first
else
 rm ${BACKUP_FOLDER}/*.SNAR
 cp ${BACKUP_FOLDER}/${NAME_SNAR}.first ${BACKUP_FOLDER}/${NAME_SNAR}
 tar --exclude-from=${EXCLUDE_FILE} -v -c \
 -f ${BACKUP_FOLDER}/DIFF-${DAY}.tar.gz -I pigz \
 --listed-incremental=${BACKUP_FOLDER}/${NAME_SNAR} $SOURCE &> ${BACKUP_FOLDER}/DIFF-${DAY}.log
fi

и в блоке переноса в команду удаления добавил * для удаления всех файлов метаданных rm ${BACKUP_FOLDER}/.SNAR

так вроде все работает теперь.

bigsmog88
() автор топика