先日、Geo-DR for SQL Server on Windows Azure Infrastructure Services using Log Shipping というドキュメントが公開されました。
この構成ですが、Windows Azure のインフラストラクチャを使用して、ログ配布による DR 構成を作成するというものです。
構成の概略としては、以下のようになります。
SQL Server Agent を使用して、定期的にバックアップを AZCopy で BLOB に保存し、そこからリストアすることで、ログ配布構成をとるというものになります。
この構成を作るための手順を見ていきたいと思います。
今回は、SQL Server 2012 SP1 CU 8 (評価版) を使用しており、オンプレミスの SQL Server がソースデータベース、Windows Azure 上の VM に構築された SQL Server が配信先のデータベースとなるように構成します。
ドキュメントの内容ですが機能として実装されているというわけではなく、仕組みとして実装ができるというものになります。
必要となるモジュール群は Sample that demonstrates a geo-dr approach for SQL Server on Windows Azure IAAS からダウンロードすることができます。
モジュールの中には Visual Studio のソリューションが含まれており、インストーラーを作ることができるのですが、今回はインストーラーを使用せずにマニュアルセットアップ (ドキュメントの Installation without ADLS Installer (manual setup) で試しています。
まずは、最初の作業として、バックアップを格納する BLOB のストレージアカウントとコンテナーを作成します。
次にソースと配信先の SQL Server で SQL Server Agent のサービスが起動している状態にします。
次にソースと配信先の SQL Server にログ配布の管理用オブジェクトを作成します。
- ソースで [CreateTablesSource.sql] / [sp_ADLS_SourceInstall.sql] / [sp_ADLS_BackupLog.sql]
- 配信先で [CreateTablesDestn.sql] / [sp_ADLS_DestnInstall.sql] / [sp_ADLS_RestoreLog.sql]
を実行します。
今回は AzureDCLogShipper データベースを新規に作成し、そのデータベースに対してクエリを実行してオブジェクトを作成しています。
これでオブジェクトが作成されますのであとは SQL Server Agent のジョブを作成します。
最後にソースと配信先にバックアップ用の SQL Server Agent ジョブを作成します。
SQL Server Agent ジョブの作成は、[sp_ADLS_SourceInstall.sql] / [sp_ADLS_DestnInstall.sql] を使用します。
ソース側の SQL Server Agent ジョブを作成する場合は以下のようになります。
USE AzureDCLogShipper GO EXEC [sp_ADLS_SourceInstall] @database_name = '<ログ配布をする DB 名>', @log_location_type = 0, -- 0:Azure Storage /1:Local Directory @local_log_folder_path = NULL, @azure_blob_container_name = '<Azure ストレージコンテナ>', @azure_storage_account_name= '<Azure ストレージアカウント>', @azure_storage_account_access_key = '<Azure ストレージアクセスキー>', @azcopy_program_path = NULL, @job_enabled = 1, @job_freq_type = 4, @job_freq_interval = 1, @job_freq_subday_type=8, @job_freq_subday_interval=1, @job_freq_relative_interval=0, @job_freq_recurrence_factor=1, @job_active_start_date=20140312, @job_active_end_date=99991231, @job_active_start_time=0, @job_active_end_time=235959
SQL Server 2012 SP1 CU2 以降では、Azure ストレージに直接バックアップを取得することができますので、今回は直接取得するようにしています。
それ以前のバージョンの場合はローカルに取得してそれを AZCopy を使用してコピーするようにジョブを設定します。
正常に実行できると SQL Server Agent のジョブが作成されます。
このジョブを実行すると Azure ストレージにバックアップが取得されます。
# 初回は完全バックアップとログバックアップが取得されます。
これでソース側は完了です。
SQL Server Agent のジョブが実行されるとログ配布用のトランザクションログが定期的に作成されます。
次に配布先で SQL Server Agent ジョブを作成します。
配布先の SQL Server Agent ジョブを作成する場合は以下のようになります。
USE [AzureDCLogShipper] GO EXEC [sp_ADLS_DestnInstall] @database_name = '<ログ配布をする DB 名>', @log_location_type = 0, -- 0:Azure Storage(2012 SP1 CU2以降)/1:Local Directory @local_log_folder_path = NULL, @recovery_option = 0, -- 0:NORECOVERY/1:STANDBY/2:RECOVERY @standby_file_folder = '', @azure_blob_container_name = '<Azure ストレージコンテナ>', @azure_storage_account_name= '<Azure ストレージアカウント>', @azure_storage_account_access_key = '<Azure ストレージアクセスキー>', @azcopy_program_path = NULL, @job_enabled = 1, @job_freq_type = 4, @job_freq_interval = 1, @job_freq_subday_type=8, @job_freq_subday_interval=1, @job_freq_relative_interval=0, @job_freq_recurrence_factor=1, @job_active_start_date=20140312, @job_active_end_date=99991231, @job_active_start_time=0, @job_active_end_time=235959
こちらも SQL Server 2012 SP1 CU2 以降を使用しているので、Azure ストレージから直接バックアップをリストアしています。
このジョブを実行すると初回は DB のリストアとログの適用が行われます。
ただし、私が試した範囲では、[sp_ADLS_RestoreLog] の 以下の箇所を修正しないと ALTER DATABASE でエラーとなってしまいました。
# リストア中のデータベースに対しての ALTER DATABASE なのでエラーになっていると思うのですが。
------------------------------------------------------------- -- Set single user if(@nextSequenceNo > 0) begin set @sqlStmtAlterDB = 'ALTER DATABASE [' + @database_name + '] SET SINGLE_USER WITH ROLLBACK IMMEDIATE' --exec sp_executesql @sqlStmtAlterDB end -- Restore exec sp_executesql @sqlStmt -- Set multi user if(@nextSequenceNo > 0) begin set @sqlStmtAlterDB = 'ALTER DATABASE [' + @database_name + '] SET MULTI_USER' --exec sp_executesql @sqlStmtAlterDB end --------------------------------------------------------------- if(@nextSequenceNo > 0) begin set @sqlStmtAlterDB = 'ALTER DATABASE [' + @database_name + '] SET MULTI_USER' --exec sp_executesql @sqlStmtAlterDB end
ジョブを実行すると以下のように復元中の形で、データベースがリストアされます。
エラーの状況は、AzureDCLogShipper に作成したテーブルで確認ができます。
配布先側では、バックアップ名をインクリメントしながら再帰で [sp_ADLS_RestoreLog] を実行し、エラーになったらストアドの実行を終了するという形になっているようですので、
select * from [dbo].[ADLS_LogRestoreInfo] select * from [dbo].[ADLS_OperationErrorInfo]
を実行してエラーの状態を確認すると、最後に存在しないバックアップをリストアしたという形でエラーが発生しているかと思います。
# 想定されているエラーなので無視して問題ないはずですが。
仕組みとしては Azure ストレージをバックアップ先として使用した、独自のリストアの仕組みになるのですが、この組み合わせは結構面白いかもしれないですね。