Миграция Бд На Виртуальную Машину Windows Azure Sql. Хранилище Blob-Объектов + Отдых

Теперь, когда мы создали его в Облаке с установленным на нем SQL-сервером и имеем возможность подключаться к нему со стороны клиента, как к локальному SQL-серверу, остается только заполнить его данными.

Предположим, что в рамках гибридного сценария часть базы данных планируется перенести на виртуальную машину Azure SQL. В этой статье будет рассмотрен сценарий, когда база данных разделяется на файл (или несколько файлов) путем создания ее резервной копии, отсоединения, приложение уровня данных и т. д., файл доставляется на виртуальную машину Azure SQL и возвращается обратно в базу данных путем восстановления из резервной копии, присоединения, развертывание/импорт приложения уровня данных и т. д. Первое и последнее действия не вызывают у администратора базы данных никаких вопросов.

Осталось понять, как лучше доставить отчужденный файл с базой данных (.

bak, .

mdf, .

bacpac,.

) на облачную виртуальную машину с SQL Server. Например, перенесем нашу любимую базу данных AdventureWorks в качестве резервной копии:

backup database AdventureWorks2012 to disk = 'c:\Temp\AdventureWorks2012.bak' with init, compression, stats = 10

Скрипт 1 Небольшие файлы, подобные этому, можно без лишних слов перенести с помощью обычного копирования/вставки на удаленный рабочий стол виртуальной машины SQL Server. Также приходит в голову создать общую папку на виртуальной машине и скопировать ее туда, используя расширенные средства копирования с возможностью распараллеливания, исправления и возобновления в случае сбоев, а также передать файл по FTP. Эти методы очевидны.

В этом посте мы воспользуемся другим методом: перенесем файл резервной копии с локальной машины в хранилище Azure в виде BLOB-объекта и загрузим его оттуда в облачную виртуальную машину.

У нас уже есть одна учетная запись хранения, созданная автоматически при создание виртуальной машины , в котором автоматически возник контейнер с именем vhds, в котором хранится виртуальный диск нашей виртуальной машины в виде blob. Для чистоты эксперимента мы создадим новую учетную запись хранения под названием tststorage в том же центре обработки данных, что и облачная виртуальная машина, чтобы сократить накладные расходы.

Внутри службы хранилища Azure данные могут храниться в виде больших двоичных объектов или таблиц — см.

раздел Управление данными Azure и бизнес-аналитика в документации Windows Azure. Таблицы не являются таблицами в строгом реляционном смысле.

Это просто слабо структурированные наборы пар ключ-значение, похожие на то, что когда-то называлось службами данных SQL — см.

Введение в SQL Azure .

По сравнению с SDS, текущие таблицы можно секционировать по ключу.

Различные разделы хранятся на разных машинах в облаке, что обеспечивает горизонтальное масштабирование, как и в случае шардинг в случае базы данных SQL Azure. Существуют блочные и страничные BLOB-объекты.

Структура блочных BLOB-объектов оптимизирована для подчиненного доступа, а страничные BLOB-объекты оптимизированы для произвольного чтения и записи.

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

Разница между ними подробно объяснена, например, здесь — blogs.msdn.com/b/windowsazurestorage/archive/2010/04/11/using-windows-azure-page-blobs-and-how-to-efficiently-upload-and-download-page-blobs.aspx .

Виртуальные диски хранятся в виде страничных BLOB-объектов.

Большие двоичные объекты хранятся внутри контейнеров, созданных в учетной записи хранения.

Давайте создадим контейнер контейнер1 в учетной записи tssttorage для хранения AdventureWorks2012.bak. Публичный контейнер позволяет любому видеть содержащиеся в нем большие двоичные объекты.

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

Наконец, частный контейнер означает, что вам нужно будет указать ключ учетной записи хранения для доступа к большому двоичному объекту.

Впоследствии вы можете изменить уровень доступа к контейнеру с помощью кнопки «Редактировать контейнер».

Для простоты мы загрузим резервную копию базы данных, созданную в сценарии 1, в хранилище Azure в виде блочного BLOB-объекта.

Для операций с блобами в облаке (а также с таблицами и очередями) можно использовать REST, который позволяет работать напрямую через Интернет (HTTP-запрос/ответ), используя широкий набор инструментов разработки.

REST API для работы с блобами описан здесь — msdn.microsoft.com/en-us/library/dd135733.aspx .

