При резервном копировании путём простого копирования файлов возникает вопрос: «как убедиться в целостности данных». Ведь если, например, копировать 50-гиговую базу lotus сервера, то в процессе копирования одной части может измениться другая и целостность будет нарушена. А в некоторых случаях (например с базами данных) может появиться необходимость остановки службы, но нет возможности остановить её на пару часов.

Для подобных задач Windows имеет полезный инструмент. Впервые о подобной технологии я узнал работая с FreeBSD, затем узнал про LVM в Linux, а поискав такое же решение для Windows обнаружил, что оно здесь тоже есть и называется Volume Shadow Copy.

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

Я приведу пример автоматического создания слепка для резервного копирования базы Lotus Domino (останова она не требует) и поясню как оно работает. Скрипт можно легко адаптировать под свои нужды.


snapshot.cmd


rem Go to the script's directory
%~d0
cd %~dp0

rem Get options or exit
call snapshot_env.cmd || exit 1

date /t > %snapshot_date%
date /t >> %snapshot_status%

rem Delete the oldest shadow of the specified volume
vshadow -do=%snapshot_drive% > %snapshot_create_volume% && echo Removing old OK >> %snapshot_status% || echo Removing old ERR >> %snapshot_status%
rem Force removing the share if it haven't done itself (it happens sometimes)
net share %snapshot_share% /delete

rem Create a persistent shadow copy
vshadow -p -script=%snapshot_var_script% %snapshot_drive% >> %snapshot_create_volume% && echo Snapshot OK >> %snapshot_status% || echo Snapshot ERR >> %snapshot_status%
call %snapshot_var_script%

rem Expose a child directory from the shadow copy as a share
vshadow -er=%SHADOW_ID_1%,%snapshot_share%,%snapshot_path% && echo Sharing OK >> %snapshot_status% || echo Sharing ERR >> %snapshot_status%

echo --- >> %snapshot_status%


snapshot_env.cmd


set snapshot_drive=e:
set snapshot_path=lotus
set snapshot_share=lotus$
set snapshot_var_script=snapshot_vars.cmd
set snapshot_status=logs\snapshot_status.log
set snapshot_create_volume=logs\snapshot_create_volume.log
set snapshot_date=%snapshot_drive%\%snapshot_path%\snapshot_date.log


Как это работает


— Скрипт snapshot.cmd после запуска считывает параметры из файла snapshot_env.cmd
— Создаётся файл %snapshot_date% в директории, которая будет архивироваться (позже объясню зачем)
— Удаляет старые снапшоты, если таковые имелись и расшаренные директории
— Создаёт новый снапшот для диска %snapshot_drive%
— Расшаривает директорию %snapshot_path% с сетевым именем %snapshot_share% (т.е. по сети можно будет обратиться к этой директории как \\server\lotus$). Важный момент — права на директорию будет иметь группа Backup operators, а это значит вам нужно будет создать специального пользователя lotus-backup, добавить его в группу Backup operators и использовать его в скриптах для подключения к папке \\server\lotus$ по сети.
— Начиная с этого момента данные из директории \\server\lotus$ можно спокойно и в любом темпе копировать в надёжное место :)

А теперь отдельно скажу о том, зачем же нужен был файл %snapshot_date%. Этот фа��л нужен для того, чтобы по сети можно было отличить вновь созданный снапшот от старого, который по той или иной причине не удалился. Это можно сделать проверив дату создания файла %snapshot_date% (у нас это делает nagios).

Требования


— vshadow.exe, необходимый для работы скриптов вы можете найти в Volume Shadow Copy Service SDK который можно скачать по ссылке: www.microsoft.com/downloads/en/details.aspx?FamilyID=0b4f56e4-0ccc-4626-826a-ed2c4c95c871
— Работа всего этого проверялась только на Windows Server 2003

PS: кстати, Windows-клиент Bacula, на сколько я знаю, так же использует технологию «Volume Shadow Copy» в своей работе.