Как стать автором
Обновить

Простая автоматизация резервного копирования под Windows

Время на прочтение7 мин
Количество просмотров33K
Вопрос резервного копирования волнует каждого специалиста, ответственного за сохранность вверенных ему бесценных служебных документов/баз данных/иных файлов. Для того, чтобы чувствовать себя более уверенно перед лицом различных вероятных форс-мажоров, необходимо периодически выполнять резервное копирование критически важных данных. Не менее актуальна проблема сохранения нажитого непосильным трудом и для домашних пользователей.
Вашему вниманию предлагается простой, но эффективный скриптик, помогающий решать данную проблему.



Имеем исходные условия:
Операционная система: MS Windows XP, 2003 и т.п.;
Объекты резервирования: Папки и файлы, находящиеся на локальных и сетевых дисках в объеме ~200 ГБ;
Бюджет: 0 руб.;
Количество специально-обученных сотрудников для настройки процесса: 1 чел.
Количество специально-обученных сотрудников для обслуживания процесса: 0 чел.

Задача: ежедневное полное резервное копирование данных, хранение заданного количества созданных бэкапов без участия оператора.

На просторах Сети можно найти довольно большое количество различных программ решающих подобную задачу. Согласно задачи и поставленных условий были найдены, установлены и протестированы в условиях приближенных к боевым следующие программы: Cobian Backup (9, 10), Toucan, Areca, FBackup, Backup2Net и программа резервного копирования Samsung Auto Backup (идет в комплекте с одноименным съемным диском).

Тестирование данных программ на рабочих объемах данных показало их устойчивую неспособность справиться с простой задачей автоматического создания ежедневных бэкапов данных требуемого объема. Проблемы возникали как на этапе подготовки к выполнению резервирования, так и собственно в прогрессе оного.
Дольше всех (около недели) продержался Cobian Backup 10, после чего пошел в отказную и упорно начал делать бэкапы только около 600 МБ данных и сваливаясь с кучей ошибок в логах. Манипуляции с настройками теневого копирования и архивирования ни к чему, к сожалению не привели, а так в целом программа оставила довольно приятное впечатление, так что к применению рекомендуется (при условии стабильной работы в Ваших конкретных условиях).
Особая надежда была на Toucan, так как программа относится к СПО. Но увы, надежды не оправдались. По ходу выполнения задания на разных этапах программа вываливалась с классической ошибкой о недопустимой операции и необходимости ее (программы) закрытия.
Остальные участники отбора так же не устроили меня по различным причинам. Подробнее раскрывать процесс тестирования указанных программ не вижу особого смысла, т.к. к цели написания данной статьи, это напрямую не относится.
Таким образом, простая идея с поиском свободного решения поставленной задачи оказалась с треском провалена. Так как бродить далее по просторам Сети на предмет бесплатных для коммерческого применения программ резервного копирования уже не было ни сил, ни желания, ни надежды, а бэкапы делать крайне необходимо, то возникло естественное решение/желание соорудить что-то собственное. Результатом раздумий в течении довольно непродолжительного времени стало предлагаемое ниже решение простой автоматизации резервирования данных посредством обыкновенного bat-скрипта и стандартного планировщика. Скрипт работает, что называется, «из коробки», и не требует дополнительного тестирования и отладки, требуется только предоставить ему входные данные и заранее создать участвующие в процессе каталоги (проверок на этот предмет из соображений простоты нет).
Предвидя недовольство многих по поводу выкладывания готовых к употреблению решений, хочу сказать, что не у многих наших сограждан есть желание/время/возможность/талант/вписать нужное, для того чтобы разбираться с синтаксисом стандартной командной строки Windows. Также посмею указать на вероятность отличную от нуля, что хотя бы несколько юных и зеленых администраторов обратят свой взор на несомненную бесполезность изучения данной области.

И так, приступим. Сначала приведу полный текст скрипта без комментариев. Полный разбор с комментариями см. ниже.

