皆さん、こんにちは。 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 の高可用性と災害復旧
http://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
http://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>"
4) 同期を行う WASD 上のデータベースを削除します。
5)SqlPackage.exe で “Import” オプションを指定し、3) で作成したデータベースのバックアップ (bacpac 形式) を WASD 上にインポートします。
+ コマンド例
sqlpackage.exe /Action:Import /tsn:"<WASD サーバー名>" /tdn:"<WASD データベース名>" /tu:"<ユーザー名>" /tp:"<パスワード>" /sf:"<インポートファイル名.bacpac>"
+補足+
オンプレミス上の 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 の一時保存先パスを指定後、”次へ” を選択します。
4)指定した内容が正しいことを確認後、”完了” ボタンを選択します。
C) BCP ユーティリティ
[事前準備]
1)WASD 上に、新規データベース 及び オンプレミス上の SQL Server のデータベースと同じオブジェクト (テーブルなど) を作成します。
2)SSMS 2012 (Express) を オンプレミス上のクライアントにインストール します。
[実行手順]
1)WASD 上の 同期対象となるデータベースのテーブルを TRUNCATE TABLE コマンドなどで削除します。
2)以下の URL を参照し、BCP ユーティリティを使用した オンプレミス上の SQL Server データベース からの エクスポート 及び エクスポートしたデータを WASD 上に インポートします。
bcp を使用して Windows Azure SQL データベースにデータベースを移行する方法
http://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 ユーティリティ
http://msdn.microsoft.com/ja-jp/library/ms162802.aspx
※ 本Blogの内容は、2014年3月 現在の内容となっております。