Бэкап данных посредством 7-zip через консоль с очисткой

Сам бэкап будет проходить посредством 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 Гигабайта.

Зарубин Иван Эксперт по Linux и Windows

Парашютист со стажем. Много читаю и слушаю подкасты. Люблю посиделки у костра, песни под гитару и приближающиеся дедлайны. Люблю путешествовать.

Вдохновлен

Комментарии (8)

  • Антон #

    В батники вместо # нужно писать REM. А скрипт не работает вообще – выдается ошибка “Предполагаться наличие инструкций”

  • fso.GetAbsolutePathName(”.”) – точку заменил на путь вида D:\Backup\
    Set dFolder = fso.GetFolder(strRootPath)

    Вроде заработало :)

  • Антон #

    С русскими именами никаких проблем нет. Просто файл нужно сохранять в 866 кодировке!

  • Андрей #

    Доброго времени суток, выдает ошибку “Индекс выходит за пределы допустимого диапазона”

  • dj_casanova #

    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 см. ночную сборку. Успехов.