@Echo Off
echo %date% %time% ***Start***
SetLocal EnableDelayedExpansion
Set $SRC=list_add.txt
Set $EXC=list_excl.txt
Set $DST=D:\backups
Set $PSW=password
Set $COMPR=1
Set $COPIES=7
C:\"Program Files"\7-Zip\7z.exe a -t7z -mhe=on "%$DST%\files%DATE:~-4%-%DATE:~3,2%-%DATE:~0,2%_%TIME:~0,2%-%TIME:~3,2%-%TIME:~6,2%.7z" @%$SRC% -scsWIN -p%$PSW% -mx=%$COMPR% -ssw -xr@%$EXC% >> log_7z.log
For /F "Delims=" %%i In ('DIR /B/O:-N %$DST%\files????-??-??_??-??-??.7z') Do (
Set /A $COPIES-=1
If !$COPIES! LSS 0 DEL "%$DST%\%%i"
)
echo %date% %time% ***End***


Результатом ежедневной работы скрипта будет набор бэкапов нужных Вам данных, имеющий приблизительно такой вид:
dir d:\backups\

files2010-07-12_22-00-00.7z
files2010-07-13_22-00-00.7z
files2010-07-14_22-00-00.7z
files2010-07-15_22-00-00.7z
files2010-07-16_22-00-00.7z


Обещанный разбор с комментариями.

@Echo Off :: Отключение вывода текста скрипта
echo %date% %time% ***Start*** ::Вывод даты и времени старта скрипта
SetLocal EnableDelayedExpansion :: Команда изменяет работу с переменными в цикле.


В обычном случае, чтобы определить значение переменной окружения, надо воспользоваться конструкцией %переменная%. Однако, если значение переменной меняется внутри цикла и читается там же, то для корректной работы бат-файла, следует использовать команду SetLocal EnableDelayedExpansion и вместо символа "%", использовать символ "!". Иначе, значение переменной в цикле будет всегда одним и тем же — таким, каким было до входа в цикл.

Далее для успешной работы предлагаемого скрипта необходимо задать следущие входные параметры (переменные):

$SRC=list_add.txt ::файл-список архивируемых данных
$EXC=list_excl.txt ::файл-список исключаемых файлов
$DST=D:\backups ::место хранения резервных копий
$PSW=password ::секретный пароль шифрования архива
$COMPR=1 ::степень сжатия данных архиватором 7zip (1=самое быстрое архивирование, 5=нормальное сжатие, 9=ультра-сжатие, 0=архивация без сжатия)
$COPIES=7 ::количество хранимых резервных копий


Следующая строка запускает архивацию посредством 7-Zip файлов и папок перечисленных в файле list_add.txt, кроме файлов, указанных в файле исключений list_excl.txt

C:\"Program Files"\7-Zip\7z.exe a -t7z -mhe=on "%$DST%\files%DATE:~-4%-%DATE:~3,2%-%DATE:~0,2%_%TIME:~0,2%-%TIME:~3,2%-%TIME:~6,2%.7z" @%$SRC% -scsWIN -p%$PSW% -mx=%$COMPR% -ssw -xr@%$EXC% >> log_7z.log

Разберем эту строку подробнее:

C:\«Program Files»\7-Zip\7z.exe :: Указывает место расположения исполняемого файла архиватора 7-Zip (точнее его консольной версии);

a :: это команда добавления файлов/папок в архив;

-t7z :: ключ задает тип создаваемого архива = 7z;

-mhe=on :: включает шифрование паролем заголовка архива и имен файлов/папок в архиве;

%$DST%\files%DATE:~-4%-%DATE:~3,2%-%DATE:~0,2%_%TIME:~0,2%-%TIME:~3,2%-%TIME:~6,2%.7z
Команда динамически формируем полный путь и имя файла архива вида «D:\backups\files2010-07-12_22-00-00.7z», где в имени присутствуют дата и время архивации;

@%$SRC% :: задает имя файла-списка архивируемых данных, вместо %$SRC% скрипт подставляет имя файла;

-scsWIN :: задает кодировку win для файла-списка;

-p%$PSW% :: ключ задает пароль для шифрования архива, вместо %$PSW% скрипт подставляет текстовую строку пароля;

