Windows Azure SQL VMへのデータベースの移行。 BLOBストレージ+ REST

SQL ServerがインストールされたクラウドでSQL Serverを作成し、ローカルSQL Serverと同様にクライアント側から接続できるようになったので、データを入力するために残ります。 ハイブリッドシナリオで、データベースの一部がAzure SQL VMに移行される予定であるとします。 この記事では、バックアップコピー、デタッチ、 データ層アプリケーションなどを作成してデータベースをファイル(または複数のファイル)として分離し、ファイルをAzure SQL VMに配信し、復元してデータベースに戻すシナリオを検討します。 データ層アプリケーションのバックアップ、アタッチ、 デプロイ/インポートなど。 最初と最後のアクションは、DBAに質問を提起しません。 データベース(.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 Storageにバックアップファイルをblobとして転送し、そこからクラウド仮想マシンの内部にダウンロードします。 仮想マシンの作成時に、1つのストレージアカウントが既に自動的に作成されています。このアカウントには、vhdsという名前のコンテナーが自動的に存在し、仮想マシンの仮想ディスクはblobの形式で格納されます。 実験を純粋にするために、オーバーヘッドを削減するために、クラウド仮想マシンと同じデータセンターにtststorageと呼ばれる新しいストレージアカウントを作成します。

Azure Storage内では、データをBLOBまたはテーブルとして保存できます-Windows Azureドキュメントの「Azure Data Management and Business Analytics」を参照してください。 テーブルは厳密にリレーショナルな意味のテーブルではありません。 これらは、かつてSQL Data Servicesと呼ばれていたものに似た、キーと値のペアの緩やかに構造化されたセットです。 SDSと比較して、現在のテーブルはキーでパーティション化できます。 クラウド内の異なるマシンに異なるパーティションが保存されるため、SQL Azure Databaseの場合のシャーディングと同様に、水平スケーリングが実現します。 ブロブはブロックとページです。 ブロック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として保存されます。 BLOBは、ストレージアカウントの一部として作成されたコンテナー内に格納されます。 AdventureWorks2012.bakのストレージ用に、tststorageアカウントにcontainer1コンテナーを作成します。

パブリックコンテナを使用すると、誰でもその中に含まれるBLOBを見ることができます。 パブリックBLOBを使用すると、誰でもBLOBにアクセスできますが、コンテナのコンテンツは使用できません。 最後に、プライベートコンテナとは、BLOBにアクセスするには、ストレージアカウントキーを指定する必要があることを意味します。 その後、[コンテナの編集]ボタンを使用して、コンテナへのアクセスレベルを変更できます。

スクリプト1で作成されたデータベースのバックアップは、簡単にするためにブロックBLOBとしてAzure Storageにアップロードされます。 クラウド内のブロブ(およびテーブルとキュー)の操作には、RESTを使用できます。これにより、インターネット(HTTP要求/応答)を介して直接作業できるようになり、さまざまな開発ツールが利用できます。 BLOBを操作するためのREST APIについては、 msdn.microsoft.com / en - us / library / dd135733.aspxで説明しています。 そのため、パブリックコンテナーにあるブロブを確認できます。tststorage.blob.core.windows.net / container1?restype = container&comp = list

コンテナcontainer1は空になりました。 AdventureWorks2012.bakをロードするには、PUTメソッドを使用する必要があります。



システムを使用して;

System.Netを使用。

System.IOを使用します。

System.Security.Cryptographyを使用します。

using System.Text;

System.Globalizationを使用します。



クラスプログラム

{

static void Main(string [] args)

{

string fileFullName = @ "c:\ Temp \ AdventureWorks2012.bak"; //@Filec:\Temp\aaa.txt ";



文字列storageAccount = "tststorage";

文字列containerName = "container1";

文字列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);

byte [] fileContent =新しいバイト[fs.Length];

fs.Read(fileContent、0、fileContent.Length);

fs.Close();



req.Method = "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");

string canonicalizedString = BuildCanonicalizedString(req、String.Format( "/ {0} / {1} / {2}"、storageAccount、containerName、Path.GetFileName(fileFullName)));

req.Headers ["Authorization"] = CreateAuthorizationHeader(canonicalizedString、storageAccount、accessKey);

req.Timeout = 100 * 60 * 1000;

ストリームs = req.GetRequestStream();

s.Write(fileContent、0、fileContent.Length);



DateTime dt = DateTime.Now;

req.GetResponse();

System.Diagnostics.Debug.WriteLine(DateTime.Now-dt);



}



