Бэкап данных посредством 7-zip через консоль с очисткой
Зачастую, необходимо делать бэкапы данных, при этом делать это таким образом, чтобы старые бэкапы автоматически удалялись, для экономии места на диске. Описанный ниже способ копирования данных применим на любой машине под управлением Microsoft Windows, тестировалось на Windows версий XP, Vista, 2003 server и 2008 server.
Нам потребуется архиватор 7-zip и немного времени для работы в Notepad (блокнот – стандартный текстовый редактор Windows)
Сам бэкап будет проходить посредством bat файла, который будет запускать архивацию данных 7-zip через консоль. После архивации будет выполняться проверка существующих бэкапов по имени для удаления старых бэкапов и, соответственно, экономии места на диске. Имена архивов, в свою очередь, будут иметь имена, соответствующие дате архивации.
Итак, начнём:
- backup.bat
@ECHO OFF SETLOCAL SET PATH=%PROGRAMFILES%7-zip;%PATH% set now=%DATE:~-4%-%DATE:~3,2%-%DATE:~0,2% # выше описанным мы задаём параметры именования файлов архивов, то есть наши бэкапы. А именно получается формат гггг-мм-чч. echo %DATE% echo %TIME% echo Start WORK 7z a -xr@exclude.txt -t7z -mx9 -ssw F:BackupWorkkp-%now%.7z C:Work -scsWIN # Указываем архиватору, что в F:BackupWork нужно поместить архив, содержащий папку C:Work echo %DATE% echo %TIME% echo Start clearing cscript /nologo clear.vbs Work # Строка выше описывает, к какой папке с бэкапом применить скрипт очистки, для удаления старых архивов. echo Stop clearing echo %DATE% echo %TIME% pause # Выше описанный код запускает скрипт очистки от старых бэкапов.
- Теперь берёмся за создание скрипта очистки.
clear.vbs
dim fso : Set fso = CreateObject("Scripting.FileSystemObject") dim strRootPath : strRootPath = fso.GetAbsolutePathName(".") Dim ToDay : ToDay = Date() Dim Prev_days : Prev_days = DateAdd("d", -3, Date()) #Внимание! предыдущая строка описывает от какого числа нужно удалять старые бэкапы. В коде приведён пример удаления всех бэкапов, которые созданы ранее, чем сегодня - 3 дня. Соответственно, цифру 3 можете поменять на любую другую, в зависимости от потребностей. Важно то, что будут удалены бэкапы, созданные (сегодня – Х дней) назад. Set objArgs = WScript.Arguments Set dFolder = fso.GetFolder(strRootPath & ""& objArgs(0)) dim regEx : Set regEx = New RegExp With regEx .Pattern = "^bkp-(([0-9]{4})-([0-9]{2})-([0-9]{2})).7z$" .IgnoreCase = True .Global = True End With For Each dFile In dFolder.Files set matches = regEx.execute(dFile.Name) if matches.Count > 0 then Set match = matches(0) If match.SubMatches.Count > 0 Then sDateTime = match.SubMatches(0) dtDates = CDate(sDateTime) If dtDates < Prev_days Then WScript.Echo dFile.Name & " removed." dFile.delete End If End If end if Next
- Последний файл, который нам потребуется – это файл exclude.txt. В него можно добавить пути, маски и конкретные файлы, которые не надо добавлять в архив. Разумнее всего добавить туда маски мультимедийных файлов и картинок, так как они плохо зажимаются и, как правило, являются нерабочими файлами, если мы говорим о бэкапе сетевой папки в крупной фирме, где обязательно работники будут обмениваться музыкой, видео и фотографиями.
exclude.txt*.avi*.mp3*.MP4*.MP2*.MPG*.MPEG*.VOB*.MKV*.tmp*.zip*.mov*.exe*.rar
Основные действия мы произвели, остались только заключительные шаги. А именно: установить архиватор 7-zip, свежая версия всегда доступна на сайте разработчика по ссылке https://www.7-zip.org, программа является бесплатной.
Теперь добавляем наш backup.bat в задания Windows (для ХР это ПУСК?Панель управления?Назначение задания, для Windows server 2008 это Диспетчер сервера?Конфигурация?Планировщик заданий?Библиотека планировщика заданий), назначаем удобное время выполнения. ГОТОВО.
Важные примечания по использованию этого способа бэкапа данных.
Файлы backup.bat, cleat.vbs и exclude.txt должны находиться в одной папке, причём в папке с бэкапами. А именно, если рассматривать наш пример, то в F:/Backup.
Пути, описанные в файле, backup.bat должны быть введены только латиницей. Если пути будут содержать символы кириллицы, то бэкап не будет проходить. Имена файлов и папок в директорий для архивации не имеют значения, но путь до папки архивации ОБЯЗАТЕЛЬНО должен быть на латинице.
Можно делать бэкапы любых дисков/файлов/папок, но файлы не должны использоваться в момент архивации, соответственно, если вы хотите сохранять базы sql, то вам сначала придётся остановить службу sql-сервера. Также следует заметит, если вы делаете бэкап файлов в сетевой папке пользователей, то нужно делать его в нерабочее время, чтобы пользователи вашей сети не использовали файлы, помеченные для архивации.
Плюсы данного способа
Бэкап данных с общей сетевой папки, а также возможность восстановить эти данные всегда очень важны для стабильной работы сети. Если вам необходимо поддерживать недельную актуальность бэкапа, то достаточно настроить скрипт очистки бэкапов так, чтобы он удалял архивы только старше недели.
Также одним из достоинств данного способа является то, что сами бэкапы будут занимать значительно меньше места на диске, в отличии от простого копирования данных.
Есть возможность держать список исключений для архивации, что несомненно позволит сократить место, занимаемое архивами, а также делать копии только необходимых данных.
Минусы данного способа
К сожалению, данный способ не применим для бэкапа папок с русскоязычными именами (вложенные папки и файлы значения не имеют). Также процесс архивации весьма ресурсоёмкий, а также занимает время. Соответственно, ресурсы сервера должны позволять это сделать как можно быстрее. Однако, нынешний прогресс в сфере компьютеров и комплектующих настолько далеко зашел, что этот небольшой минус можно и опустить. 4-ядерного процессора с тактовой частотой 2Ггц и 4ГБ памяти на компьютере вполне хватит, чтобы провести подобный бэкап общей сетевой папки, содержащей в большей степени рабочие документы (WORD, EXCEL, POWER POINT), объёмом свыше 12 Гигабайт, примерно за полтора часа. Полученный архив будет объёмом в 2 Гигабайта.
Парашютист со стажем. Много читаю и слушаю подкасты. Люблю посиделки у костра, песни под гитару и приближающиеся дедлайны. Люблю путешествовать.
Вдохновлен
В батники вместо # нужно писать REM. А скрипт не работает вообще – выдается ошибка “Предполагаться наличие инструкций”
fso.GetAbsolutePathName(”.”) – точку заменил на путь вида D:\Backup\
Set dFolder = fso.GetFolder(strRootPath)
Вроде заработало :)
С русскими именами никаких проблем нет. Просто файл нужно сохранять в 866 кодировке!
Доброго времени суток, выдает ошибку “Индекс выходит за пределы допустимого диапазона”
Patirot Путь ввода заменили на D:\Backup\
Set dFolder = fso.GetFolder(strRootPath)
получили fso.GetAbsolutePathName(”D:\Backup\
Set dFolder = fso.GetFolder(strRootPath)”)
где если следовать примеру нужно указывать F:\Backup\
Set dFolder = fso.GetFolder(strRootPath)
Но, суть вопроса не в этом.
У меня опять ругнулся на 5,1 пятую строчку …может там тоже нужны метоморфозы))) Если укажите буду благодарен.
to dj_casanova
Перед комментариями ставить знак ‘
добрый день, подскажите каким образом в файле исключений прописываются директории?
Всех описанных выше недостатков лишена бесплатная программа copymik. Она не создаёт огромных архивов а копирует сжимая а при нужде и шифруя каждый файл отдельно. Если в целевой папке такой файл уже существует может сначала скопировать его в третью папку (имя которой настраивается, напр. состоит из даты и времени) и только потом заменит. Не имеет проблем с кириллицей и сверхдлинными путями. Может переименовывать и транслитерировать имена файлов и имеет кучу других возможностей. Ссылку не ставлю т.к. легко гуглится. Рекомендую последнюю сборку 2.20а… последняя версия есть на www.superbasis.de см. ночную сборку. Успехов.