-mx=%$COMPR% :: ключ задает степень сжатия архивируемых данных;

-ssw :: ключ разрешает архивацию файлов открытых приложениями на запись;

-xr@%$EXC% :: задает имя файла-списка данных, исключаемых из процесса архивации, r = означает, что надо исключать и подпапки, вместо %$EXC% скрипт подставляет имя файла;

>> log_7z.log :: символы >> обозначают перенаправление сообщений выводимых всей строкой с экрана (стандартного потока) в файл log_7z.log, это удобно для последущего анализа работы скрипта;

Эта часть скрипта отвечает за автоматическое удаление уже ненужных архивов данных, в соответствии с количеством заданым переменной $COPIES.

For /F "Delims=" %%i In ('DIR /B/O:-N %$DST%\files????-??-??_??-??-??.7z') Do (
Set /A $COPIES-=1
If !$COPIES! LSS 0 DEL "%$DST%\%%i"
)


Разберем подробнее. Автоматическое удаление реализуется путем организации цикла, в ходе которого перебирается набор имен (множество) файлов архивов (как оно формируется — см. чуть ниже строку DIR...)
В общем виде наш цикл имеет вид: for /F [«КлючевыеСловаРазбора»] {%% | %}переменная in (МножествоИменФайлов) do команда [ПараметрыКоманднойСтроки]
Ключ /F определяет, что цикл произведет разбор всех элементов множества «МножествоИменФайлов»;
«КлючевыеСловаРазбора» — указывают какие разделители используются между элементами разбираемого множества, в нашем случае — разделителя нет;
%%i — переменная i, которая содержит в каждый шаг итерации текущий элемент разбираемого множества (т.е. очередное имя файла в нашем случае).

DIR /B/O:-N %$DST%\files????-??-??_??-??-??.7z

Команда формирует набор (множество) имен файлов, содержащихся в папке заданной переменной $DST и соответствующих маске files????-??-??_??-??-??.7z, где знак вопроса обозначает любой символ в данной позиции; ключ /B задает вывод только имен файлов, а ключ /O:-N задает сортировку по имени (N) или в обратном порядке (-N), в нашем случае — порядок обратный.
Набор имеет вид:
files2010-07-01_22-00-00.7z
files2010-06-30_22-00-00.7z
files2010-06-29_22-00-00.7z

Обратите внимание на порядок сортировки элементов!

Do (...) — в скобках содержится команда(ы), выполняемые в каждой итерации, в нашем случае:
Set /A $COPIES-=1 :: декремент переменной COPIES, выполняющей роль счетчика цикла;
If !$COPIES! LSS 0 DEL "%$DST%\%%i" :: команда проверяет условие $COPIES LSS 0 т.е. $COPIES<0, если истина, то следует исполнение команды удаления файла-архива с именем текущего элемента, таким образом количество хранимых копий архива не превысит заданное значение, в нашем примере $COPIES=7.

echo %date% %time% ***End*** ::Вывод даты и времени окончания работы скрипта

Также приведу, для примера, содержимое файла-списка list_add.txt:

M:\mail
U:\updates
Z:\Бухгалтерия
Z:\Отдел*
z:\Справка
Z:\Сисадмин

И файла исключений list_excl.txt:

*.bak
*.tmp
*.avi
*.mkv
*.mp3


Собственно вот весь расклад. Скриптик маленький, но надежно работающий. Хитростей никаких нет, все достаточно просто.
Да и напоследок банальность… Для автоматизации запуска можно использовать стандартный планировщик Windows, командной строкой вида «d:\backup\backup.bat >> d:\backup\backup.log». Это позволит вывести сообщения скрипта в лог-файл.
Всем удачи.

Литература:

1) Справочник по параметрам командной строки от MS.
technet.microsoft.com/ru-ru/library/cc737438%28WS.10%29.aspx

2) Подробная справка по функциям консольной версии 7-Zip прилагается к архиватору.
Теги:
Хабы:
Всего голосов 21: ↑17 и ↓4+13
Комментарии21

Публикации