LINUX.ORG.RU
ФорумAdmin

Предложите как прореживать backup (оставить 7 за последнюю неделю, далее по 1 в неделю за 2 месяца и т.д.) ?

 ,


0

3

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

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

В конечном итоге получить папки с файлами:

1. backup - это то куда все сохраняется изначально.

2. backup_daly - за каждый день целую неделю, 7 файлов

3. backup_weekly - за каждую неделю последние 2 месяца примерно 8 файлов

4. backup_monthly - за каждый месяц


В имя файла добавляешь дату создания, потом проходишься find'ом и прореживаешь по определенным правилам (или перемещаешь в соответствующую директорию).

dvrts ★★★
()

У меня просто три независимых бекапа: ежедневный, еженедельный и ежемесячный.
В общем случае хранится три последних ежедневных, три последних еженедельных и все ежемесячные. Ну или как настроишь, от проекта зависит.
Да, по понедельникам и первым числам бекап делается вдвое чаще, но мне это не фатально. К тому-же бекапы происходят с разницей в час, так-что одновременно два бекапа не делается.

MrClon ★★★★★
()

ну у меня вот так сделано:

#!/bin/bash

…

FILE_LIST=$(mktemp) || exit

find $BACKUPS_DIR -name "bh*.tar.*.gpg" -o -name "bh*.map.gz.gpg" | sort >$FILE_LIST

declare -a FILES

COUNT=0
while read FN; do
	FILES[$COUNT]="$FN"
	(( COUNT++ ))
done <$FILE_LIST

TRESHOLD=18

if (( COUNT > TRESHOLD )); then
	for (( J = 0; J < COUNT - TRESHOLD; J++ )); do
		echo "J: $J, FILES[$J]: '${FILES[$J]}'" | tee --append $LOG
		stat -c%s "${FILES[$J]}" | tee --append $LOG
		rm --verbose "${FILES[$J]}" | tee --append $LOG
	done
fi

rm --force $FILE_LIST

emulek
()
Ответ на: комментарий от dvrts

это понятно, но может у кого то подобное написано или есть система, где это в общем виде реализовано.

Дата у меня есть в имени, но если писать я буду, то на дату файла ориентироваться буду.

- раз в сутки самый свежий файл копировать в backup_daily удалять все вчерашние,

- раз в неделю самый свежий из backup_daily копировать в backup_weekly, все старше недели удалять,

и т.д. «канализировать» как захочется.

Все просто, если подумать, но может уже есть у кого и мне только настроить надо.

kpush
() автор топика
Ответ на: комментарий от anonymous

http://jekor.com/log2rotate - конечно хорошо, но у нас «месячные» и раз в месяц backup должен быть.

И чаще, чем два раза в день нет смысла, так, что важен механизм реализации.

kpush
() автор топика
  • Делаешь backup
  • Копируешь backup в backup_daily
  • Если понедельник, копируешь backup в backup_weekly
  • Если первое число месяца, копируешь backup в backup_monthly
  • find backup_daily -mtime 7 -delete
    (аналогично для backup_weekly)
ksv
()
Ответ на: комментарий от ksv

find backup_daily -mtime 7 -delete

И сколько ещё идиотов на этом должно прогореть, чтобы понять, что так делать нельзя?

remove_oldest()
{
    base_dir="${1}"
    number_to_keep="${2}"

    all_dirs=$(cd "${base_dir}" && ls -1 | sort --version-sort)
    dirs_to_remove=$(echo "${all_dirs}" | head --lines=-${number_to_keep})

    echo 'Found directories:' ${all_dirs}
    echo 'Directories to remove:' ${dirs_to_remove}

    for d in ${dirs_to_remove}; do
        dir="${base_dir}/${d}"
        rm -rfv "${dir}"
    done
}
anonymous
()
Ответ на: комментарий от emulek

Ну и портянка

ls -t $BACKUPS_DIR/*.gpg|tail -n+18|xargs -d "\n" -i rm "'{}'"

же

disarmer ★★★
()

Откройте для себя дедупликацию уже.

XXI век, а они где-то на уровне магнитных плёнок застряли.

anonymous
()
Ответ на: комментарий от anonymous

Это еще почему? В голову приходит только случай если бекап сломался, но для такого случая нужен мониторинг успешности бекапа. А если не заметишь что бекап сломан, то даже с этой портянкой у тебя останется N бекапов древней свежести, кому они нужны то?

disarmer ★★★
()
Ответ на: комментарий от ksv

Копируешь backup в backup_daily

хардлинк тогда уж, че копировать то?

ну и последний пункт - добавить в мониторинг проверку даты и статуса последнего бекапа

disarmer ★★★
()
Ответ на: комментарий от kpush

может у кого то подобное написано или есть система, где это в общем виде реализовано.

собственный скрипт делаюший backup подвязанный к Bacula

Pinkbyte ★★★★★
()

http://en.wikipedia.org/wiki/Backup_rotation_scheme#Tower_of_Hanoi есть алгоритм ротации на базе алгоритма ханойских башен. в 5 сетах можно хранить бекапы с возрастом до 16 дней.

вот издевался когдато. в каталоги: old1 old2 ...old${MAXLEVEL}

MAXLEVEL=7
HL=$((MAXLEVEL-1))
TODAY_L=$(( `date +%s` / (24*3600) % (2**HL) )) ## текущий номер дня от начала эпохи
CHL=$HL
# что-то типа двоичного логарифма на bash
while test $(( TODAY_L % (2**CHL) )) -ne 0 ;
do 
((CHL--))
done
((CHL++)) ## операции с двоичными логарифмами используется нумерация с 0 до n-1

## создание или пересоздание символической ссылки для перемещения предыдущего бекапа
( test ! -e old|| test -L old && rm old) && ln old${CHL} old

mv -f current/* old/
bl ★★★
()

После всех обсуждений у меня родился скрипт, лишь для автоматизации еженедельного отбора backup ов для хранения. Т.е. из daly в weekly или weekly в monthly.

Привязываюсь только ко времени файла и шаблону имени. Шаблон такой: <имя приложения>2<имя клиента> .


#!/bin/bash

basedir=/home/dbbackup/iSCSI2/mysql

inputDir=${basedir}/$1
outputDir=${basedir}/$2

for clientName in cyn kit ... # через пробел все сервера
do
	perror=0

	for baseName in eqp cyf ... # список приложений

	do

		fileFilter="${inputDir}/*${baseName}2${clientName}.sql"

		inputFileName=$(ls $fileFilter)

		if [ "$?" != "0" ]; then
		perror=1
		else
	                inputFileName=$(ls -at $fileFilter| head -n 1)
			echo $inputFileName
			outputFileName=${outputDir}/$(basename $inputFileName)
			cp $inputFileName $outputFileName
		fi
	done

# пока не включаю, делю руками

#	if [ "perror" != "0" ]; then
#	        echo "BackUp Error"
#	else
#		find "${inputDir}" -name "*2${clientName}.sql" -mtime 7 -delete
#	fi

done

Получается пол сотни файлов перекинуть и по логу понять, что есть, чего нет.

kpush
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.