Вот как вы можете увидеть, какие BLOB-объекты находятся в общедоступном контейнере: tststorage.blob.core.windows.net/container1Эrestype=container&comp=list Контейнер контейнер1 в настоящее время пуст. Чтобы загрузить в него AdventureWorks2012.bak, нужно использовать метод PUT: использование системы; использование System.Net; использование System.IO; использование System.Security.Cryptography; использование System.Text; использование System.Globalization; классная программа { static void Main(string[] args) { строка fileFullName = @"c:\Temp\AdventureWorks2012.bak"; //@"c:\Temp\aaa.txt"; строка StorageAccount = "tststorage"; строка имя_контейнера = «контейнер1»; string accessKey = "xws7rilyLjqdw8t75EHZbsIjbtwYDvpZw790lda0L1PgzEqKHxGNIDdCdQlPEvW5LdGWK/qOZFTs5xE4P93A5A=="; HttpWebRequest req = (HttpWebRequest)WebRequest.Create(String.Format(" https://{0}.

blob.core.windows.net/{1}/{2 }", StorageAccount,ContainerName, Path.GetFileName(fileFullName))); FileStream fs = File.OpenRead(fileFullName); байт [] fileContent = новый байт [fs.Length]; fs.Read(fileContent, 0, fileContent.Length); фс.

Закрыть(); req.Метод = "PUT"; req.ContentLength = fileContent.Length; req.Headers.Add("x-ms-blob-type", "BlockBlob"); req.Headers.Add("x-ms-date", DateTime.UtcNow.ToString("R", CultureInfo.InvariantCulture)); req.Headers.Add("x-ms-version", "2011-08-18"); строка canonicalizedString = BuildCanonicalizedString(req, String.Format("/{0}/{1}/{2}", StorageAccount,ContainerName, Path.GetFileName(fileFullName))); req.Headers["Авторизация"] = CreateAuthorizationHeader(canonicalizedString, StorageAccount, AccessKey); req.Timeout = 100*60*1000; Поток s = req.GetRequestStream(); s.Write(fileContent, 0, fileContent.Length); ДатаВремя dt = ДатаВремя.

Сейчас; req.GetResponse(); System.Diagnostics.Debug.WriteLine(DateTime.Now - dt); } статическая строка CreateAuthorizationHeader (строка canonicalizedString, строка StorageAccount, строка AccessKey) { HMACSHA256 hmacSha256 = новый HMACSHA256(Convert.FromBase64String(accessKey)); byte[] dataToHMAC = Encoding.UTF8.GetBytes(canonicalizedString); строковая подпись = Convert.ToBase64String(hmacSha256.ComputeHash(dataToHMAC)); вернуть «SharedKey» + StorageAccount + «:» + подпись; } статическая строка BuildCanonicalizedString (HttpWebRequest req, строка canonicalizedResource) { StringBuilder sb = новый StringBuilder(); sb.Append(req.Method + "\n\n\n"); sb.Append(String.Format("{0}\n\n\n\n\n\n\n\n\n", req.ContentLength)); sb.Append("x-ms-blob-type:" + req.Headers["x-ms-blob-type"] + '\n'); sb.Append("x-ms-date:" + req.Headers["x-ms-date"] + '\n'); sb.Append("x-ms-version:" + req.Headers["x-ms-version"] + '\n'); sb.Append(canonicalizedResource); вернуть sb.ToString(); } } Скрипт 2 Все в этом коде вполне очевидно, за исключением, пожалуй, одного момента.

Несмотря на то, что контейнер 1 был создан как общедоступный контейнер, для записи большого двоичного объекта требуется авторизация.

Кто и какие операции может выполнять над блобами и контейнерами в зависимости от установленного уровня доступа, описано здесь — msdn.microsoft.com/en-us/library/dd179354.aspx .

Независимо от уровня доступа владелец имеет право на запись.

Чтобы авторизоваться в качестве владельца в HTTP-запросе, вам необходимо установить заголовок авторизации.

Строка, записываемая в этот заголовок, в соответствии с требованиями схем аутентификации содержит подпись, представляющую собой HMAC канонизированной строки в кодировке UTF-8, где хэш рассчитывается с использованием алгоритма SHA256. алгоритм, основанный на ключе доступа.

Канонизированная строка представляет собой сумму метода доступа REST, размера загруженного файла, типа большого двоичного объекта (x-ms-blob-type = блок или страница), даты/времени HTTP-запроса в формате UTC (x- ms-date), дату версии BLOB-сервиса Azure, обслуживающего этот HTTP-запрос (x-ms-версия) и т. д. Здесь не нужно блистать высоким навыком программирования, нужна лишь кропотливость и внимательность, ведь малейшая неосторожность при формировании канонизированной строки неумолимо приводит к ошибке HTTP 403 Forbidden. Ключи доступа (основной и резервный) генерируются на этапе создания Учетной записи хранения; их можно просмотреть в свойствах контейнера (Управление ключами).

Любой из них можно установить в качестве accessKey для создания цифровой подписи при авторизации - HMACSHA256 hmacSha256 = new HMACSHA256(Convert.FromBase64String(accessKey)); Для более детального управления правами вы можете использовать подпись общего доступа.

Подпись общего доступа позволяет вам создать политику, позволяющую выполнять определенную операцию, например запись в определенном контейнере, в течение определенного периода времени.

Лицо, получившее подпись, сможет действовать в рамках настоящей политики.

Например, другая подпись может разрешить чтение из другого контейнера в течение другого периода.

Другие комментарии.

• Если в контейнере существует объект с таким же именем, он автоматически удаляется.

• Имя контейнера чувствительно к регистру.

• Время загрузки, очевидно, зависит от скорости сетки.

Например, с работы этот 45-мега бэкап залили со свистом в 00:01:07. Из дома это было намного медленнее.

В этом демонстрационном примере размер резервной копии был довольно небольшим.

Размер блочных двоичных объектов ограничен 200 ГБ.

Блочный объект размером менее 64 МБ можно загрузить с помощью одной операции записи, как мы наблюдали в примере сценария 2. В противном случае его следует разбить на фрагменты и загружать блок за блоком, используя методы Put Block/Put Block List. При отправке больших файлов в хранилище Azure следует использовать страничные BLOB-объекты.

Страничный большой объект состоит из страниц по 512 байт и имеет максимальный размер 1 ТБ.

Здесь приведен пример записи/чтения диапазона страниц страничного BLOB-объекта: blogs.msdn.com/b/windowsazurestorage/archive/2010/04/11/using-windows-azure-page-blobs-and-how-to-efficiently-upload-and-download-page-blobs.aspx .

Теги: #Microsoft SQL Server #sql-сервер #windows Azure Storage

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.