Удаление старых бэкапов linux

Обновлено: 04.07.2024

Итак как у вас есть какая-то директория на сервере в которой храняться файлы бекапов.
Допустим, что вам не нужны файлы старше 1 месяца. Это будут исходные данные.
Теперь будем решать задачу.
Можно удалить их руками, но можно написать простейший скрипт и удалять файлы по cron.

Используя утилиту touch можно изменить дату последней модификации
например, на два часа назад.
touch -d "2 hours ago" test-*
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-a.txt
или три месяца:
touch -d "3 month ago" test-*
-rw-rw-r-- 1 alex alex 0 Nov 17 13:06 test-o.txt
или две недели:
touch -d "2 weeks ago" test-*
-rw-rw-r-- 1 alex alex 0 Feb 3 13:07 test-u.txt
Также можно менять дату относительно даты последней модификации файла, не привязываясь к текущей дате:
touch -d "$(date -r filename) - 2 hours" filename

find /home/alex/mytest.dir/v22/test* -maxdepth 1 -type f -mtime +90 -delete
Теперь все найденные файлы будут удалены.
Проверяем:

/mytest.dir/v22$ find /home/alex/mytest.dir/v22 -maxdepth 1 -type f -mtime +90
/home/alex/mytest.dir/v22/test-o.txt
/home/alex/mytest.dir/v22/test-q.txt
/home/alex/mytest.dir/v22/test-p.txt
/home/alex/mytest.dir/v22/test-s.txt
/home/alex/mytest.dir/v22/test-r.txt
/home/alex/mytest.dir/v22/test-t.txt

/mytest.dir/v22$ find /home/alex/mytest.dir/v22 -maxdepth 1 -type f -mtime +90 -delete

/mytest.dir/v22$ find /home/alex/mytest.dir/v22 -maxdepth 1 -type f -mtime +90

/mytest.dir/v22$ ls -lt
total 0
-rw-rw-r-- 1 alex alex 0 Feb 17 13:00 test-z.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-a.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-b.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-c.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-d.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-e.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-f.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-g.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-h.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-i.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-j.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-k.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-l.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-m.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-n.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:00 test-y.txt
-rw-rw-r-- 1 alex alex 0 Feb 3 13:07 test-v.txt
-rw-rw-r-- 1 alex alex 0 Feb 3 13:07 test-w.txt
-rw-rw-r-- 1 alex alex 0 Feb 3 13:07 test-x.txt
-rw-rw-r-- 1 alex alex 0 Feb 3 11:07 test-u.txt

Как это можно сделать?
Вот простейшая комбинация команд. Сейчас я покажу как можно из всех файлов за последний месяц выбрать один и скопировать кго в другую папку.
$ find /home/alex/mytest.dir/v22 -maxdepth 1 -type f -mtime +90 | sort -r
$ set `find /home/alex/mytest.dir/v22 -maxdepth 1 -type f -mtime +90 | sort -r`
$ echo $1
/home/alex/mytest.dir/v22/test-t.txt

$ cp $1 $1-bak
$ ls -l | grep test-t.txt
-rw-rw-r-- 1 alex alex 0 Nov 17 13:06 test-t.txt
-rw-rw-r-- 1 alex alex 0 Feb 18 17:55 test-t.txt-bak

На сегодня всё.
Удачи!

-atime n
File was last accessed n*24 hours ago. When find figures out
how many 24-hour periods ago the file was last accessed, any
fractional part is ignored, so to match -atime +1, a file has to
have been accessed at least two days ago.

-mtime n
File's data was last modified n*24 hours ago. See the comments
for -atime to understand how rounding affects the interpretation
of file modification times.

Доброе утро всезнающий All.
Есть сервер на Linux Debian.
Делается бэкап. структура папок такова:


Но я никак не могу придумать, как удалять ненужные бэкапы, например, старее чем месяц или два.

Как это правильно реализовать?
Всем спасибо.

  • Вопрос задан более трёх лет назад
  • 20103 просмотра

Оценить 1 комментарий

upd.
Требуется удалять оставлять в директории N кол-во бэкапов — остальное удалять.
например, 10 шт. Если тупо старше какого-то срока, то по cron'у пускаем нечто такое:
Лучше удалять не по сроку, а по количеству (оставляем последние 10-100 файлов).
В случае, когда мониторинга нет можно получить пустую папку так как файлы были старше 30 дней, а скрипт бэкапа сбойнул. Можно и это организовать, наскриптим любой каприз вопрошающего :-)

У меня есть python-скрипт rotater.py, который я когда-то написал специально для этих целей, и он служит верой и правдой и по сей день.

