четверг, 6 марта 2014 г.

Создание консистентных VSS снимков внутри ВМ под Hyper-V

Не так давно мне пришлось решать задачу копирования базы с производственного MS SQL сервера, работающего внутри виртуальной машины под Hyper-V 3.0. Задача осложнялась тем, что на время копирования сервер нельзя было останавливать, прямого доступа по сети к ВМ не было, и, к тому же, в ВМ не было никакой системы резервного копирования кроме встроенной... и места для копии не было... и задачу надо было решить быстро.

На выручку пришли известные многим мгновенные снимки (VSS Snapshots). Данный механизм позволяет создавать консистентные копии файлов и данные приложений, таких как: базы Microsoft Active Directory, Exchange или SQL Server, виртуальные машины Hyper-V и прочее.

Краткая суть метода

1) Создать VSS снимок раздела, на котором хранятся базы, внутри гостевой ОС.
2) Создать снимок раздела, на котором хранятся виртуальные диски ВМ, на хосте Hyper-V.
3) Смонтировать снимок с виртуальными дисками.
4) Смонтировать виртуальный диск.
5) Смонтировать снимок раздела на виртуальном диске.
6) Скопировать нужные файлы баз с хоста Hyper-V.
7) Размонтировать все в обратном порядке.
8) ???
9) Profit!

Более подробно

Для начала подключитесь к гостевой ОС и проверьте, что в системе присутствует и нормально работает VSS Writer для SQL сервера (SQLServerWriter). В консоли CMD выполните команду:
vssadmin list writers

Создайте VSS снимок, используя команду: vssadmin create shadow /for=X:
, где X: - буква раздела, где размещаются искомые базы SQL сервера.

Запомните, а лучше запишите значение параметра Shadow Copy ID и время создания, они потребуются в дальнейшем, чтобы найти нужный снимок.

Теперь подключитесь к хосту Hyper-V, на котором работает виртуальная машина и проверьте, что на нем также присутствует необходимый VSS Writers для ВМ (Microsoft Hyper-V VSS Writer).

Создайте VSS снимок, используя команду: vssadmin create shadow /for=X:
, где X: - буква раздела, где размещаются vhd диски виртуальной машины.

Смонтируйте мгновенный снимок, создав на него символическую ссылку с помощью команды mklink: mklink /D C:\VMSnapshots\ \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy3\
, где C:\VMSnapshots\ - путь для монтирования (папки с таким именем быть не должно);
\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy3\ - имя VSS снимка.

Обратите внимание, что после имени снимка требуется поставить обратный слэш ("\"), в противном случае созданная ссылка будет работать некорректно.

Откройте оснастку управления дисками (Disk Management - diskmgmt.msc) и в меню выберите Action | Attach VHD.

В окне Attach Virtual Hard Disk укажите путь к виртуальному диску из смонтированного VSS снимка и поставьте флаг Read-only.

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

В консоли выполните команду vssadmin list shadows чтобы проверить, что доступен VSS снимок, сделанный в гостевой ОС.

Используя команду mklink, подключите VSS снимок, используя новые значения пути и имени снимка (например, "C:\SQLSnapshot"). Если снимков много, то найти нужный можно по значению параметра Shadow Copy ID и времени создания.
mklink /D C:\SQLSnapshots\ \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy4\

Теперь вы можете просто зайти в нужную папку по символической ссылке и скопировать нужные файлы базы с хоста Hyper-V.

После копирования выполните следующие операции, чтобы привести систему в исходное состояние:
1) Удалите символическую ссылку с VSS снимком гостевой ОС.
2) Отмонтируйте vhd виртуальный диск (Detach) из оснастки Disk Management.
3) Удалите символическую ссылку с VSS снимком виртуальной машины.
4) Выполните команды vssadmin delete shadows /for=X: чтобы удалить лишние VSS снимки с хоста и из гостевой ОС.

И как всегда несколько засад...

По какой-то причине, виртуальные диски в формате vhdx не монтируются из read-only раздела.

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

Альтернативный, в чем-то даже более простой, метод, заменяющий шаги 2-4, заключается в создании снимка ВМ целиком (Checkpoint / VM Snapshot) из консоли Hyper-V Manager с последующим монтированием исходного vhd диска ВМ в read-only. Пожалуй, единственным недостатком тут может быть только то, что при активной записи данных на диск, удаление снимка ВМ займет больше времени, чем VSS снимка.

P.S. Надеюсь, кому-нибудь такой метод пригодится. При желании, если диски ВМ расположены на каком-нибудь общем томе, подключенном по iSCSI или FC, после создания снимков можно презентовать том в режиме read-only стороннему серверу, получив, таким образом, импровизированную Off-Host/LAN-Free систему резервного копирования. С ручным копированием через системного администратора. ;-)

1 комментарий:

  1. слишком много телодвижений... достаточно смонтировать диск получателя и забэкапить туда нужное. на получателе восстановиться. При этом нет рисков получить неконсистентную БД.

    ОтветитьУдалить