Миграция БД на Windows Azure SQL VM через виртуальный диск

 

Предыдущий способ переноса резервной копии базы с локального компьютера на виртуальную машину с SQL Server в Облаке использовал Azure Storage, который не является NTFS-видимым. Таким образом, перед восстановлением бэкап базы нужно было скопировать из Azure Storage на виртуальный диск, чтобы установленный на виртуалке SQL Server его увидел. В случае БД значительного объема это ведет к неоправданному расходу пространства в Azure Storage и, как следствие, к дополнительным затратам: сначала бэкап загружается в облачное хранилище, а затем копируется в vhd, который хранится там же. Чтобы избежать этих затрат, в этой статье мы рассмотрим иной способ. Локально будет создан отдельный vhd, на котором будет размещен бэкап базы. Затем vhd будет загружен в Azure Storage и приаттачен в качестве дополнительного диска облачной виртуалки. С него будет произведено восстановление резервной копии.

Чтобы локально создать виртуальный диск, заходим в Administrative Tools\Computer Management\Disk Management и выбираем пункт Create VHD из контекстного меню:

image001

Рис.1

Указываем полный путь к vhd-файлу, который будет создан, желаемый размер, достаточный для того, чтобы вместить резервную копию базы, а также - будет ли этот размер фиксированный или динамически расширяемый:

image002

Рис.2

Кликаем по диску и выбираем из контекстного меню пункт "Инициализировать диск":

image003

Рис.3

image004

Рис.4

Создаем том:

image005

Рис.5

image006

Рис.6

и форматируем его под NTFS:

image007

Рис.7

Созданный vhd начинает видеться как дополнительный диск локальной машины. Копируем на него бэкап базы:

image008

Рис.8

Для проверки созданный vhd можно добавить в качестве дополнительного диска к локальной виртуалке. На всякий случай напомню, что в Windows 8 технология виртуализации Hyper-V (включая средство управления Hyper-V Manager) поддерживается, что называется, из коробки. Не требуется устанавливать Hyper-V Server отдельно и администрировать при помощи RSAT, как было в случае Windows 7.

У меня по случаю имеется локальная виртуальная машина, которой я делаю shutdown и присоединяю дополнительный диск:

image009

Рис.9

image010

Рис.10

Перед стартом виртуальной машины vhd требуется детачить в Disk Management на хосте:

image011

Рис.11

Убедившись, что содержание диска нормально читается на локальной виртуальной машине:

image012

Рис.12

гасим ее, отсоединяем диск, нажав кнопку Remove на Рис.10, и загружаем диск в Azure Storage. Проще всего это сделать при помощи утилиты csupload, входящей в состав Windows Azure SDK, который мы поставили в предыдущей статье. Перед загрузкой предварительно требуется создать сертификат X.509 v3, как указано в документации. Для этого я воспользуюсь утилитой makecert, которая ставится, например, в составе Visual Studio:

"C:\Program Files (x86)\Windows Kits\8.0\bin\x86\makecert.exe" -sky exchange -r -n "CN=MyCert" -pe -a sha1 -len 2048 -ss My "c:\Temp\MyCert.cer"

Скрипт 1

image013

Рис.13

Теперь сертификат нужно положить в Облако. Заходим в Azure Management Portal, кликаем на Settings в левой панели, внизу нажимаем кнопку Upload:

image014

Рис.14

Находим файл сертификата c:\Temp\MyCert.cer, созданный в Скрипте 1 и указываем его для загрузки. Сертификат успешно загружается:

image015

Рис.15

Для загрузки vhd в Azure Storage должен иметься Storage Account. Как минимум, один был создан автоматически на этапе создания виртуальной машины, а второй мы создали в предыдущей статье для загрузки файла бэкапа. Не имеет значения, какой из них использовать. Я возьму последний (tststorage), в котором создам приватный контейнер myvhds, чтобы положить туда свежесозданный виртуальный диск с бэкапом базы. Напомню, что заглавные буквы в названии контейнера не воспринимаются.

image016

Рис.16

Для использования утилиты csupload требуется сформировать строку соединения. Это можно сделать непосредственно в момент загрузки или предварительно.

"C:\Program Files\Microsoft SDKs\Windows Azure\.NET SDK\2012-06\bin\csupload.exe" Set-Connection "SubscriptionID=1145d36f-60d2-4db3-91e7-7cd730599e27;CertificateThumbprint=8BC0B6D0C1A010CABECF558612A21D2CCDFD679F;ServiceManagementEndpoint=https://management.core.windows.net"

Скрипт 2

Параметр ServiceManagementEndpoint является константой. Основными параметрами при формировании строки соединения выступают SubscriptionID и CertificateThumbprint. Их можно скопировать в свойствах сертификата на Рис.15. Ширины колонок раздвигаются и, при необходимости, скроллируются по горизонтали. В непосредственно загрузке диска тоже все понятно: откуда берем vhd-файл (LiteralPath), куда кладем (Storage Account\контейнер блобовского сториджа - Destination) и как обзываем (Label). Параметр Add-Disk указывает, что загружается именно диск, а не, скажем, образ. В параметре OS - что это будет диск для виртуальной машины Windows, а не Linux. По умолчанию, предполагается, естественно, Windows. Подробно ознакомиться с параметрами утилиты csupload можно в документации.

"C:\Program Files\Microsoft SDKs\Windows Azure\.NET SDK\2012-06\bin\csupload.exe" Add-Disk -Destination "https://tststorage.blob.core.windows.net/myvhds/aaa_disk" -Label aaa_disk -LiteralPath "c:\temp\aaa.vhd" -OS Windows

Скрипт 3

Скрипт без проблем отрабатывает, и, если бы еще шевелилась сетка с утра, все было бы вообще замечательно.

image017

Рис.17

После загрузки свежеположенный диск можно видеть в Azure Management Portal -> Virtual Machines -> Disks:

image018

Рис.18

Остается присоединить его к облачной виртуалке. Виртуалку при этом можно не гасить. В верхней строке переключаемся на Virtual Machine Instances, в нижней жмем Attach:

image019

Рис.19

и выбираем диск среди доступных загруженных и неподключенных. У меня такой сейчас всего один:

image020

Рис.20

Ждем, когда статус виртуалки сменяется с Running (Updating) на просто Running и соединяемся с ней по удаленному RDP-подключению (см. Connect в нижней строке на Рис.19). Видим диск F: с Volume Label = aaa, как заказывали на Рис.7, а на нем резервную копию базы AdventureWorks2012.bak:

image021

Рис.21

с которой восстанавливаемся:

image022

Рис.22

после чего диск aaa нам больше не нужен. Отсоединяем его аналогично подключению (кнопка Detach Disk в нижней строке на Рис.19) и удаляем из дисков вместе с соответствующим ему vhd-файлом (не из Storage), нажав кнопку Delete Disk -> Delete the associated VHD (Рис.18), чтобы не платить за лишнее место.

Алексей Шуленин