SQL Azure Migration Wizard で SQL Azure へのデータ移行(SQLAzureMW)

SQL Server 2008 R2 の場合は、標準機能のスクリプト生成ウィザード(オブジェクト エクスプローラーでデータベースを右クリックして「タスク」の「スクリプト生成」から実行)を利用すれば、SQL Server 上のデータベースを丸ごと SQL Azure へ簡単に移行することができます。
SQL Server 2008 を利用している場合は、オブジェクト エクスプローラーが SQL Azure に対応していないので、スクリプト生成ウィザードが実行できません。SQL Server 2008 の場合は codeplex サイトで提供されている「SQL Azure Migration Wizard」(SQLAzureMW)を利用するのが便利です。

SQL Azure Migration Wizard のダウンロードはこちらから
http://sqlazuremw.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=32334


最新版は、v3.1.3 ですが、このツール(SQLAzureMW)の v3.0 以上は、SQL Server 2008 R2 の SMO が必須となっているため、SQL Server 2008 のみがインストールされた環境では接続先に SQL Server 2008 を選択した場合にエラーとなってしまいます。そもそも SQL Server 2008 R2 の SMO をインストールするくらいなら、SQL Server 2008 R2 のスクリプト生成ウィザードを利用したほうが簡単にデータ移行ができるので、わざわざ SQLAzureMW を使う必要はありません(SQLAzureMW だとデータベース ユーザーとオブジェクト権限を移行できないという制約もあるので)。


で、SQL Server 2008 R2 の SMO をインストールしなくても利用できるようにするには... 古いバージョンのソース(現在は SQLAzureMW v2.1 Source がダウンロード可能)をダウンロードして、Visual Studio 2008 で開いて実行します。

これで、SQL Server 上のデータベースのメタデータSQL Azure 上へ移行することはできるのですが、日本語環境だと bcp に関しては、エクスポートができても(temp フォルダへ出力される)、SQL Azure 上へインポートできないということが発生します。

これは、以下の URL の「お だ のスペース」さんのところで紹介されているのと同じ症状です。


SQL Azure Migration Wizard v1.9.1 で日本語環境だとデータのインポートが出来ない!!ので、細工が必要です。
http://d.hatena.ne.jp/odashinsuke/20091130/1259585581


v2.1 では、各種の設定が App.config ファイルで変更できるようになっているので、ソリューション エクスプローラーから App.config ファイルを開いて、add key="BCPRowsCopied" のセクション(以下)を探します。

<add key="BCPRowsCopied" value="[0-9]+\srows copied"/>

英語環境では、bcp コマンドの結果が次のように表示されるので、

Starting copy...
1000 rows successfully bulk-copied to host-file. Total received: 1000
1000 rows successfully bulk-copied to host-file. Total received: 2000
2155 rows copied.    

2155 rows copied」という行があれば、bcp 成功と見なすために「[0-9]+\srows copied」と記述されています。
しかし、日本語環境では、bcp コマンドの結果は次のように表示されます。

コピーを開始しています...
1000 ホスト ファイルへの行の一括コピーが完了しました。受信合計: 1000
1000 ホスト ファイルへの行の一括コピーが完了しました。受信合計: 2000
2155 行コピーされました。

したがって、add key="BCPRowsCopied" のセクションを次のように変更する必要があります。

<add key="BCPRowsCopied" value="[0-9]+\s行コピーされました。"/>

これでデータの移行もできるようになります。ウィザードは、次のように利用します。

最初に「Aanalyze and Migrate」の「SQL Database」を選択します(without Analying を選択した場合は、Azure へ対応していないオブジェクトまでスクリプト生成してしまうので、Aanalyze を選択するようにします)。

次に、移行元の SQL Server へ接続します。

移行したいテーブルを選択します。

上記画面で Advenced ボタンをクリックすると、生成するスクリプトの詳細を設定できます。

スクリプト生成の概要ページが表示されて、Next をクリックすると、スクリプト生成しますか? と尋ねられるので「はい」をクリックします。

スクリプトの生成中は次の画面が表示されます。

SQL Script」タブを開くと、生成された SQL スクリプトを確認できます。

BCPArgs という緑の行が表示されていれば、SQL Azure 上へ bcp でデータを移動できます(SQL Azure 上で実行される bcp コマンドの引数情報が表示されていて、上記の add key="BCPRowsCopied" のセクションを修正していないと、この行が表示されません)。SQLAzureMW v2.1 は、クラスタ化インデックスが存在しないテーブルを発見すると、自動付加してくれるスクリプトも生成してくれているのでなかなか気が利いています。


次に、移行先の SQL Azure サーバーと接続ユーザー情報を入力して、「Test Connection」ボタンをクリックします。
データベースを選択して Next をクリックすると、実行しますか? と尋ねられるので「はい」をクリックすると、メタデータの移行&データの移行(bcp の実行。Uploading data と表示されている部分が bcp を実行しているフェーズ)が開始されます。

以上で、データの移行が完了です。
なお、SQLAzureMW v2.1 では、トリガーのスクリプト生成ができない、データベース ユーザーとオブジェクト権限のスクリプト生成ができないという制限もあります。これを回避するには、冒頭部で紹介した SQL Server 2008 R2 の標準のスクリプト生成ウィザードを利用するようにします。スクリプト生成ウィザードでは、トリガーもユーザーもオブジェクト権限もスクリプト生成してくれて、データ移行用の INSERT ステートメントも生成してくれます(クラスタ化インデックスの自動付加機能はありませんが..)。ですので、SQL Server 2008 R2 を利用できる場合は、SQLAzureMW よりもスクリプト生成ウィザードを利用するのがお勧めです。


SQL Server 2008 R2 のスクリプト生成ウィザードの利用方法はこちらから
http://d.hatena.ne.jp/matu_tak/20100120