Его цель одна: когда у вас есть куча ежедневных бэкапов, этот скрипт удаляет старые бэкапы таким образом, что некоторые из них остаются, причем, чем старее, тем реже. По умолчанию хранится один бэкап в день за последнюю неделю, один бэкап в неделю за последние 12 недель, и один бэкап в месяц за последние 3 года. Все настраивается через параметры командной строки.

Получить список файлов — ls, find
Отсортировать их — sort
Взять все строчки кроме последних N — head, tail
Сформировать команду на удаление — sed, xargs Как и обещал накидал небольшой скрипт. Суть такова, что все что по дате подходит он оставит, хоть там будет 200 бэкапов. Если того что по дате подходит меньше $lcount (я для примера 5 написал), то он возьмёт не хватающие из тех что старше указанной даты (должен взять наиболее близкие по дате к нужной, если я тут ошибся то поменять не сложно — там tail либо head, список уже отсортирован).
Отделенные параметры можно принимать в виде аргументов, я не стал заморачиваться.

Ну вот набыдлокодил немного:
нагенерил примерно подходящих каталогов


Конструкция [[ "$var1" > "$var2" ]] сравнивает строки «кто больше» по ASCII, но работает в баше, и не гарантируется такое же действие в других шеллах.

сурово) Бегать циклом вручную и выполнять test каждый раз…
Собственно см. выше — find У меня в публикации про обработку архивов видеонаблюдения средствами shell есть пачка скриптов, можете еще там посмотреть, как сделано, у меня так чистятся архивы записей с камер. Спасибо всем отписавшимся.
Интересный вариант про кол-во файлов — как он реализуется?

Если оставлять последние 100 файлов, то можно так

вычисляем файлы и их даты, сортируем по дате, пропускаем 100 самых поздних, остальные кандидаты на удаление.

Утилита резервного копирования rdiff-backup написана на Python, обладает большой гибкостью и довольно простая в использовании. Может работать как локально, так и поверх rsync/ssh, предоставляя возможность оптимально использовать каналы передачи данных в случае удалённых бэкапов. Можно выделить следующие основные возможности:

  • Инкрементное копирование. Позволяет восстановить любой файл, удаленный хоть год назад, при том что резервное копирование выполняется, скажем, два раза в день.
  • Сохранение всей информации о файлах. Восстанавливая файл из бэкапа, мы получаем его в таком виде, в каком он был на момент добавления, включая timestamp, права доступа, владельцев и т.п. При этом утилита корректно ведет себя в различных типах файловых систем.
  • Эффективное использование дискового пространства. Используя алгоритм rsync, утилита сохраняет только изменения файлов, а не все файлы целиком. БД весом в пару десятков гигабайт не будет каждый раз копироваться целиком, а только изменения.
  • Прозрачное хранение данных. Утилита хранит бэкапы в точно таком же виде, в каком файлы находились на диске, не прибегая к хитроумным форматам. Например, чтобы восстановить последний бэкап, можно просто скопировать нужные файлы обратно на место.
  • Автоматическое определение типов файловых систем позволяет утилите избавить от полного понимания всех тонкостей её настройки в зависимости от типа используемой файловой и операционной системы.

Установка утилиты

В современных Linux-дистрибутивах rdiff-backup имеется в репозиториях:

Локальное резервное копирование

Сперва рассмотрим самый простой способ запуска утилиты:

В качестве получателя необходимо указывать либо пустой, либо несуществующий каталог. Регулировать разговорчивость утилиты можно при помощи опции -v (или --verbosity ). Опция может принимать значения от 0 до 9 (по умолчанию оно равно 3).

Удалённое резервное копирование

Если ssh-сервер работает на нестандартном порту, нужно использовать опцию --remote-schema , которая по умолчанию имеет значение

Получение информации о результатах бэкапа

Обычно многословный вывод требуется в период отладки и написания сценариев. Для мониторинга результатов работы утилиты желательно иметь лишь краткую сводку. Для этого rdiff-backup предлагает отдельную опцию --print-statistics .

Исключение из бэкапа файлов и каталогов

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

Иногда проще указать, что надо включить в бэкап, чем перечислять, что из него надо исключить:

Эта команда создаст резервную копию каталогов /usr/local и /var . И при этом исключит из резервной копии все остальные каталоги.

Утилита rdiff-backup позволяет использовать шаблоны: ** эквивалентно любому пути, а * — любому пути без завершающего слеша.

Восстановление из резервной копии

Восстановить локальную копию можно при помощи команды cp . Если резервая копия была создана командой

То восстановить ее можно при помощи команды

При этом будет скопирован каталог rdiff-backup-data со служебной информацией утилиты. Так что его надо удалить:

Разумеется, утилита rdiff-backup умеет и сама восстанавливать файлы с помощью опции -r (или --restore-as-of ). Например, восстановим утраченные файлы веб-сервера из последней версии архива ( now ) на backup-сервере:

Посмотреть историю создания бэкапов и потом выбрать нужный можно с помощью опции -l (или --list-increments ):

