Удаление старых бэкапов 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, но работает в баше, и не гарантируется такое же действие в других шеллах.
Собственно см. выше — 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 | Параметр указывает на то, что шифрование не используется. |
После выполнения бэкапа получите следующую информацию:
После полного бэкапа, можно выполнять инкрементный бэкап. Для этого в приведенной выше команды, вместо параметра full нужно использовать incremental.
Восстановление из бэкапа
Для того, чтобы извлечь содержимое бэкапа в папку /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 гигов.
Читайте также: