Backup с помощью WinRar

И так, передо мной стояла задача настроить резервное копирование данных. Я не буду рассказывать какая инфраструктура у меня. Просто покажу скрипт который я написал и расскажу как он работает. Т.к. он основан на элементарных понятиях CMD 70% IT специалистов все поймут и не будут задавать непонятные вопросы.

Задача
Настроить Бэкап 700 Gb пользовательских данных, находящихся на файловом сервере 
Windows Server 2008 R2 на внешний USB винчестер объемом 2Tb. 
Бэкап должен быть как ежедневным так и Полным. Бэкапы должны храниться 2 недели.

Немного теории:

Полнофункциональное резервирование бывает трех видов:

  1. Полное, FULL (все файлы из конкретных каталогов)
  2. Дифференциальное, DIF (только то, что изменялось с момента последнего полного резервирования)
  3. Инкрементальное, INC (только то, что изменялось с момента просто последнего резервирования – полного или, что чаще, предыдущего инкрементального резервирования).

А следующий важный момент состоит в том, что у файла есть атрибут «Архивный», который устанавливается=1 после любой операции с файлом.

Написал 2 bat файла, первый для полного резервного копирования:

Full WinRAR Archive
 
rem Задаем формат даты и времени для лога
set now=%TIME:~0,-3%
set now=%now::=%
set now=%now: =0%
set now=%DATE:~-4%%DATE:~3,2%%DATE:~0,2%_%now%

rem объявляем переменные для удобства
rem путь до архиватора
set rar_path="C:\Program Files\WinRAR\rar.exe"
rem где хранить архив
set back_path=F:\backups\
rem формат имени архива
set arh_fname=Data_full -ag_DD_MMM_YYYY_NN
rem Расположение файла-списка того что архивируем
set include_list=@d:\script\listbackup.txt
rem Расположение файла-списка исключений
rem set exclude_list=-x@d:\script\listnoback.txt
rem Аргументы архивирования
set rar_argum=-m0 -dh -ac -ow
rem Расположение лога архиватора
set log_path=D:\script\logs\
rem Имя файла лога
set log_filename=full_rar_log.log

rem очищаем временное хранилище файлов
D:\script\clearfolder.bat

rem Удаляем предыдущий бэкап через предыдущий, так чтобы хранилось только 2 полных
forfiles.exe /p %back_path% /s /m *.rar /d -13 /c "cmd /c del /q /f @file" >> %log_path%%now%_%log_filename%

rem Архивируем
%rar_path% a %back_path%%arh_fname% %include_list% %exclude_list% %rar_argum% >> %log_path%%now%_%log_filename%

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


INC WinRAR Archive
 

rem Задаем формат даты и времени для лога
set now=%TIME:~0,-3%
set now=%now::=%
set now=%now: =0%
set now=%DATE:~-4%%DATE:~3,2%%DATE:~0,2%_%now%

rem объявляем переменные для удобства
rem путь до архиватора
set rar_path="C:\Program Files\WinRAR\rar.exe"
rem где хранить архив
set back_path=F:\backups\
rem формат имени архива
set arh_fname=Data_inc -ag_DD_MMM_YYYY_NN
rem Расположение файла-списка того что архивируем
set include_list=@d:\script\listbackup.txt
rem Расположение файла-списка исключений
set exclude_list=-x@d:\script\listnoback.txt
rem Аргументы архивирования
set rar_argum=-m0 -dh -ac -ao -ow
rem Расположение лога архиватора
set log_path=D:\script\logs\
rem Имя файла лога
set log_filename=inc_rar_log.log

rem Затираем бэкапы старше 14 дней
forfiles.exe /p %back_path% /s /m *.rar /d -14 /c "cmd /c del /q /f @file" >> %log_path%%now%_%log_filename%

rem Архивируем
%rar_path% a %back_path%%arh_fname% %include_list% %exclude_list% %rar_argum% >> %log_path%%now%_%log_filename%

Оба скрипта очень похожи но все таки немного отличаются, именами создаваемых файлов и логов, а так же атрибутами запуска архиватора. Утилита forfiles.exe входит в состав OS Windows Server 2008. Но ее можно скачать с сайта MS в составе Windows Server 2003 Resource Kit Tools дляиспользования в более старых версиях OS. Она нужна для удаления старых файлов. Я настроил ее таким образом что при полном бэкапе остаются только 2 полных. И при инкрементальном — остаются юэкапы только за 2 недели.

