Типовая задача

Необходимо организовать ежедневное резервное копирование большого объема данных. При этом должна быть возможность восстановить данные или отдельный файл по состоянию на любую дату за определенный срок. Также необходимо обеспечить ежемесячное архивирование данных на DVD для длительного хранения.

Выбор решения

Будем считать, что ленточного накопителя нет, и его покупка невозможна из-за ограниченного бюджета. Для хранения резервных копий будет использоваться отдельный каталог на файловом сервере. Для надежности можно этот каталог каждую ночь зеркалировать на другой сервер или (в небольших организациях) даже на рабочий компьютер администратора.

Из-за большого объема данных создание полного архива каждый день нежелательно. Полную резервную копию имеет смысл делать 1 раз в неделю, в выходные, когда сервер и сеть менее всего загружены. В остальные дни достаточно копировать только файлы, измененные со времени создания полной копии.

В известном бесплатном архиваторе 7-Zip есть малоизвестная возможность создания разностных архивов. Учитывая простоту извлечения данных из такого архива, решено использовать описанный далее способ резервного копирования.

Команды 7-Zip

Один раз в неделю (в выходные) создавать полный архив каталога:

7z a "D:\Backup\full.7z" -r "C:\Data"

Ежедневно (по рабочим дням) создавать разностный архив:

7z u "D:\Backup\full.7z" -r -u- -up0q3x2z0!"D:\Backup\diff-DD.MM.YY.7z" "C:\Data"

При этом:

  1. Полный архив изменяться не будет, благодаря опции -u-;
  2. Если файл попал в полный архив, но к моменту создания разностного архива был удален из исходного каталога, он будет удален при распаковке разностного архива поверх полного, за это отвечает опция q3;
  3. Если файл в исходном каталоге старее чем файл в полном архиве (не важно, по какой причине), он будет добавлен в разностный архив и при его распаковке поверх полного архива заменит более новый, за это отвечает опция x2.

Автоматизация при помощи VBScript

Для разовой упаковки данных достаточно указанных выше двух команд архиватора. Для организации непрерывного резервного копирования необходима автоматизация. Сценарий VBScript применяется для решения множества вспомогательных задач:

  1. Указание исходного каталога с данными;
  2. Выбор полного или разностного способа архивации в зависимости от параметра командной строки;
  3. Поиск имени последнего полного архива для создания на его основе разностного архива;
  4. Удаление устаревших архивов для освобождения места;
  5. Запись действий по созданию и удалению архивов и всех событий в текстовый файл («журнал»);
  6. Отслеживание повторного запуска;
  7. Предупреждение и обработка ошибок.

Загрузка и установка скрипта

Скрипт для ежедневного разностного резервного копирования данных, формат VBS, упакован ZIP: backup_diff.zip

Установка:

  1. Выбрать место для хранения резервных копий, создать отдельный каталог и поместить туда скрипт.
  2. Установить архиватор 7-Zip на том компьютере, где будет выполняться скрипт. Если это невозможно или нежелательно, взять откуда-нибудь файл 7z.exe и поместить рядом со скриптом.
  3. Открыть скрипт в текстовом редакторе, проверить настройки (см. далее), при необходимости изменить.
  4. Запустить скрипт с параметром командной строки full, рядом будет создан полный архив. Если нет — проверить настройки еще раз.
  5. Запустить скрипт с параметром командной строки diff, рядом будет создан разностный архив. Если нет — проверить настройки еще раз.
  6. Добавить ежедневный запуск скрипта по расписанию (см. «Назначенные задания»): по выходным — с параметром full для создания полного архива, по рабочим дням ночью — с параметром diff для создания разностного архива.

Подробное описание скрипта

Опции командной строки

И полное, и разностное копирование делается одним сценарием. Так сделано для удобства настройки, да и отличий немного и дублировать команды нет смысла. Когда какой способ копирования — полный или разностный использовать — решается вне скрипта, скорее всего для этого назначается задание в планировщике.

Сценарию необходимо передать параметр командной строки, один из двух вариантов:

  • full — создание полного архива
  • diff — создание разностного архива

