[SQL Database] SQL Server - Windows Azure SQL Database (WASD) 間のデータ同期方法について

皆さん、こんにちは。 SQL Server/Windows Azure SQL Database サポートチームの高原です。

今回は、Windows Azure SQL Database (以下 WASD) に関するお問い合わせの中で、よくあるお問い合わせの一つを紹介します。

[質問]

オンプレミス上の SQL Server と WASD 間のデータの同期を実施したいが、同期する方法について知りたい。

[回答]

オンプレミス上の SQL Server と WASD 間のデータの同期(差分同期) を自動的に行える機能は、2014年2月 時点にてございません。

しかしながら、毎回 全データの同期となりますが、代替案として、以下のツールを使用することにより、データの同期を行うことができます。

A) SqlPackage.exe

メリット : リトライロジックが実装されているため、何らかの要因により Export/Import 処理が失敗したとしても、失敗した処理から再処理を行うことが可能となります。

B) SQL Azure へのデータベースの配置 (SQL Server Management Studio 以下 SSMS)

メリット : SSMS から 簡単に処理を実行することが可能となります。

C) BCP ユーティリティ

メリット : インポートの範囲を指定することが可能であるため、データ量(行数) の多いテーブルを WASD 上にインポートする場合、1回の処理で実行される処理量を制限させることが可能となります。

+補足+

Windows Azure 仮想マシン (IaaS) 上に SQL Server をインストールすることにより、既存の SQL Server と同じ機能(AlwaysOn 可用性グループ、データベース ミラーリング、ログ配布、バックアップ/リストア ) を使用し、ディザスタ リカバリ 環境を構築することが可能になります。

Windows Azure の仮想マシン内の SQL Server の高可用性と災害復旧
https://msdn.microsoft.com/ja-jp/library/jj870962.aspx

それでは A) から C) の各々の使用方法例 (今回は、オンプレミス環境からWASD環境への同期) を、簡単に紹介します。

A) SqlPackage.exe

[事前準備]

1)以下の URL から SSMS 2012 Express のセットアッププログラムをダウンロードし、オンプレミス上のクライアントにインストールします。

Microsoft SQL Server 2012 Service Pack 1 (SP1) Express
https://www.microsoft.com/ja-jp/download/details.aspx?id=35579
+ SQLManagementStudio_x64_JPN.exe
+ SQLManagementStudio_x86_JPN.exe

※ SqlPackage.exe は、SQL Server 2012 製品版はもちろん、SSMS 2012 Express にも含まれているツールとなります。

[実行手順]

1)コマンド プロンプトを起動します。

2)SqlPackage.exe が配置されているパスに移動します 。(x64 環境の場合、既定の配置パス : C:\Program Files (x86)\Microsoft SQL Server\110\DAC\bin\)

3)SqlPackage.exe で “Export” オプションを指定し、オンプレミス上のデータを同期したいデータベースのバックアップ (bacpac 形式) を採取します。

+ コマンド例

sqlpackage.exe /Action:Export /ssn:"<SQL Server インスタンス名>" /sdn:"<SQL Server データベース名>" /su:"<ログイン名>" /sp:"<パスワード>" /tf:"<出力ファイル名.bacpac>"

image

4) 同期を行う WASD 上のデータベースを削除します。

5)SqlPackage.exe で “Import” オプションを指定し、3) で作成したデータベースのバックアップ (bacpac 形式) を WASD 上にインポートします。

+ コマンド例

sqlpackage.exe /Action:Import /tsn:"<WASD サーバー名>" /tdn:"<WASD データベース名>" /tu:"<ユーザー名>" /tp:"<パスワード>" /sf:"<インポートファイル名.bacpac>"

image

+補足+

オンプレミス上の SQL Server のデータベースで、WASD と互換性のない機能 (例: 拡張プロパティなど) が使用されている場合は、エクスポート/インポート処理が失敗します。

オンプレミス上の SQL Server のデータベースで、WASD と互換性のない機能を無効にできない場合は、WASD 上にオブジェクトを作成したうえで、C) BCP ユーティリティ などの他のツールを使用することを検討ください。

なお、WASD からオンプレミス上の SQL Server への同期の場合は、互換性の問題は発生しません。

B) SQL Azure へのデータベースの配置

[事前準備]

1)SSMS 2012 (Express) を オンプレミス上のクライアントにインストール します。

[実行手順]

1)SQL Server 2012 Management Studio (Express) を起動します。

2)データベース - 同期対象のデータベース - 右クリック – タスク – SQL Azure へのデータベースの配置 を選択します。

3)WASD サーバーに接続し、”新しいデータベース名”、WASD の エディション/データベースサイズ、及び bacpac の一時保存先パスを指定後、”次へ” を選択します。

image

4)指定した内容が正しいことを確認後、”完了” ボタンを選択します。

image

C) BCP ユーティリティ

[事前準備]

1)WASD 上に、新規データベース 及び オンプレミス上の SQL Server のデータベースと同じオブジェクト (テーブルなど) を作成します。

2)SSMS 2012 (Express) を オンプレミス上のクライアントにインストール します。

[実行手順]

1)WASD 上の 同期対象となるデータベースのテーブルを TRUNCATE TABLE コマンドなどで削除します。

2)以下の URL を参照し、BCP ユーティリティを使用した オンプレミス上の SQL Server データベース からの エクスポート 及び エクスポートしたデータを WASD 上に インポートします。

bcp を使用して Windows Azure SQL データベースにデータベースを移行する方法
https://msdn.microsoft.com/ja-jp/library/windowsazure/jj156153.aspx

+補足+

一つのテーブルのサイズ (行数) が大きい場合、WASD へのインポート処理時間が長く、処理量が多くなることに起因し、スロットリングなどの問題が発生し、インポート処理が失敗する可能性があります。

一つのテーブルのサイズ (行数) が大きい場合には、”-F (最初の行)” 及び “-L (最後の行)” オプションで、インポートする行数を指定した上で、データをインポートすることを推奨しています。

以下のコマンド例の場合、BCP ユーティリティでエクスポートしたファイルの 100000 行目から 199999 行目までのみをインポートすることが可能です。

+ コマンド例

Bcp tableName in c:\filePath\exportFileName.dat –n –U userName@serverName –S tcp:serverName.database.windows.net –P password –b 200 –F 100000 –L 199999 –h”TABLOCK”

bcp ユーティリティ
https://msdn.microsoft.com/ja-jp/library/ms162802.aspx

※ 本Blogの内容は、2014年3月 現在の内容となっております。