松本美穂と松本崇博が執筆した SQL Server 2014 自習書シリーズの「No.5 Microsoft Azure SQL Database 入門」の HTML 版です。 日本マイクロソフトさんの Web サイトで Word または PDF 形式でダウンロードできますが、今回、HTML 版として公開する許可をいただきましたので、ここに掲載いたします。[2015年12月29日]
既存の SQL Server 環境のデータベースを、Azure SQL Database 上へ、丸ごと移行する方法として、一番お勧めなのが DAC(Data-tier Application:データ層アプリケーション)Framework(以降、DAC Fx と記述)の .bacpac を利用する方法です。この .bacpac は、SQL Server 2014 の CU5 以上、または DAC Fx の最新版をインストールことで利用することができます。
DAC Fx の最初のバージョンは、SQL Server 2008 R2 から提供されて、このときは .dacpac というファイル形式(先頭が b ではなく d)で、スキーマのみ(テーブル構造やビュー、ストアド プロシージャなどのオブジェクト定義のみ)をエクスポートおよびインポートできるものでした(データの移行を行うことはできませんでした)。
これに対して、SQL Server 2012 以降では、DAC Fx のバージョンが 2 へ上がって(通称 DAC Fx v2 となって)、データを移行することもできるようになりました。これは .bacpac というファイル形式になります。
執筆時点(2015年1月)での最新版の DAC Fx(Azure SQL Database の V12 に対応した DAC Fx)は、次の URL(SQL Server Data Tools チームの Blog)からダウンロードするか、SQL Server 2014 の CU5 以降を適用することで利用することができます。
それでは、これを試してみましょう。
1.DAC Fx によるデータベースの移行を行うには、次のように Management Studio のオブジェクト エクスプローラーで、移行元の SQL Server に接続して、移行元となるデータベース(画面は NorthwindJ)を右クリックし、[タスク]メニューの[データベースを Windows Azure SQL データベースに配置]をクリックします。
2.ウィザードが開始されたら、[次へ]ボタンをクリックして、次のページへ進みます。
3.次の[配置の設定]ページでは、「接続」ボタンをクリックします。
[サーバーへの接続]ダイアログが表示されたら、[サーバー名]に移行先となる Azure SQL Database のSQL サーバー名、[認証]で「SQL Server 認証」を選択、[ログイン]と[パスワード]にに管理者アカウントの名前とパスワードを入力して、[オプション]ボタンをクリックします。
4.[接続プロパティ]タブでは、[暗号化接続]をチェックすることで、暗号化接続を有効化することができます。
設定後、[接続]ボタンをクリックします。
5.[配置の設定]ページに戻ったら、[新しいデータベース名]に移行先となるデータベース名(既定は移行元と同じ名前。画面は NorthwindJ)を任意で設定します。
[Windows Azure SQL データベースの設定]では、データベースのエディション(Basic、Standard、Premium)などを設定しますが、このウィザードによって作成されたデータベースは課金対象になるので、テスト中は Basic を選択することをお勧めします(もちろん、上位のエディションを選択することで、データ移行をすばやく行えるようになりますが、この自習書の手順を試すには、一番安い Basic エディションで大丈夫です)。
なお、SQL Server 2014 の CU5 を適用していない場合は、エディションの選択で「Web」と「Business」しか選択することができません。この2つは古い料金体系(容量課金)のときのもので、どちらも 2015年 9月に中止される予定のエディションになっています。現時点では、Web や Business エディションを利用することも可能なので、CU5 を適用していない環境の場合は、とりあえず一番安い Web エディションの 1GB を選択しておき、データベースの移行が完了した後に、エディションを Basic や Standard に変更する、ということもできます。
設定後は、[次へ]ボタンをクリックして、次のページへ進みます。
6.次の[概要]ページでは、[完了]ボタンをクリックすることで、データベースの移行が開始されます。
7.データベースの移行中は、次のようにページが表示されます。
データベース内の各オブジェクト(テーブルやビュー、ストアド プロシージャ、トリガー)ごとに結果が表示され、すべての[結果]が「成功」と表示されれば、移行が完了です。最後に[閉じる]ボタンをクリックして、ウィザードを終了します。
Basic エディションの場合は、実行(移行)に数分ぐらいかかりますが、上位のエディションに変更することで、実行時間を短縮することができます。
ウィザードが完了したら、Azure SQL Database の SQL サーバーに接続して、移行されたテーブルを参照すると、次のようにデータが正しく移行されていることを確認できます。
DAC Fx では、Azure SQL Database 上にログイン アカウントが既に存在している場合は、そのログイン アカウントを利用し、存在していない場合は、新しく(データベース ユーザーに対応した)ログイン アカウントを自動作成します。
しかし、作成されたログイン アカウントのパスワードは、移行元で設定されたものとは異なるものに設定されてしまっています(.bacpac は、内部的にはスクリプト生成を行っているのですが、パスワードに関しては、セキュリティ強化の目的で、ランダムな英数字が再設定されるようになっています)。
したがって、データベースの移行後は、ログイン アカウントのパスワードを再設定しておくようにします。これを行うには、Azure SQL Database 側で、master データベースに接続して、次のように ALTER LOGIN ステートメントを実行します。
次に、sqllogin1 ログイン アカウントで Azure SQL Database にログインして、オブジェクト権限の設定が正しく動作するか(権限の移行が成功しているか)どうかを確認してみましょう。
1.まずは、次のようにクエリ エディター上で、任意の場所を右クリックして、[接続]メニューから[接続の変更]をクリックします。
2.[サーバーへの接続]ダイアログが表示されたら、[サーバー名]に Azure SQL Database の SQL サーバーの名前、[ログイン]に「sqllogin1」、[パスワード]に「P@ssword」と入力(前の手順で再設定したパスワードを入力)して、[オプション]ボタンをクリックします。
[接続プロパティ]では、[データベースへの接続]で「NorthwindJ」データベースを選択して、NorthwindJ データベースに接続します。
3.接続後、クエリ エディターで次のように入力して「商品」テーブルを参照してみます。
結果はエラーとなり、商品テーブルのデータを参照することはできません(sqllogin1 は、商品テーブルに対する SELECT 権限が付与されていないので、参照することができません)。
4.次に、n_view1 ビューを参照してみます。
このビューに対しては SELECT 権限が付与されているので、データを参照することができています。
以上のように、DAC Fx を利用すれば、既存の SQL Server 環境のデータベースを簡単に Azure SQL Database 上に移行することができます。ログイン アカウントのパスワードの再設定のみが必要になりますが、テーブルやデータだけでなく、制約やビュー、ストアド プロシージャ、トリガー、データベース ユーザー、オブジェクト権限、インデックスなどもそのまま移行することができます。
前の手順では、ログイン アカウントに紐付いたデータベース ユーザーを利用している場合を想定していましたが、Azure SQL Database は、Contained Database(包含データベース)にも対応しています。Contained Database は、SQL Server 2012 から提供された機能で、ログイン アカウントとはマッピングする必要がない(紐付ける必要がない)、データベース内にのみユーザー(包含ユーザー)を作成することができる機能です。SQL Server 2012/2014 を利用している場合は、次のように設定することで、Contained Database 機能を利用できるようになります。
Contained Database 機能を有効化すると、次のように CREATE USER ステートメントで WITH PASSWORD を付けることで、「データベース内にのみ存在するユーザー」=「包含データベース ユーザー」を作成することができます。
これらの Contained Database に関しても、サンプル スクリプトを解凍したフォルダーを展開して、「NorthwindJ_CDB.sql」ファイルを選択し、[開く]ボタンをクリックすれば、試すことができるので、ぜひ試してみてください(NorthwindJ_CDB という名前のデータベースが作成されて、その中に sqluser1 および sqluser2 という包含データベース ユーザーが作成されます)。
Contained Database に設定したデータベースも、DAC Fx(.bacpac)を利用して、同じように Azure SQL Database 上にデータベースを移行することができます。
ただし、移行後は、包含データベース ユーザーのパスワードがリセットされてしまうので(新しいパスワードが再設定されてしまうので)、次のように ALTER USER ステートメントを実行して、パスワードを再設定するようにします。
このように DAC Fx(.bacpac)は、Contained Database(包含データベース)にも対応しています(後述のスクリプト生成ウィザードは、Contained Database には対応していません)。
前の手順では、DAC Fx を利用して、直接データベースを移行する手順を説明しましたが、この方法では、内部的には次のように .bacpac というファイルが作成されています。
この .bacpac ファイルの作成(エクスポート)やインポートは、個別に実行することもできるので、これも試してみましょう。
1..bacpac ファイルの作成(エクスポート)を行うには、次のように移行元の SQL Server に接続して、該当データベース(NorthwindJ)を右クリックし、[タスク]メニューの[データ層アプリケーションのエクスポート]をクリックします。
データ層アプリケーションは、DAC(Data-tier Application)の日本語訳です。エクスポート メニューのほかに、[データ層アプリケーションの抽出]や、[データ層アプリケーションの配置]、[データ層アプリケーションのアップグレード]など、似たようなメニューがありますが、これらは、DAC Fx の V1(最初のバージョン)相当の .dacpac(スキーマのみ)を作成(抽出)したり、配置(スキーマを配置)したりするものになっていて、.bacpac(データを含んだもの)とは異なるメニューになるので注意してください。
2.ウィザードが開始されたら、[次へ]ボタンをクリックして、次のページへ進みます。
3.次の[エクスポート設定]ページでは、[ローカル ディスクに保存]を選択して、任意の場所に .bacpac ファイルへのパスを記述します(画面は、C:\temp\NorthwindJ.bacpac)。
4.次の[概要]ページでは、設定内容を確認して[完了]ボタンをクリックします。
これでエクスポートが実行されます。
5.エクスポートが完了すると、次のように、すべての[結果]が「成功」と表示されます。
これで、.bacpac ファイルの作成が完了です。
ここまでの手順は、Management Studio を利用して DAC Fx(.bacpac)を利用する手順を説明しましたが、Management Studio がない環境の場合でも、DAC Fx をインストールしておけば、SqlPackage コマンドを利用して、.bacpac ファイルを作成することができます。
DAC Fx の執筆時点での最新版(SQL Database V12 に対応したもの)は、SQL Server Data Tools チームの以下の Blog からダウンロード/インストールすることができます。
DAC Fx をインストールすると、次のフォルダーに SqlPackage コマンドがインストールされています(32ビット版をインストールしている場合は、Program Files に (x86) を付けたパスになります)。
C:\Program Files\Microsoft SQL Server\120\DAC\bin
SqlPackage コマンドは、コマンド ライン ツールなので、コマンド プロンプトを起動して、次のように記述することで、.bacpac ファイルをエクスポートすることができます(32ビット版をインストールしている場合は cd で移動するパスを変更してください)。
/Action オプションで Export を指定することで、.bacpacファイルのエクスポートを行うことができ、/ssn オプションで移行元となるSQL Serverの名前を指定(画面は MATUMO)、/sdn オプションで移行元となるデータベースの名前(画面は NorthwindJ)、/su と /sp オプションで SQL Server に接続するためのログイン アカウントとパスワード、/tf オプションで .bacpacファイルへのパスを記述します。
エクスポートした .bacpac ファイルを、Azure SQL Database 上にインポートするには、次のように SqlPackage コマンドを実行します(以下のように作成したデータベースは、Standard エディションの S0 として作成されるので、インポートの完了後は、必要に応じてエディションを変更したり、テストが終わったらデータベースの削除をし忘れないように注意してください)。
インポートするときは、/Action オプションで Import と指定し、/tsn オプションで移行先となる Azure SQL Database の SQL サーバーの名前を指定、/tdn オプションで移行先となるデータベースの名前(新しくデータベースが作成されます)、/tu と /tp オプションで Azure SQL Database の管理者アカウントの名前とパスワード、/sf オプションで .bacpacファイルへのパスを記述します。/tec:"True" は、暗号化接続を行うための指定です。
インポートが完了した後は、ログイン アカウントのパスワードを再設定すれば、データベースの移行が完了です。
Management Studio を利用して、Azure SQL Database 上に .bacpac ファイルをインポートする場合は、次のように操作します。
1.まずは、移行先となる Azure SQL Database の SQL サーバーに接続して、[データベース]フォルダーを右クリックして、[データ層アプリケーションのインポート]をクリックします。
2.ウィザードが開始されたら、[次へ]ボタンをクリックして、次のページへ進みます。
3.次の[インポートの設定]ページでは、[ローカル ディスクからインポート]を選択して、インポートしたい .bacpac ファイルを選択します。
4.次の[データベースの設定]ページでは、[新しいデータベース名]で移行先となるデータベース名(既定は移行元と同じ名前)を任意で設定します。
[Windows Azure SQL データベースの設定]では、データベースのエディション(Basic、Standard、Premium)などを設定しますが、このウィザードによって作成されたデータベースは課金対象になるので、テスト中は一番安い Basic エディションを選択することをお勧めします。
5.次の[概要]ページでは、[完了]ボタンをクリックすることで、インポートを開始できます。
6.インポート中は、次のページが表示されます。
7.次のように、すべての[結果]が「成功」と表示されれば、インポートが完了です。
インポートが完了した後は、ログイン アカウントのパスワードを再設定すれば、データベースの移行が完了です。
このように、.bacpac ファイルを利用すれば、エクスポートとインポートを利用して、既存の SQL Server 環境のデータベースを、Azure SQL Database 上へ、データを含めて丸ごと簡単に移行することができます。
.bacpac では、データベース サイズが大きい場合には、次のように行うのがお勧めです。
お勧めする一番の理由は、Azure ポータルを利用することで、インポートの進捗状況を確認できる点です(前ページの Note に記載)。進捗状況が確認できれば、あとどれぐらいで完了するのかを推測することができるので、移行計画を立てやすくなります。実際の移行にあたっては、事前に、実際のデータベース サイズよりも、小さいサイズのものを作成して(データを一部削除するなどして)、移行(インポート)にどれぐらいの時間がかかるのかを計測しておくことをお勧めします。
参考までに、弊社のお客様データ(実際のデータを 1億件スケールに変更したもの)を移行したときの結果が次のとおりです。
データベースのサイズは 2GB で、この中に、テーブル(テーブル名を伏せるために t1 に変更)のサイズ 2GB、データ件数 1億件のものが入っています。
このデータベースに対して、Management Studio(CU5)から .bacpac ファイルのエクスポートを実行して、そのときにかかったおおよその時間は 26分でした(利用したハードウェアは、Core i7 2600K 3.4GHz、32GB メモリ、SSD Crucial MX550 1TB)。
.bacpac ファイルのサイズは、240MB になりました(8分の 1ぐらいにまで圧縮されていました)。
この 240MB の .bacpac ファイルを、AzCopy ツールを利用して、Azure ストレージ上にコピーしたときのスピードは、1分 16秒でした。
AzCopy ツールは、ローカルのファイルを Azure ストレージ上にコピーできるツールですが、監査の最後の項で説明した「Azure SDK 2.5」をインストールしていれば、利用することができます。AzCopy は、次のように利用できます。
/Source オプションでコピーしたい .bacpacファイルを格納しているローカルフォルダーへのパス、/Pattern オプションで .bacpacファイルの名前を指定して、/Dest オプションにストレージ アカウントのコンテナーへの URL、/DestKey オプションにストレージ アカウントへのアクセス キーを入力すれば、ファイルをコピーすることができます。コンテナーの URL やアクセス キーは、次のように Azure ポータルで確認することができます。
このように、Azure ストレージ上にコピーした .bacpac ファイルは、Azure ポータルを利用して、次のようにインポートを行うことができます。
インポート中は、次のように進行状況を確認することができます。
画面は、P2 でインポートを行った場合ですが、37分 19秒で完了することを確認できました。なお、同じ .bacpac ファイルを、P3 でインポートを行った場合には、14分 46秒で完了することも確認できました。インポートの注意点としては、インポート中も、データベースの課金が発生するという点になります(インポートの最初のフェーズでデータベースが作成されるので、そこから課金対象になります)。もちろん、上位のエディション/パフォーマンス レベルを選択することで、インポート時間を大きく短縮することができるので、それとのトレードオフになります。
インポートが完了した後は、インデックスの再構築をしておくことがお勧めになります。元々の環境では、1億件 2GB のテーブル サイズでしたが、インポートによって、次のように 3.3GB に大きくなりました。
このようにサイズが大きいままだと、クエリ性能に影響が出るので(読み取りI/O 数が増えることになるので)、インデックスの再構築を行って、サイズを元の大きさに戻しておくことがお勧めになります。インデックスの再構築は、次のように ALTER INDEX ステートメントで行えます。
インデックスの再構築後は、次のようにサイズが 2GB(移行元と同じサイズ)になることを確認できました。
このように、.bacpac ファイルをインポートした後は、インデックスを再構築しておくことをお勧めします。
第60回:SQL Server 2017 自習書 No.3「SQL Server 2017 Machine Learning Services」のご案内
第59回:SQL Server 2017 自習書 No.2「SQL Server 2017 on Linux」のご案内
第58回:SQL Server 2017 自習書 No.1「SQL Server 2017 新機能の概要」のご案内
第57回:SQL Server 2017 RC 版とこれまでのドキュメントのまとめ
第56回:「SQL Server 2016 への移行とアップグレードの実践」完成&公開!
第55回:書籍「SQL Server 2016の教科書 開発編」(ソシム)が発刊されました
第54回:「SQL Server 2016 プレビュー版 Reporting Services の新機能」自習書のお知らせ
第 53 回:SQL Server 2016 Reporting Services の新しくなったレポート マネージャーとモバイル レポート機能
第 52 回:SQL Server 2016 の自習書を作成しました!
第 51 回:PASS Summit と MVP Summit で進化を確信!
第 50 回:新しくなった Power BI(2.0)の自習書を作成しました!
第49 回:Excel 2016 の Power Query を使う
第 48 回:新しくなった Microsoft Power BI ! 無料版がある!!
第 47 回:「Microsoft Azure SQL Database 入門」 完成&公開!
第 46 回:Microsoft Power BI for Windows app からの Power BI サイト アクセス
第 45 回:Power Query で取得したデータを PowerPivot へ読み込む方法と PowerPivot for Excel 自習書のご紹介
第44回:「SQL Server 2014 への移行とアップグレードの実践」ドキュメントを作成しました
第43回:SQL Server 2014 インメモリ OLTP 機能の上級者向けドキュメントを作成しました
第42回:Power Query プレビュー版 と Power BI for Office 365 へのクエリ保存(共有クエリ)
第41回:「SQL Server 2014 CTP2 インメモリ OLTP 機能の概要」自習書のお知らせです
第40回: SQL Server 2012 自習書(HTML版)を掲載しました
第39回: Power BI for Office 365 プレビュー版は試されましたか?
第38回: SQL Server 2014 CTP2 の公開
第37回: SQL Server 2014 CTP1 の自習書をご覧ください
第36回: SQL Server 2014 CTP1 のクラスター化列ストア インデックスを試す
第35回: SQL Server 2014 CTP1 のインメモリ OLTP の基本操作を試す
第34回: GeoFlow for Excel 2013 のプレビュー版を試す
第33回: iPad と iPhone からの SQL Server 2012 Reporting Servicesのレポート閲覧
第32回: PASS Summit 2012 参加レポート
第31回: SQL Server 2012 Reporting Services 自習書のお知らせ
第30回: SQL Server 2012(RTM 版)の新機能 自習書をご覧ください
第29回: 書籍「SQL Server 2012の教科書 開発編」のお知らせ
第26回: SQL Server 2012 の Power View 機能のご紹介
第25回: SQL Server 2012 の Data Quality Services
第24回: SQL Server 2012 自習書のご案内と初セミナー報告
第23回: Denali CTP1 が公開されました
第22回 チューニングに王道あらず
第21回 Microsoft TechEd 2010 終了しました
第20回 Microsoft TechEd Japan 2010 今年も登壇します
第19回 SQL Server 2008 R2 RTM の 日本語版が公開されました
第18回 「SQL Azure 入門」自習書のご案内
第17回 SQL Server 2008 自習書の追加ドキュメントのお知らせ
第16回 SQL Server 2008 R2 自習書とプレビュー セミナーのお知らせ
第15回 SQL Server 2008 R2 Reporting Services と新刊のお知らせ
第14回 TechEd 2009 のご報告と SQL Server 2008 R2 について
第13回 SQL Server 2008 R2 の CTP 版が公開されました
第12回 MVP Summit 2009 in Seattle へ参加