Если параметр не указан, будет выдано сообщение с подсказкой. Заодно отображается копируемый каталог и файл журнала, где можно увидеть результаты и ошибки.

Журнал

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

Пример:

22.08.2009 01:00:03 backup-22.08.2009-full.7z: Ok
22.08.2009 02:18:32 backup-01.08.2009-full.7z: устарел, должен быть УДАЛЕН
22.08.2009 02:18:32 backup-01.08.2009-04.08.2009.7z: устарел, должен быть УДАЛЕН
22.08.2009 02:18:32 backup-01.08.2009-05.08.2009.7z: устарел, должен быть УДАЛЕН
24.08.2009 01:00:02 backup-22.08.2009-24.08.2009.7z: Ok
24.08.2009 08:43:28 backup-22.08.2009-24.08.2009.7z: создан РАНЕЕ и не будет перезаписан

Именование архивов

В архивах 7-Zip нет возможности добавить комментарий, поэтому необходимую информацию надо включать в имя архива. Предлагается такая схема:

ПРЕФИКС-ДД.ММ.ГГГГ-full.7z
ПРЕФИКС-ДД.ММ.ГГГГ-ДД.ММ.ГГГГ.7z
  • ПРЕФИКС — условное обозначение архивируемого ресурса, например buhg, project, ivanov. Чтобы избежать путаницы, логично то же имя использовать и для названия каталога с архивами, и для именования сетевого ресурса, если данные доступны по сети, и для маркировки DVD, на котором будут храниться архивы.
  • ДД.ММ.ГГГГ — дата создания архива. Для разностного архива указывается две даты — сначала дата соответствующего полного архива, затем дата создания разностного архива.
  • full — специальная метка полных архивов, именно по ней скрипт отбирает файлы при создании разностных копий и удалении устаревших архивов.

Восстановление данных

Принятая система именования архивов позволяет быстро находить необходимые для восстановления данных файлы. Порядок действий такой:

  1. Определить дату, по состоянию на которую нужно восстановить данные.
  2. Найти файл за выбранную дату, для этого удобно отсортировать файлы по дате изменения.
  3. Если в имени файла есть метка full, то достаточно только одного этого полного архива. Иначе нужно искать соответствующий полный архив, имя которого вычисляется из имени найденного разностного.
  4. Восстановить нужный каталог из полного архива. Затем «поверх» полного восстановить тот же каталог из разностного архива, если он есть.

Удаление устаревших архивов

Применяется для предупреждения полного заполнения диска, когда невозможно будет создавать новые архивы. Благодаря этому архивация может длительное время выполняться вообще без участия администратора. Хотя, конечно, проверять журнал следует ежедневно и опасность нехватки места для создания архива не исключается по другим причинам, например — при резком увеличении объема архивируемых ресурсов или более частом, чем обычно, их изменении.

В настройках задается максимальное количество полных архивов. После создания нового полного архива самый старый (по дате файла) полный архив будет удален. Вместе с ним будут удалены и все разностные архивы, созданные на его основе.

Const HISTORY = 3  'количество полных архивов в истории

Архивирование данных на DVD для длительного хранения

Для длительного хранения целесообразно периодически (раз в месяц или раз в неделю) записывать архивы на DVD и переносить в надежное место за пределами офиса для длительного хранения.

Архивы, записываемые на DVD, следует разбивать на тома размером 4,7 * 109 / 10242 = 4480 Мб. В 7-Zip для этого служит опция командной строки:

-v4480m

При записи диска желательно использовать наряду с файловой системой UDF еще и ISO9660. Иначе данные будут недоступны в Windows XP, хотя для Windows 2003/Vista достаточно одной только файловой системы UDF. Кроме того, в ISO9660 есть трудности с поддержкой файлов более 4,2 Гб, поэтому имеет смысл разбивать архивы на тома по пол-диска DVD, т.е. 0,5 * 4480 = 2240 Мб. В скрипте это указывается в значении константы OPTIONS:

Const OPTIONS = "-r -mx5 -x@exclude.txt -v2240m"  'опции архиватора