Можно восстанавливать не весь архив, а отдельные каталоги или файлы. Смотрим существующие версии файла и восстанавливаем нужную:

Если файл в приемнике уже существует, rdiff-backup откажется его заменять и предложит использовать опцию --force для принудительной перезаписи существующего файла:

Удаление старых файлов

Для удаления бекапов старше определенного времени используется опция --remove-older-than .

Удалим с backup-сервера бэкапы старше трех недель:

Удалим с backup-сервера бэкапы старше одного месяца:

Оставляем на backup-сервере только 10 последних версий:

Для указания времени можно использовать символы s , m , h , D , W , M и Y — секунды, минуты, часы, дни, недели, месяцы и годы.

Прочие опции утилиты

Опция --list-at-time время показывает список файлов в архиве, которые существовали в указанный момент времени. Если указан путь к каталогу в архиве, будут показаны только файлы в этом каталоге.

Опция --list-changed-since время показывает список файлов, которые были изменены с указанного момента времени. Если указан путь к каталогу в архиве, будут показаны только файлы в этом каталоге.

Опция --compare-at-time время позволяет сравнить текущее состояние каталога-источника с архивом на указанный момент времени. Позволяет проверить актуальность резервной копии. Сравниваются метаданные файлов — этот способ утилита использует и при резервном копировании.

Опция --compare является сокращением для --compare-at-time now , т.е. сравнивает текущее состояние каталога-источника с последней версией архива.

Опция --compare-hash-at-time время позволяет сравнить текущее состояние каталога-источника с архивом на указанный момент времени. Для каждого файла источника вычисляется контрольная сумма SHA1 и сравнивается с метаданными в архиве на указанный момент времени.

Опция --compare-hash является сокращением для --compare-hash-at-time now , т.е. сравнивает текущее состояние каталога-источника с последней версией архива.

Опция --compare-full-at-time время позволяет сравнить текущее состояние каталога-источника с архивом на указанный момент времени. Но при этом производится побайтовое сравнение файлов в источнике с файлами в архиве. Это самый медленный, но наиболее полный вариант сравнения.

Опция --compare-full является сокращением для --compare-full-at-time now , т.е. сравнивает текущее состояние каталога-источника с последней версией архива.

Опция --server обеспечивает переход в режим сервера утилиты на удаленном компьютере. Эту опцию нельзя указывать напрямую, она исключительно для того, чтобы утилита на локальном компьютере могла управлять утилитой на удаленном компьютере.

Опция --test-server позволяет проверить работу утилиты в режиме сервера на удаленном компьютере.

Скрипт резервного копирования

Осталось только добавить регламентное задание, чтобы скрипт запускался в 8:00 и 20:00

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

Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужно пройти . Если вас интересует готовое бесплатное решение для бэкапа и переноса всего сервера, читайте статью с описанием такого решения - Veeam Agent for Linux. В статье отдельно на конкретном примере рассмотрен вопрос бэкапа и переноса всего сервера целиком на другое железо.

Введение

Обычно я использую для бэкапов rsync. Это гибкое и удобное средство, но в некоторых случаях им неудобно пользоваться. У него есть как плюсы, так и минусы. Как я использую и настраиваю rsync для бэкапа, я рассказал в отдельной статье. Если вы хотите получить компактный бэкап всей системы, или хранить на удаленном сервере бэкап с множеством файлов и директорий, вам придется как-то упаковывать файлы в архивы и передавать их. Кучу мелких файлов в сыром виде передавать медленно и неудобно.

Я часто использую для хранения бэкапов Y andex.Disk. Готовый кейс по настройке бэкапа сайта на яндекс.диск я уже приводил ранее. Диск монтируется по webdav и работает достаточно медленно. Передавать кучу мелких файлов по нему не удобно. Я решил посмотреть, что есть еще из средств бэкапа. Параллельно хотел рассмотреть вопрос удобного бэкапа всего сервера.

Нашел любопытную программу duplicity. Раньше слышал о ней, но руки не доходили проверить самому. Теперь дошли, перейдем к настройке полного бэкапа сервера.

Установка duplicity на Centos

С установкой все просто:

Ставится из репозитория epel. Если у вас не ставится, проверьте, подключены ли репозитории.

Выполняем полный бэкап linux сервера

Чтобы полностью забэкапить сервер, необходимо использовать duplicity со следующими параметрами:

full Указывает, что мы делаем полный бэкап, можно делать и инкрементный.
--exclude Параметр задает списки исключений, сверьте со своим сервером и добавьте необходимые для исключения папки.
/ Источник бэкапа. В данном случае корень диска.
file:///mnt/yadisk Локальный путь к папке /mnt/yadisk, куда делаем бэкап. У меня в эту папку смонтирован яндекс.диск.
--no-encryption Параметр указывает на то, что шифрование не используется.

