LINUX.ORG.RU
ФорумAdmin

Скрипт бэкапа

 , ,


1

3

Всем привет. Нужно написать скрипт бэкапа. Погуглив на эту тему были найдены заготовки + добавлено свое.

Единственное, что не удалось победить это контроль за переполнением диска перед началом бэкапа. Перед тем как копировать настройки и снимать дамп с БД, нужно проверить сколько осталось свободного места и удалить самый ранний бэкап(весь каталог).

find $bdir -mindepth 1 -maxdepth 1 -type d -printf '%T@ %p\n' | sort -rnk1 | awk 'NR>5 { sub(/^\S+ /, "", $0); system("rm -r -f \"" $0 "\"")}'

В данной строке идет поиск по каталогу и удаляются каталоги если их больше 5.

Я же хочу всегда получать общее количество каталогов и удалять самый первый. Грубо говоря:

find $bdir -mindepth 1 -maxdepth 1 -type d -printf '%T@ %p\n' | sort -rnk1 | awk 'NR>$(ls /backup | wc -l -1) { sub(/^\S+ /, "", $0); system("rm -r -f \"" $0 "\"")}'

Помогите пожалуйста.



Последнее исправление: bredis (всего исправлений: 3)

Ответ на: комментарий от shell-script

Удалять по mtime — плохая идея, если по какой-то причине бэкапы перестали делаться. Отслеживание таких ситуаций, конечно, должно быть, но тем не менее.

Например, duplicity.

Есть же куда более эффективные restic и borg.

anonymous
()

Как всё сложно

rm -Rf -- `ls с обратной сортировкой | tail +10`

10 - количество оставляемых последних элементов

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

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от anonymous

Удалять по mtime — плохая идея, если по какой-то причине бэкапы перестали делаться.

Согласен. Стоит предусмотреть проверку на наличие n бекапов. Это уже не сложно. По mtime просто легко получить список последних. Парсинг ls/sort куда менее надёжны.

Есть же куда более эффективные restic и borg.

Я же написал «например». Мне не хватает функционала restic и borg. Например, восстановление отдельных файлов/директорий из отдельных снимков одной командой(или я не до конца раскурил man) за нужную дату без вытягивания или монтирования в fuse бекапа целиком. В duplicity это делается очень легко.

shell-script ★★★★★
()
Ответ на: комментарий от shell-script

https://borgbackup.readthedocs.io/en/stable/usage/extract.html

Там в самом начале написано про указание путей.

https://restic.readthedocs.io/en/stable/050_restore.html#restoring-from-a-snapshot

Здесь выглядит чуть менее удобно, но функциональность есть.

Мне не хватает функционала restic и borg.

Я пробовал заменить их на duplicity (мне нравится архитектурная простота и использование стандартных форматов), но это слишком убого. Нет нормальной дедупликации, нет нормального удаления архивов/снапшотов, это всё проистекает из той самой простоты. Но для каких-то кейсов оно будет работать неплохо.

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

В borg можно восстановить всё, что не повреждено, с повреждёнными данными он тоже может что-то попробовать сделать. Единственный нюанс, вытекающий из дедупликации — маленькое повреждение может грохнуть большое количество данных, все, где есть испорченный чанк. Про restic не в курсе.

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

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

В именах каталогов нет пробелов. Формат date +%d-%m-%Y. Из всего сказанного я так и не понял, как отредактировать строку, что бы она удаляла самый старый каталог.

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

man head

man tail

выбираешь столько строчек с начала/с конца сколько нужно

только смотри чтобы туда '.' и '..' не попали (ls их выводит при некоторых сочетаниях флагов) а то удалится лишнее

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от bredis

Формат date +%d-%m-%Y.

Плохая идея. Даты будут сортироваться сначала по номеру дня в месяце. Получится например, что 01-12-2023 идет раньше, чем 02-11-2023, потому что 01 меньше, чем 02. Как уже писали выше, нужно использовать формат date +%F (т.е. YYYY-MM-DD). Тогда при сортировке даты будут идти в алфавитном порядке от самых ранних до самых поздних.

как отредактировать строку, что бы она удаляла самый старый каталог.

Самый простой и тупой вариант:

cd "$bdir"
rm -rf $(ls -1 | head -1)

Оно сломается, если в именах удаляемых каталогов будут пробелы. У тебя их нет, но если надо, можно придумать более сложный и корректный вариант.

archie
()
16 января 2024 г.

Подниму тему. Скрипт написал, но одно так победить и не получилось.

Есть строка которая должна искать и удалять старые каталоги.

find /backup -mindepth 1 -maxdepth 1 -type d -printf '%T@ %p\n' | sort -rnk1 | awk 'NR>5 { sub(/^\S+ /, "", $0); system("rm -r -f \"" $0 "\"")}'

При таком синтаксисе всё работает корректно. Но если изменить цифру в неравенстве awk на цифру получаемую или просто указанную как переменная

"....awk 'NR>$k...."

т.е. начинает выглядеть так:

k=$(($(ls -1 $bdir | wc -l) -1 ))
find $bdir -mindepth 1 -maxdepth 1 -type d -printf '%T@ %p\n' | sort -rnk1 | awk 'NR>$k { sub(/^\S+ /, "", $0); system("rm -r -f \"" $0 "\"")}'

Удаляется всё кроме самой свежей папки.

Как можно это победить подскажите пожалуйста?

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