В скриптах применяется еще один батник clearfolder.bat — он нужен для очистки temp папок. Вот что он из себя представляет:

clearfolder.bat
 
@echo off
set DIRTOCLEAR=V:\MRFolders\Exch.ALLREGIONS\

rem Удаление всех файлов кроме заблокированных
del /s /q /f %DIRTOCLEAR% >nul

rem Удаление всех папок, кроме непустых
dir /s /b /AD %DIRTOCLEAR% > tempdir.txt
for /f "tokens=*" %%I in (tempdir.txt) do (
  rmdir /s /q "%%I" >nul
)
del tempdir.txt >nul

rem Разблокировка файлов
dir /s /b %DIRTOCLEAR% > temp.txt
for /f "tokens=*" %%I in (temp.txt) do (
  openfiles /disconnect /A * /OP "%%I" >nul
)

del temp.txt >nul

rem Повторяем попытку все удалить

rem Удаление всех файлов
del /s /q /f %DIRTOCLEAR% >nul

rem Удаление всех папок
dir /s /b /AD %DIRTOCLEAR% > tempdir.txt
for /f "tokens=*" %%I in (tempdir.txt) do (
  rmdir /s /q "%%I" >nul
)
del tempdir.txt

После создания bat файлов засовываем первый скрипт в Task Sheduler и ставим выполнение раз в неделю. Второй Bat файл так же настраиваем на запуск каждый день вечером кроме субботы и воскресенья, т.к. в эти дни файлы на сервере не меняются и не имеет смысл делать бэкап.

И так, что же может в итоге мой скрипт:

  1. Бэкапит полный архив RARом без сжатия, в субботу вечером. + сбрасывает атрибут «Архивный»(Раз в неделю, в субботу в 21:00)
  2. Бэкапит только изменившиеся данные с момента последнего ежедневного бэкапа без сжатия + снимает атрибут «Архивный» — Инкрементальный бэкап (каждый день в 21:00 кроме субботы и воскресения)
  3. Удаляет предыдущие бэкапы оставляя только 2 полных последних и инкрементальных за последние 14 дней
  4. Очищает временные папки (если нужно)
  5. Пишет логи в настроенную директорию
  6. Использует список исключений по папкам и файлам.
  7. В Windows Server 2008 через шедуллер отправляю уведомление о завершении Таска, по времени можно контролировать правильно ли он выполнился.
  8. Архивирует файлы сохраняя разрешения NTFS

Вроде не так много и не так сложно. А как приятно))) скрипты рабочие. Архив 700 гигов делался 12 часов. Сделался бы и быстрей, но на внешний USB винт тяжело копировать.

Надеюсь комуто да пригодится мой труд.

Оставите комментарий ?

