Azure TIPS

Azure TIPS

クライアントPCから「Azure SQLデータベースをBlobストレージにバックアップ」するには?[C#]

2013年5月17日

Azure SQLデータベースを.bacpacファイルとしてBlobストレージにエクスポートするコンソール・アプリの作り方を紹介。そのアプリをタスク・スケジューラーに登録すれば、定期バックアップも実現できる。

デジタルアドバンテージ 一色 政彦
  • このエントリーをはてなブックマークに追加

 Microsoft AzureのSQLデータベース(以降、SQLデータベース)は、「SQL Azureバックアップ入門 - @IT」で説明されているように障害対策が十分になされており、ほとんどのケースではバックアップを取る必要はない。しかし、「毎日の状態をスナップショット的にバックアップしたい」という要望も中にはあるのではないだろうか。

 そのような要望に応えたい場合には、Microsoft Azure管理ポータル上で提供されている「データベースのインポート/エクスポート機能」が手軽である。この機能を使うと、SQLデータベースのスキーマ定義とテーブル・データを格納した.bacpacファイル(=論理バックアップ・ファイル)を、Microsoft Azure BLOB ストレージ上に出力できる(また、出力された.bacpacファイルをSQLデータベースにインポートすることもできる。詳しくは、MSDNのページを参照されたい)。

 ただし、この「データベースのインポート/エクスポート機能」は、“日次”バックアップを取りたいという場合には使いづらい(そういう使い方を想定した機能ではないため)。日次バックアップを取るには、何らかの方法でバックアップ処理を定期実行する必要があるし、容量の大きなデータベースであれば「(完全バックアップではなく)差分バックアップにしたい」というケースもあるだろう。このようなニーズを満たすには、例えば(筆者の案としては)「SQL Azure Data Syncでローカル環境のSQL Serverと同期し、ローカル環境側で従来どおりのバックアップ処理を実施する」などの方法が考えられるだろう。しかしこの方法を採用するのは非常に手間である。

 「データベースのインポート/エクスポート機能」のように、手軽に日次バックアップを取る方法はないのだろうか?

 実は、バックアップ(厳密には前述の「データベースのインポート/エクスポート」)を実行するためのサービス(API)がマイクロソフトにより公開されており、これを呼び出すコンソール・アプリを作成して、ローカル・クライアントPC環境上のタスク・スケジューラーなどを使ってそのアプリを定期実行すれば、日次バックアップが実現できる。これなら非常に短時間かつ手軽に日次バックアップ環境を構築できるので、特に作業時間を短縮したい場合にはお勧めである。なお、.bacpacファイルは完全バックアップになるため、データベース・サイズが巨大な場合にはあまり向いていないと考えられるので、注意してほしい。

【注意】より厳密なバックアップについて(※追記: 2013年6月12日)

本稿で説明する.bacpacファイルは、トランザクション一貫性を保証しないという制約がある。そのため、実運用などで厳密性を求めるのであれば(つまり本来なら)、データベース・コピー(T-SQLによるcopy databse)を行ったうえで、そのコピー・データベースに対して下記のエクスポート(bacpac)処理を実施するべきである。今回のサンプルは、あくまで最も簡易な手法を紹介しているだけなので、実運用では状況に合わせて適切なバックアップ手法を検討してほしい。

 以降では、このコンソール・アプリを最速で作成する方法を紹介する。なお、コードはC#言語で記述する。

SQLデータベースをBlobストレージにエクスポートするコンソール・アプリ

 まず、コンソール・アプリを新規作成する必要があるが、サンプル・プロジェクトが提供されているので、これをダウンロードして、必要なコード箇所だけを書き換えることにしよう。実際にダウンロードするには、下記のリンク先のサイトを開き、説明のすぐ下にある[ダウンロード]欄の[C# (404.8 KB)](※執筆時点の表記)ボタンをクリックすればよい。

 ダウンロードした.zipファイルを展開し、その中にある「C#」フォルダ内の「WASDImportExport.sln」ファイルを実行する。これによりVisual Studioが起動して、コンソール・アプリのプロジェクトが開かれる。

 次に、プロジェクト内のProgram.csファイルをコード・エディタで開く。そのコードは、次のようになっており(一部改変)、非常に短いコードであることが分かる。なお、次のコードでは、本稿では説明を割愛する「インポート機能」のコード(=13行分)を削っている(実際のファイルには「インポート機能」の実装例も含まれているので、インポート機能も使いたい場合には、ダウンロードしたソース・コードの方を参照してほしい)。

C#
using System;
 
namespace WASDImportExport
{
  class Program
  {
    static void Main(string[] args)
    {
 
      /* 注意 - 以下は、Azure インポート/エクスポート・サービス用の正式なサービス・エンドポイントのリストです。
       *  リクエストが成功するためには、SQLデータベース・サーバと同じ場所のデータセンターのエンドポイントを使用する必要があります。
       */
      //"Japan East" endpoint="https://kw1-1prod-dacsvc.azure.com/DACWebService.svc"
      //"Japan West" endpoint="https://os1-1prod-dacsvc.azure.com/DACWebService.svc"
      //"Brazil" endpoint="https://cq1-1prod-dacsvc.azure.com/DACWebService.svc"
      //"North Central US" endpoint="https://ch1prod-dacsvc.azure.com/DACWebService.svc"
      //"South Central US" endpoint="https://sn1prod-dacsvc.azure.com/DACWebService.svc"
      //"North Europe" endpoint="https://db3prod-dacsvc.azure.com/DACWebService.svc"
      //"West Europe" endpoint="https://am1prod-dacsvc.azure.com/DACWebService.svc"
      //"East Asia" endpoint="https://hkgprod-dacsvc.azure.com/DACWebService.svc"
      //"Southeast Asia" endpoint="https://sg1prod-dacsvc.azure.com/DACWebService.svc"
      //"East US" endpoint="https://bl2prod-dacsvc.azure.com/DACWebService.svc"
      //"West US" endpoint="https://by1prod-dacsvc.azure.com/DACWebService.svc"
 
      ImportExportHelper IEHelper = new ImportExportHelper();
 
      // ヘルパー・クラス内のRESTリクエストに入力値をセット
      IEHelper.EndPointUri = @"https://ch1prod-dacsvc.azure.com/DACWebService.svc";
      IEHelper.ServerName = "[servername].database.windows.net";
      IEHelper.StorageKey = "";
      IEHelper.DatabaseName = "";
      IEHelper.UserName = "";
      IEHelper.Password = "";
 
      // エクスポート処理をを実行
      string exportBlobPath = IEHelper.DoExport(String.Format(@"https://[storagename].blob.core.windows.net/bacpac/{0}.bacpac", IEHelper.DatabaseName));
 
      // 実行が失敗に終わっていれば、ユーザー向けに出力
      if (exportBlobPath == null)
      {
        Console.WriteLine("Export Operation Failed!");
        Console.ReadKey();
        return;
      }
 
      Console.ReadKey();
    }
 
  }
}
SQLデータベースをBlobストレージにエクスポートするコンソール・アプリのコード(Program.cs)

※2014/7/17追記 「Japan East」「Japan West」「Brazil」のエンドポイントを追加しました。

 上記のコード内の一部を、それぞれの環境に合わせて書き直す必要がある。その書き換え箇所を、以下で簡単に説明する。なお、ここで設定する情報は、基本的にはMicrosoft Azure管理ポータル上で取得可能だ(その取得方法の説明は割愛する)。

SQLデータベース関連の設定

C#
IEHelper.EndPointUri = @"https://ch1prod-dacsvc.azure.com/DACWebService.svc";

 指定可能なエンドポイントは、上記のコード内のコメントを参照してほしい。例えば「東アジア(East Asia)」であれば、「https://hkgprod-dacsvc.azure.com/DACWebService.svc」を指定すればよい。

C#
IEHelper.ServerName = "[servername].database.windows.net";
IEHelper.DatabaseName = "";
IEHelper.UserName = "";
IEHelper.Password = "";

 「[servername]」の部分に、データベース・サーバー名を指定する。さらにその下は、順に、データベース名、ユーザー名、パスワードを指定する。

BLOBストレージ関連の設定

C#
string exportBlobPath = IEHelper.DoExport(String.Format(@"https://[storagename].blob.core.windows.net/bacpac/{0}.bacpac", IEHelper.DatabaseName));

 「[storagename]」の部分に、ストレージ名を指定する。ここで、上記のURLの「/bacpac/」という部分に注目してほしい。これはつまり、実際のBLOBストレージ上に「bacpac」という名前の「privateコンテナー」を作成しておく必要があるということを意味する(もちろん「bacpac」以外の名前を付けてもよい。その場合、上記のURLも併せて変更する)。なお筆者の場合は、「Azure Storage Explorer」というツールを使ってprivateコンテナーを作成した。

C#
IEHelper.StorageKey = "";

 ストレージ・キーを設定する。

実行例

 以上の設定が終わったら、実際に実行してみよう。筆者が試したところ、次の画面のように正常に成功した(ちなみに、本稿では説明しなかったインポート処理も試してみたが正常に実行できた)。

SQLデータベースをBlobストレージにエクスポートするコンソール・アプリの実行結果の例(Azure Storage ExplorerによるBLOBストレージ内の表示)
SQLデータベースをBlobストレージにエクスポートするコンソール・アプリの実行結果の例(Azure Storage ExplorerによるBLOBストレージ内の表示)

 このように、BLOBストレージにバックアップするコンソール・アプリは、とても簡単に作成できる。そしてこのコンソール・アプリが良いのは、クライアントPC上でコマンドライン実行できるので、タスク・スケジューラーから呼び出すなど、ほかのツールと組み合わせやすいことだ。特に日次バックアップのようなニーズがある場合は、ぜひこの手法を検討してみるとよいだろう。

※以下では、本稿の前後を合わせて5回分(第1回~第5回)のみ表示しています。
 連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。

1. 【現在、表示中】≫ クライアントPCから「Azure SQLデータベースをBlobストレージにバックアップ」するには?[C#]

Azure SQLデータベースを.bacpacファイルとしてBlobストレージにエクスポートするコンソール・アプリの作り方を紹介。そのアプリをタスク・スケジューラーに登録すれば、定期バックアップも実現できる。

2. Azure Webサイトのデプロイ・ロジックをカスタマイズするには?

Azure Webサイトでは、さまざまなWebアプリをGitでデプロイできるだけでなく、そのデプロイ・ロジックを自由にカスタマイズすることもできる。そのカスタマイズ方法を解説する。

3. Azure WebサイトのSite Extensions「DaaS」で各種ログを手軽に収集・解析するには?

“Diagnostic as a Service”(DaaS)を利用して、エラーログ、メモリダンプ、HTTPログを一括で収集し、解析を行う方法を説明する。

4. Azure Webサイトにカスタムドメインを設定するには?

Microsoft Azure Web Sitesで独自ドメイン名を適用する方法を説明する。CNAMEレコードだけでなく、wwwなしのネイキッドドメインが実現可能なAレコード(IPアドレス)も指定できる。

5. Azure Webサイトをバックアップするには?

Azure Webサイトでは、Webサイトとデータベースをバックアップ/復元するための機能が提供されている。その機能の基本的な使い方を解説する。

GrapeCity Garage 記事内容の紹介

Azure Central の記事内容の紹介

Twitterでつぶやこう!


Build Insider賛同企業・団体

Build Insiderは、以下の企業・団体の支援を受けて活動しています(募集概要)。

ゴールドレベル

  • 日本マイクロソフト株式会社
  • グレープシティ株式会社