Вступление
Бэкапы надо делать всегда. Особенно для серверов. Это аксиома. Существуют разные
способы бэкапа - просто копирование, архивация, множество специализированного софта
(в том числе, например, и штатный бэкап от Microsoft), работающего с дисками, лентами,
МО и т.д. Но что делать, если сторонний софт устанавливать нельзя, а
возможностей штатного не хватает? Например, хочется иметь бэкап некоторых ценных папок сервера,
в автоматическом режиме, за, скажем, последнюю неделю? Писать свою софтину? Можно.
Но не охота. Из пушки по воробьям. Охота обойтись просто скриптом. И в этом нам
поможет хороший архиватор WinRAR, встроенный планировщик Windows
и книга Джесси Торреса "Скрипты для администратора Windows".
Как будет работать бэкап
Итак, мне требуется:
- Хранить бэкап за каждый день в виде архивного файла
- Каждый файл должен создаваться с уникальным именем (в идеале включать дату создания
в имя файла)
- Процесс создания бэкапа должен проходить в автоматическом режиме
- Файлы старше 1 недели должны автоматически удаляться
Архивацией будет заниматься WinRAR, он же будет автоматически именовать файлы. Определять
возраст и удалять старые файлы будет скрипт (VBScript),
а автоматизировать все я
буду с помощью встроенного Планировщика Windows.
Скрипты
Основу скриптов составляют процедуры из книги Джесси Торреса "Скрипты
для администратора Windows" (а конкретно из главы 3
"Обслуживание файлов"). Они были дополнены мной для реализации
моих задач.
Вот какие функции нам понадобятся (привожу код целиком):
' ----------
' Начало основной секции. Отсюда начнется выполнение при запуске скрипта.
Set FSO = CreateObject("Scripting.FileSystemObject")
' директория, где будут храниться бэкапы. Вы должны вписать свою директорию
' вместо "X:\DailyBackup"
sDir = "X:\DailyBackup"
Set objDir = GetFolder(sDir)
DeleteOlderFiles(objDir)
' ---------- Секция функций
' Получить файл
Function GetFile(sFile)
On Error Resume Next
Set FSO = CreateObject("Scripting.FileSystemObject")
Set GetFile = FSO.GetFile(sFile)
if err.number <> 0 then
WScript.Echo "Error Opening file " & sFile & VBlf & "["&Err.Description&"]"
Wscript.Quit Err.number
end if
End Function
' Получить папку
Function GetFolder (sFolder)
On Error Resume Next
Set GetFolder = FSO.GetFolder(sFolder)
if err.number <> 0 then
WScript.Echo "Error Opening folder " & sFolder & VBlf & "["&Err.Description&"]"
Wscript.Quit Err.number
end if
End Function
' удалить один файл (имя файла передается в sFile)
Sub DeleteFile(sFile)
On Error Resume Next
FSO.DeleteFile sFile, True
if err.number <> 0 then
WScript.Echo "Error Deleteing file " & sFile & VBlf & "["&Err.Description&"]"
Wscript.Quit Err.number
end if
End Sub
' Удалить файлы старше 7 дней
Sub DeleteOlderFiles(objDir)
' просматриваем все файлы в директории
for each efile in objDir.Files
' используем DateLastModified, а не DateCreated, поскольку
' DateCreated не всегда возвращает правильную дату
FileDate = efile.DateLastModified
Age = DateDiff("d",Now,FileDate)
' в данном случае возраст файла не больше семи дней
If Abs(Age)>7 Then
DeleteFile(efile)
End If
next
End Sub
Этот код помещаем в файл remove_old_backups.vbs.
Командная строка WinRAR
Архиватор WinRAR обладает мощной поддержкой командной строки. В частности, он может
формировать имя файла на основе пользовательского шаблона, включая в него разную
служебную информацию, например, дату. Что нам, собственно говоря, и требуется. Кроме
того, он умеет работать со списком файлов или директорий на архивацию, что сильно
облегчает редактирование командного файла.
Я использую следующую командную строку для архивирования (прописана в файле make_daily.bat):
"c:\program files\winrar\winrar.exe" a -s -r -rr10p -dh -ed -m3 -ilogC:\DailyBackupScript\dailybackup.log -ag+YYYYMMDD X:\DailyBackup\backup
Разберем ее по составляющим:
- "c:\program files\winrar\winrar.exe" - путь к WinRAR-у
- a - команда на добавление файлов
- -s - режим сжатия "solid"
- -r - с поддиректориями
- -rr10p - на всякий случай добавляем информацию для восстановления
(-rr), в количестве 10% (10p)
- -dh - открывать шареные фалы. Полезно, если кто-нибудь засиделся
до 12 ночи, и редактирует файл, который должен уйти в бэкап
- -ed - не добавлять пустые директории
- -m3 - степень сжатия 3
- -ilogC:\DailyBackupScript\dailybackup.log - вести лог (-ilog) и
записывать его в "C:\DailyBackupScript\dailybackup.log"
- -ag+YYYYMMDD X:\DailyBackup\backup - формировать имя файла, прибавляя
в начало текущий год, месяц и число. Имя файла будет иметь примерно такой вид: 20060927backup.rar
- X:\DailyBackup\backup - папка, куда писать бэкапы и имя бэкапа
(к которому в начало дописываются год, месяц, число)
Командные файлы
Вся работа по созданию бэкапа строится на основе командных файлов (.bat-файлов).
У меня их два:
- make_daily.bat - содержит команды для создания архивного файла
или файлов.
- backup_task.bat - выполняет следующие действия:
- вызывает интерпретатор скриптов cscript и передают ему на выполнение скрипт, удаляющий
старые файлы.
- вызывает make_daily.bat и передает ему в качестве параметра либо папку, которую надо
архивировать, либо файл-список (в котором несколько папок на архивацию).
- В свою очередь, backup_task.bat вызывается Планировщиком
Windows в назначенное время
Содержимое файла make_daily.bat (в одну строку):
@"c:\program files\winrar\winrar.exe" a -s -r -rr10p -dh -ed -m3 -ilogC:\DailyBackupScript\dailybackup.log -ag+YYYYMMDD X:\DailyBackup\backup %1
Содержимое файла backup_task.bat:
@cscript remove_old_backups.vbs
call make_daily.bat @backup.lst
Для работы также необходимо создать файл backup.lst (обычный текстовый
файл). Он должен содержать список директорий, которые включаются в бэкап. Каждая
директория должна располагаться на отдельной строчке, например, так:
c:\Projects
c:\VeryImportantProjects
c:\Folder Name With Spaces\SubFolder
Обратите внимание, что имя директории-источника, содержащее пробелы, не обязательно
заключать в кавычки, если вы пользуетесь файл-списком. Если же вы передаёте его
напрямую, то кавычки обязательны. Не ставьте завершающий слэш - WinRAR
этого не поймёт.
Планировщик
Планировщик можно вызвать через меню Start|Programs|Accessories|System Tools|Scheduled
Tasks, или через Control Panel. Откроется папка Scheduled
Tasks, в которую и надо добавить новую задачу. Это можно сделать
следующим образом (я привожу только основные шаги).
Дважды щелкаем Add Scheduled Task, чтобы добавить новую задачу
Выберем наш bat-файл:
Зададим имя и периодичность задачи
Зададим время запуска
Зададим учетную запись и пароль, от имени которой будет выполняться задача. Обязательно!
Задача добавлена
Редактировать свойства задачи можно, щелкнув правой кнопкой мыши на иконке задачи
в папке Sheduled Tasks и выбрав пункт меню Properties.
Заключение
Вот мы и создали простейший, но мощный :) "бэкапер" (или бэкапщик? как правильно
?) из подручных средств. Его можно расширять и настраивать, менять архиваторы, прикручивать
всякие проверки и т.д. И все это без использования сторонних продуктов и почти без
программирования.
Надеюсь, мой опыт окажется для вас полезным.
Ссылки
- Файлы к статье. Перед использованием не забудьте изменить
все пути в файлах backup.lst, backup_task.bat,
make_daily.bat и remove_old_backups.vbs
на ваши реально существующие!!! Комментарии в файлах на английском (привычка
+ сервера у нас специфические).
- WinRAR
- Торрес Дж. "Скрипты для администратора Windows". Специальный справочник.
- Спб.: Питер, 2002. - 336 с.: ил., ISBN 5-318-00488-1
-
NoNaMe, где проскакивали ссылки на эту и другие
полезные книги. Прямой ссылки у меня нет.