SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

sqlpackage と AzCopy を使用した SQL Database のデータ退避

leave a comment

SQL Server ではデータ層アプリケーションファイルとして、テーブルのスキーマとデータをまとめた BACPAC ファイルを作成することができます。これを使用することで SQL Database (旧 SQL Azure) に新しいデータベースとしてエクスポートした BACPAC をインポートすることができます。 これは、オンプレミスの SQL Server でも利用することができます。 
BACPAC ファイルのインポートによる新しいユーザー データベースの作成

この BACPAC の作成と Azure ストレージへのコピーをコマンドで実施する方法についてまとめてみたいと思います。
BACPAC はテーブルのスキーマとデータのバックアップですのでストアドプロシージャ等は含まれません。
これらを取得したいときには、スクリプトの生成と組み合わせる必要があります。
よく見たらストアド含まれていました…。
SQL Server オブジェクトとバージョンの DAC サポート

GUI で実施する場合には、SQL Database の対象のデータベースを右クリックして、「タスク」の「データ総アプリケーションのエクスポート」から、BACPAC の作成をすることができます。
image

この際、保存先としてはローカルディスクか Azure ストレージかを選択することができます。
# 実際にはローカルに保存した後に Azure ストレージにアップロードしているのだと思いますが。
image

BACPAC のファイルをコマンドで作成する場合には、sqlpackage というツールを使用することができます。
このツールですが DAC Framework (データ層アプリケーションフレームワーク) をインストールすることで使用することができます。

このフレームワークは SQL Server の Feature Pack として提供がされており、SQL Server 2012 SP1 の Feature Pack については以下からダウンロードすることが可能です。
Microsoft® SQL Server® 2012 SP1 用 Feature Pack

ここから Microsoft® SQL Server® 2012 SP1 Data-Tier Application Framework (DACFramework.msi) のコンポーネントを入手することで、sqlpackage を使用することができます。

DAC Framework を使用するためには

  • Microsoft SQL Server System CLR Types (SQLSysClrTypes.msi)
  • Microsoft SQL Server Transact-SQL ScriptDom (SqlDom.msi)

が必要になりますのでこれらも合わせて Feature Pack からインストールしておきます。
# これらがインストールされていないと実行時にエラーになります。

ただし、DAC Framework に関しては累積修正プログラム (CU : Cumulative Update) でも提供されますので、最新版に関しては最新の CU のものを入手したほうがよいかと思います。

SP1 の最新の CU に関しては SQL Server 2012 Service Pack 1 のリリース後にリリースされた、SQL Server 2012 のビルド から入手することが可能です。

DAC Framework をインストールすると [C:Program Files (x86)Microsoft SQL Server110DACbin] に sqlpackage がインストールされますので、これを使用して SQL Database のバックアップを取得します。

sqlpackage はローカルにしか取得できないようですので、SQL Database のデータバックアップの BACPAC を一度ローカルドライブに保存します。

コマンドラインの例としては以下のような形式になります。

cd C:Program Files (x86)Microsoft SQL Server110DACbin
sqlpackage.exe /a:Export /ssn:"<サーバー名>.database.windows.net" /sdn:"<データベース名>" /su:"<ログイン名>" /sp:"<パスワード>" /tf:"<出力先ファイルパス>"

正常に実行されると指定したディレクトリに BACPAC が取得されます。
BACPAC は ZIP 圧縮なので、拡張子を zip に変更することで中身を見ることができます。

各テーブル単位にフォルダ分けされてデータが格納されていることが確認できます。
image

BACPAC 内のデータですが SQL Server 2012 SP1 より前のバージョンでは、JSON 形式でデータが格納されていたのですが、SQL Server 2012 SP1 の DAC Framework では Native BCP 形式が使用されるようになったようです。
http://msdn.microsoft.com/ja-jp/library/jj200106(v=sql.15).aspx#DACFx

これで SQL Database のデータを BACPAC として取得できましたので、次に Azure ストレージにアップロードします。
Azure ストレージのアップロードには AzCopy を利用するとよさそうです。
AzCopy – Using Cross Account Copy Blob

AzCopy をダウンロードして適当なディレクトリに展開します。
展開したライカのようなコマンドを使用することで Azure ストレージに取得した BACPAC をアップロードすることができます。

azcopy c:temp https://<ストレージアカウント>.blob.core.windows.net/sqldatabase /destkey:<ストレージのアクセスキー>

image

投稿を書いている時点では、SQL Database にはデータベース全体のバックアップ機能がないため、データの完全なコピーを取得するためには CREATE DATABASE の COPY を使用する必要がありますが、この場合は新規にデータベースが作成されますので、それ以外の方法で退避をしたいときには DAC Framework を使ってみてもよいのかもしれないですね。
BACPAC からすぐに戻す場合はデータベースの新規作成になりますので、そのまま既存のテーブルを残したままインポートするためには BACPAK からデータのみを解凍してそれをインポートするための方法を持っていないといけないですが。

Share

Written by Masayuki.Ozawa

4月 10th, 2013 at 1:05 pm

Leave a Reply