静的文字列CreateAuthorizationHeader(文字列canonicalizedString、文字列storageAccount、文字列accessKey)

{

HMACSHA256 hmacSha256 = new HMACSHA256(Convert.FromBase64String(accessKey));

バイト[] dataToHMAC = Encoding.UTF8.GetBytes(canonicalizedString);

文字列署名= Convert.ToBase64String(hmacSha256.ComputeHash(dataToHMAC));

return "SharedKey" + storageAccount + ":" +署名;

}



静的文字列BuildCanonicalizedString(HttpWebRequest req、文字列canonicalizedResource)

{

StringBuilder sb = new 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);

return sb.ToString();

}

}

スクリプト2



このコードでは、おそらく1点を除いて、すべてがかなり明白です。 container1はパブリックコンテナとして作成されたという事実にもかかわらず、blobの記録には承認が必要です。 設定されたアクセスレベルに応じて、Blobおよびコンテナに対して誰がどのような操作を実行できるかについては、 msdn.microsoft.com / en - us / library / dd179354.aspxで説明しています。 アクセスレベルに関係なく、所有者には書き込み権限があります。 HTTPリクエストで所有者として承認するには、Authorizationヘッダーを設定する必要があります。 認証スキームの要件に従ってこのヘッダーに書き込まれる文字列には、署名が含まれます。これは、UTF-8エンコーディングの正規化された文字列のハッシュベースのメッセージ認証コード(HMAC)です。ハッシュは、アクセスキーに基づいてSHA256アルゴリズムを使用して計算されます。 正規化された文字列は、RESTアクセスメソッド、アップロードされたファイルのサイズ、blobタイプ(x-ms-blob-type =ブロックまたはページ)のUTC形式(x-ms-date)のHTTPリクエストの日付/時刻、Azure blobサービスのバージョン日付、このHTTPリクエスト(x-ms-version)などに対応します。高度なプログラミングアートに磨きをかける必要はありません。苦労と注意だけが必要です。 正規化された文字列の形成におけるわずかな不正確さは、容赦なくHTTP 403 Forbiddenエラーにつながります。

アクセスキー(プライマリおよびセカンダリ)は、ストレージアカウントの作成段階で形成され、コンテナープロパティ(キーの管理)で表示できます。 これらはいずれも、認証中にデジタル署名を作成するためのaccessKeyとして設定できます-HMACSHA256 hmacSha256 = new HMACSHA256(Convert.FromBase64String(accessKey));

より詳細な権利管理のために、共有アクセス署名を使用できます。 共有署名を使用すると、割り当てられた期間内に特定のコンテナ内に記録するなど、特定の操作を実行できるポリシーを作成できます。 署名を受け取った人は、このポリシーの枠組み内で行動することができます。 たとえば、別の署名は、別の期間、別のコンテナからの読み取りを許可する場合があります。

その他のコメント。

•その名前のブロブがコンテナに存在する場合、静かにほつれます。

•コンテナ名では大文字と小文字が区別されます。

•ロード時間は、明らかにグリッドの速度に依存します。 たとえば、仕事から、この45メガピクセルのバックアップには、00:01:07のwhiが殺到しました。 家からそれは時々遅いことが判明した。

このデモでは、バックアップのサイズは非常に「幼稚」です。 ブロックBLOBは200 GBに制限されています。 サイズが64 MB未満のブロックBLOBは、スクリプト2の例で見たように、1回の書き込み操作で読み込むことができます。 大きなファイルをAzure Storageにアップロードするときは、ページBLOBを使用します。 ページblobは512バイトのページで構成され、その最大サイズは1 TBです。 ページBLOBページ範囲の書き込み/読み取りの例は次のとおりです。 and-download-page-blobs.aspx



All Articles