26 Комментарии。

  1. Александр Крайнев

    Работает на ура. Для себя только логи чуток подправил и все.
    Отличное решение!

    • Саш, проверил? А что в логах подправил? может мне тоже полезно будет??)))

      • Александр Крайнев

        Я сделал текст с разделителями и дополнил немного. Это сделал чтоб тянуть в будущем затягивать в NAGIUS для мониторинга.

  2. Павел

    спасибо, попробую. Хорошее простое решение

  3. Михаил

    Бэкапы с помощью RAR — это отличное и простое, как две копейки, решение! В свое время у меня был простейший скрипт для бэкапа ряда папок, который я засунул в планировщик. Ваш скрипт существенно сложнее моего, но мне хватало и работало, как часы.

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

  4. с файлами все нормально, но не бекапит папки

    • Видимо Вы что то не так сделали, у Всех бэкапит вместе с папками.

      • странно… а может из-за того что архиватор пишет, что незарегистрированная версия?

        • все нашел в чем проблема!
          в строчку set rar_argum=-m0 -dh -ac -ow надо добавить -r -Обрабатывать вложенные папки ❗ спасибо, отличный скрипт)

  5. forfiles.exe /p %back_path% /s /m *.rar /d -14 /c «cmd /c del /q /f @file» >> %log_path%%now%_%log_filename%
    вот эта строчка выдаёт ошибку «ОШИБКА: Не найдены файлы, отвечающие условиям поиска.»
    Хотя файлы .rar там точно есть.

    • Эта строчка ищет файлы rar старше 14 дней. Возможно в этой папке у Вас нет таких файлов

  6. Knyazev Dmitry

    Здравствуйте! Подскажите, как можно экранировать пробелы в имени пути папки в файле @filelist? Интересуют имена типа «C:UsersUserDownloadsFolder with space characters». Спасибо.

    • Добрый день. Стандартным способом как в CMD вписать весь путь в двойные кавычки думаю должно помочь

      • Knyazev Dmitry

        Увы — нет. Пробовал двойные, одинарные — не помогает.

        C:UsersUser>»C:Program FilesWinRARrar.exe» a \192.168.0.1backupstest-1day(yesterday)Data_full -ag_DD_MMM_YYYY_NN @C:listbackup.txt -m0 -dh -ac -ow -r 1>>C:logsbackup20140806_130953_full_rar_log.log

        Cannot read contents of C:UsersUser’C:UsersUserDownloadsР РчР?РёС?С’С

        ? Р?РёР°Р+РчС’Р° 2002′

        Синтаксическая ошибка в имени файла, имени папки или метке тома.

        • 1) мне кажется вы сами еще ошибку допустили: Такого пути не может существовать:

          C:UsersUser’C:UsersUserDownloadsР РчР?РёС?С’С
          ? Р?РёР°Р+РчС’Р° 2002′

          2) Думаю winrar просто не понимает кодировку файла
          нужно попробовать сохранить в др кодировке.

          • Knyazev Dmitry

            Я понимаю, C:listbackup.txt содержит C:UsersdfwmlbDownloadsРегистр диабета 2002

            Файл перекодирован в OEM-866 в соответствии с гайдом http://www.cyberforum.ru/cmd-bat/thread738351.html (ранее он мне помогал).

            Скрипт отрабатывает нормально, но по сути ничего не происходит, т.к. судя по сообщению в логе он не находит папку для архивирования:

            Creating archive \192.168.0.223asubackupstest-1day(yesterday)Data_full_06_Aug_2014_01.rar

            WARNING: No files

          • почему в выводе ошибке путь пишется как «C:UsersUser’C:UsersUserDownloads» т.е. 2 раза встречается C:UsersUser. может в этом дело?

          • Knyazev Dmitry

            Нет, я не знаю почему. Я уже выше писал, что указываю все нормально.

            Проблема решена, кодировка файла должна быть Windows-1251.

            Вам спасибо за наводящие вопросы 🙂

          • Knyazev Dmitry

            при добавлении одинарных кавычек: ‘C:UsersdfwmlbDownloadsРегистр диабета 2002′

            скрипт падает в ошибку:

            Cannot read contents of C:Usersdfwmlb’C:UsersdfwmlbDownloads???Ёбва ¤Ё Ў?

            в 2002’

            Синтаксическая ошибка в имени файла, имени папки или метке тома.

          • Knyazev Dmitry

            Хотя, вы правы, дело в кодировке. Латинские папки с пробелами обрабатываются нормально. Тогда вопрос, в какой кодировке указывать?

      • Knyazev Dmitry

        Даже написал в поддержку Rar. Быть может они про синтаксис этого файла пояснят. По идее, должны быть какие-то экранирующие символы.

  7. Специально зарегался чтобы написать комментарий, у вас в коде закралась ошибка. А именно :
    в Full WinRAR Archive , когда вы обозначаете exclude_list , вы ставите его как отдельный оператор, но это по факту аргумент. И Писать его надо в конец аргументов. В вашем случае

    rem Расположение файла-списка того что архивируем
    set include_list=@d:scriptlistbackup.txt
    rem Аргументы архивирования и расположение файла-списка исключений
    set rar_argum=-m0 -dh -ac -ao -ow -x@d:scriptlistnoback.txt

    В конечной строке архивирования убираем exclude list
    rem Архивируем
    %rar_path% a %back_path%%arh_fname% %include_list% %rar_argum% >> %log_path%%now%_%log_filename%

    Надеюсь кому-то будет полезно)

  8. Антон

    Резервное копирование для сервера делал по этой инструкции: http://leakyhead.ru/rezervnoe-kopirovanie-s-pomoshhyu-winrar-s-primerami/

    Всё получилось. У вас слишком сложно начинающему админу)

  9. Ярослав

    Большое Спасибо! +10 к карме)

  10. irmaseo.ru

    Интересное решение, спасибо

Ответить на DJForce ¬
Отменить ответ


Примечание - Вы можете использовать эти HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>