Вопрос резервного копирования волнует каждого специалиста, ответственного за сохранность вверенных ему бесценных служебных документов/баз данных/иных файлов. Для того, чтобы чувствовать себя более уверенно перед лицом различных вероятных форс-мажоров, необходимо периодически выполнять резервное копирование критически важных данных. Не менее актуальна проблема сохранения нажитого непосильным трудом и для домашних пользователей.
Вашему вниманию предлагается простой, но эффективный скриптик, помогающий решать данную проблему.
Имеем исходные условия:
Операционная система: 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. Также посмею указать на вероятность отличную от нуля, что хотя бы несколько юных и зеленых администраторов обратят свой взор на несомненнуюбесполезность изучения данной области.
И так, приступим. Сначала приведу полный текст скрипта без комментариев. Полный разбор с комментариями см. ниже.
Результатом ежедневной работы скрипта будет набор бэкапов нужных Вам данных, имеющий приблизительно такой вид:
Обещанный разбор с комментариями.
В обычном случае, чтобы определить значение переменной окружения, надо воспользоваться конструкцией %переменная%. Однако, если значение переменной меняется внутри цикла и читается там же, то для корректной работы бат-файла, следует использовать команду SetLocal EnableDelayedExpansion и вместо символа "%", использовать символ "!". Иначе, значение переменной в цикле будет всегда одним и тем же — таким, каким было до входа в цикл.
Далее для успешной работы предлагаемого скрипта необходимо задать следущие входные параметры (переменные):
Следующая строка запускает архивацию посредством 7-Zip файлов и папок перечисленных в файле list_add.txt, кроме файлов, указанных в файле исключений list_excl.txt
Разберем эту строку подробнее:
C:\«Program Files»\7-Zip\7z.exe :: Указывает место расположения исполняемого файла архиватора 7-Zip (точнее его консольной версии);
a :: это команда добавления файлов/папок в архив;
-t7z :: ключ задает тип создаваемого архива = 7z;
-mhe=on :: включает шифрование паролем заголовка архива и имен файлов/папок в архиве;
Команда динамически формируем полный путь и имя файла архива вида «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.
Разберем подробнее. Автоматическое удаление реализуется путем организации цикла, в ходе которого перебирается набор имен (множество) файлов архивов (как оно формируется — см. чуть ниже строку DIR...)
В общем виде наш цикл имеет вид: for /F [«КлючевыеСловаРазбора»] {%% | %}переменная in (МножествоИменФайлов) do команда [ПараметрыКоманднойСтроки]
Ключ /F определяет, что цикл произведет разбор всех элементов множества «МножествоИменФайлов»;
«КлючевыеСловаРазбора» — указывают какие разделители используются между элементами разбираемого множества, в нашем случае — разделителя нет;
%%i — переменная i, которая содержит в каждый шаг итерации текущий элемент разбираемого множества (т.е. очередное имя файла в нашем случае).
Команда формирует набор (множество) имен файлов, содержащихся в папке заданной переменной $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.
Также приведу, для примера, содержимое файла-списка list_add.txt:
И файла исключений list_excl.txt:
Собственно вот весь расклад. Скриптик маленький, но надежно работающий. Хитростей никаких нет, все достаточно просто.
Да и напоследок банальность… Для автоматизации запуска можно использовать стандартный планировщик 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 прилагается к архиватору.
Вашему вниманию предлагается простой, но эффективный скриптик, помогающий решать данную проблему.
Имеем исходные условия:
Операционная система: 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 прилагается к архиватору.