После выполнения бэкапа получите следующую информацию:

Duplicity Full backup

После полного бэкапа, можно выполнять инкрементный бэкап. Для этого в приведенной выше команды, вместо параметра full нужно использовать incremental.

Duplicity Incremental backup

Восстановление из бэкапа

Для того, чтобы извлечь содержимое бэкапа в папку /restore, воспользуемся командой:

Восстановление файлов

Если вам нужно восстановить какой-то отдельный файл или папку, укажите эту папку или файл следующим образом:

Во время восстановления каталога, папки создавать вручную не надо. Если восстанавливаете файл, то полный путь к конечной директории должен существовать.

Проверка и удаление бэкапов duplicity

Приведу еще несколько полезных команд для проверки бэкапов.

Посмотреть информацию о бэкапах в заданном каталоге:

Проверка бэкапов

Проверить содержимое бэкапа и сравнить с оригиналом:

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

Посмотреть список файлов в архиве:

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

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

На этом все, основные моменты я рассказал. Для бэкапа сервера или отдельных папок этого достаточно.

Заключение

Я рассмотрел малую часть функционала дуплисити. Большим ее плюсом является поддержка всевозможных удаленных хранилищ для бэкапа: ftp, ssh, различные облачные хранилища и другое. Хорошим преимуществом так же является возможность шифровать свои бэкапы. Мне пока нет надобности все это использовать, поэтому я рассмотрел только свой частный случай.

Онлайн курс "DevOps практики и инструменты"

Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, научиться непрерывной поставке ПО, мониторингу и логированию web приложений, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужны базовые знания по сетям и установке Linux на виртуалку. Обучение длится 5 месяцев, после чего успешные выпускники курса смогут пройти собеседования у партнеров. Проверьте себя на вступительном тесте и смотрите программу детальнее по .

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Автор Zerox

10 комментариев

Добрый день.
После запуска команды
duplicity incremental --no-encryption --exclude=/run --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/proc --exclude=/sys --exclude=/mnt --exclude=/media --exclude=/tmp --exclude=/var/spool --exclude=/var/cache --exclude=/var/tmp --exclude=/swap.img / file:///srv/duplicity/
Получаю ответ :
Local and Remote metadata are synchronized, no sync needed.
Last full backup date: Fri Jul 9 10:48:08 2021 - значит информация прочитана.

При проверки командой :
duplicity collection-status --no-encryption file:///srv/duplicity/
Получаю ответ:

Last full backup date: Fri Jul 9 10:48:08 2021
Collection Status
-----------------
Connecting with backend: BackendWrapper
Archive dir: /root/.cache/duplicity/2312b6d2484a344768421dae3e6dc18b

Found 0 secondary backup chains.

Found primary backup chain with matching signature chain:
-------------------------
Chain start time: Fri Jul 9 10:48:08 2021
Chain end time: Fri Jul 9 14:15:17 2021
Number of contained backup sets: 2
Total number of contained volumes: 152
Type of backup set: Time: Num volumes:
Full Fri Jul 9 10:48:08 2021 54
Incremental Fri Jul 9 14:15:17 2021 98
-------------------------
No orphaned or incomplete backup sets found.
Меня одно смущает что Incremental Fri Jul 9 14:15:17 2021 Num volumes: 98
число файлов в Incremental постоянно увеличивается оно уже больше почти в половину от файлов Full.
Можете уточнить по какой причине так происходит?
Num volumes: у Full + Incremental должны быть разные ?

Добрый день.
Сделал все по инструкции, но получаю ошибку

Command line error: Expected 2 args, got 3

Поиск в гугле решения не дал
Что можно предпринять ?
Спасибо

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

А что делать если при бекапе duplicity не хочет копировать некоторые папки

В итоге в логах: Errors 372

например: Error [Errno 22] Invalid argument getting delta for /var/lib/lxcfs/cgroup/pids/user.slice/user-1000.slice/tasks

Константин, проверьте права папки и есть там что-то.
Может папка или файлы там (locked )

Константин, добрый день.
Я нашёл у себя в чем проблема.
Надо выполнить команду :
sudo umount /var/lib/lxcfs и тогда файлы будут копировать, если у вас есть работающие контейнеры лучше остановить их.

при извлечении получаю ошибку duplicity: error: Bad time string "'file://****"
это блин что такое, нигде найти не могу

При помощи дупликати можно ли будет бекапить целиком сервер с почтой (postfix + dovecot + mysql) или придется еще что то дополнительно добавлять. И какими средствами вы сами бэкапите почтовый сервер. И если не сложно, сколько ориентировочно понадобится для организации двух недельного бэкапа если почтовый сервер вместе с почтой пользоватлей максимум будет весить 150 гигов.

Читайте также: