SharePoint Server でログ配布を構成する

適用対象:yes-img-13 2013yes-img-162016 yes-img-192019 yes-img-seSubscription Edition no-img-sopSharePoint in Microsoft 365

ログ配布では、プライマリ データベースからのトランザクション ログを SQL Server の別のインスタンス上のセカンダリ データベースにバックアップします。 ここで説明するシナリオでは、以下で示すように、SQL Server のログ配布を分散ファイル システム レプリカ (DFSR) と共に使用して、データベースとトランザクション ログをMicrosoft Azure の復旧ファームにコピーします。

この障害復旧のシナリオでは、SharePoint Server の運用ファームはオンプレミスに配置され、復旧ファームは Azure に配置されます。 このトピックのガイダンスは、他の種類の障害復旧のシナリオにも適用できます。

Azure のウォーム スタンバイ ソリューションの要素

Azure のウォーム スタンバイ ソリューションの要素

この図について:

  • の社内の SharePoint ファームと Azure復旧 (スタンバイ) ファームの 2 つの環境を並べて説明しています。

  • それぞれの環境には、ファイル共有が含まれます。

  • ログ配布を使用して、社内環境のセカンダリ データベース サーバーからローカル ファイル共有にログがコピーされます。

  • DFSR は、社内環境のファイル共有から Azure 環境のファイル共有にファイルをコピーします。 WAN のシナリオでは、DFSR が、Azure のセカンダリ サーバーにログを直接配布するより効率的です。

  • ログ配布は、Azure 環境のファイル共有から、復旧環境のSQL Server Always On可用性グループ内のプライマリ レプリカにログを再生します。

  • ログ配布データベースは、復旧手順を実行するまで、SharePoint Server ファームに接続されません。

次の図は、Azure ソリューションの完全な SharePoint Server の災害復旧を含む 7 つのフェーズを示しています。 この図では、フェーズ 6: 復旧ファームへのログ配布の設定が強調されており、次のセクションではそれについて説明します。

障害回復ソリューションのロードマップ

災害復旧へのログ配布の使用

ログ配布により、プライマリ データベースのサーバー インスタンスから、セカンダリ データベースのサーバー インスタンスに、データベースのトランザクション ログのファイルを自動的に送信できます。 オンプレミスのテスト環境では、高可用性のためにAlways On可用性グループと 2 つのレプリカを使用します。 両方のレプリカにログ配布を構成しました。 各レプリカは、トランザクション ログを配布できるようにする必要があります。 アクティブでデータベースを所有するレプリカのみがログを配布できます。 ただし、フェイルオーバー イベントが発生し、セカンダリ レプリカがアクティブになると、障害が発生したレプリカの代わりにトランザクション ログを配布する必要があります。

トランザクション ログが Azure 環境で受信された後で、セカンダリ データベース サーバーの各 SharePoint データベースに、一度に 1 つずつ復元されます。 テスト環境の詳細については、「Microsoft の概念実証環境」を参照してください。

注:

組織によっては、バックアップと復旧操作の履歴とステータスの記録の監視として、3 つ目のデータベース サーバーを使用する場合があります。 このオプションの監視サーバーは、バックアップ操作が失敗した場合にアラートを作成します。

ログ配布の詳細については、次の表に記載されている資料を参照してください。

表: ログ配布の参照記事

URL 説明
ログ配布について (SQL Server)
ログ配布のトランザクション ログ バックアップと、使用できるオプションについて説明します。
ログ配布の構成 (SQL Server)
SQL Server 2012 または Transact-SQLを使用して SQL Server Management Studio のログ配布を構成する方法について説明します。
ログ配布レポートの表示 (SQL Server Management Studio)
SQL Server Management Studio でログ配布レポートを表示する方法について説明します。 監視サーバー、プライマリ サーバー、またはセカンダリ サーバーでステータス レポートを実行できます。

パフォーマンスに関する考慮事項

ログ配布は 3 つのジョブで構成されます。 各ジョブでは、次の操作のいずれかを実行します。

  1. プライマリ サーバー インスタンスでトランザクション ログをバックアップします。

  2. セカンダリ サーバー インスタンスにトランザクション ログ ファイルをコピーします。

  3. セカンダリ サーバー インスタンスでログ バックアップを復元します。

各ジョブはスケジュールに従い、一定の間隔で動作します。これは、データベース サーバーと、既定では SharePoint ファームのパフォーマンスに大きな影響を与える場合があります。

ログ配布のバックアップ、コピー、復元ジョブの間隔を適切に設定するには、ログ配布のデータ量を分析する必要があります。 ログが配布されるデータの量は、コンテンツ データベースで毎日変更される量に影響されます。 変更の割合は、コンテンツ、メンテナンスの変更、および使用率のピークに応じて大きく変わる可能性があります。

変更の正確な割合を取得するには、指定された間隔でログ配布を行う各コンテンツ データベースのトランザクション ログ バックアップで変更される量を計算します。 このデータを使用して、プライマリ データベースと比較した変更の割合を計算します。

Microsoft のフィールド スタッフによる SharePoint Server のいくつかのリリースへのログ配布の経験から、次のガイダンスが出されています。

  • すべてのログ配布ジョブが、前のジョブから少なくとも 1 分遅くオフセットされるようにして、すべてのジョブが同時に開始されることによるパフォーマンスの低下を回避します。

  • 少数の大きなトランザクション ログではなく、サイズが小さい多数のトランザクション ログをバックアップしてコピーすることをお勧めします。

  • ログ バックアップを頻繁にコピーするようスケジュールします。 トランザクション ログの復旧の頻度を少なくすることができます。 例えば、バックアップとコピーの間隔を 5 分にし、復元の間隔を 15 分にして開始します。

ログ配布の構成の前提条件

災害復旧ソリューションにログ配布を使用する場合は、次の前提条件を満たしているかどうかを確認します。

  • SQL Server のログインは、ログ配布に必要なアクセス許可レベルを付与されたドメイン アカウントです。 ログ配布のストアド プロシージャでは、 sysadmin 固定サーバー ロールのメンバーシップが必要です。

  • プライマリ データベースでは、完全または一括ログ復旧モデルを使用する必要があります。

    注意

    データベースを単純復旧に切り替えると、ログ配布が動作しなくなります。

  • ログ配布を構成する前に、セカンダリ サーバーで利用できるトランザクション ログ バックアップを作成するための共有を作成する必要があります。 これは、トランザクション ログ バックアップが生成されるディレクトリの共有です。

目標復旧時点 (RPO) に加えて、復旧されたファームのデータが、できる限り完全であり、破損されていないことを確認します。 この目標に到達するには、ログ配布のあらゆる側面を注意して計画およびスケジュールする必要があります。

ログ配布のインフラストラクチャ

次の図は、災害復旧ソリューションの環境で使用されるログ配布インフラストラクチャを示します。

ログ配布インフラストラクチャとデータフロー

オンプレミスと Azure ファーム間のログ配布インフラストラクチャと方向フロー。

前の図は、ログ配布インフラストラクチャとデータ フローを示しています。 運用ファームと Azure の復旧ファームの SQL Server のデータベース サーバーとファイル サーバーが図に示されています。 これらのファームはほぼ同じであり、各ファームには、各Always On可用性グループのプライマリ レプリカとセカンダリ レプリカが含まれています。 ファイル サーバー FIL1 と AZ-FIL1 は、ハード ディスクとディスク サイズも含め、同一に構成されています。 ファームの追加のサーバーは示されていません。

高可用性を提供するために、可用性グループの各レプリカに、ほかのレプリカのバックアップ (完全、差分、およびトランザクション ログ) が格納されます。

プライマリ レプリカとセカンダリ レプリカ (それぞれ SQL-HA1 と SQL-HA2) は、可用性グループのパートナー上に保存されるバックアップを作成します。

トランザクション ログ配布は、運用データベースのバックアップへの影響を最小限にするために、セカンダリ レプリカに構成されています。 これらのトランザクション ログは、社内のファイル サーバー (FIL1) 上の共有フォルダーに書き込まれます。 Windows Server 分散ファイルシステム (DFS) レプリケーション サービスは、FIL1 から AZ-FIL1 にトランザクション ログをコピーします。 AZ-FIL1 のトランザクション ログが、復旧ファームの可用性グループのプライマリ レプリカである AZ-SQL-HA1 に復元されます。

ログ配布の構成と検証に必要な手順

ログ配布の構成、実行、および検証に必要な手順を、次のリストに簡潔に要約します。

  1. データベースをバックアップします。

  2. ファイル サーバー上のローカル フォルダーと共有フォルダーに完全バックアップと差分バックアップを構成します。

  3. バックアップがローカル フォルダーと共有フォルダーの両方に作成されたことを確認します。

  4. 分散ファイル システム (DFS) レプリケーションを設定します。

  5. ファイル サーバーの共有フォルダー上の社内ファームと Azure ファームの間でトランザクション ログとバックアップのファイルを転送するための名前空間およびレプリケーションを作成します。

  6. ログ配布の実行後に、すべての転送を確認します。

  7. ログ配布を設定してテストします。

  8. Primary-Logshippingsetupparameter スクリプトを使用して、プライマリ データベース サーバーでログ配布を設定します。 このスクリプトは、バックアップ ジョブを作成し、ログ配布をスケジュールしてから、ジョブを開始します。

SET NOCOUNT ON
USE MSDB
GO
--@PrimServer : Primary Server name
--@SecServer  : DR/Secondary Server Name
--@SecInstance : DR/Secondary FQDN
--@Domain  : Domain Name
--@BkpDrive : Production Backup server Name
--@DBName : DatabaseName
DECLARE @LS_BackupJobIdAS uniqueidentifier,  @LS_PrimaryIdAS uniqueidentifier , @SP_Add_RetCode As int 
DECLARE @Time as nvarchar(10),@SecInstance as nvarchar(250), @PrimServer as nvarchar(50),@SecServer as nvarchar(50),
@Domain as nvarchar(50),@DBName as nvarchar(max),@BkpDrive as nvarchar(250),@CMD as nvarchar(max),@Counter int
----------------------------------------------------------------------------
IF OBJECT_ID ('tempdb.DBO.#LogShipping','U') IS NOT NULL DROP TABLE #LogShipping
Create table #LogShipping ( LSDBs nvarchar(max))
Set @PrimServer ='SQL1'
Set @SecServer ='SQL2'
Set @SecInstance ='SQL2.corp.adventureworks.com'
Set @Domain ='corp.adventureworks.com'
Set @BkpDrive ='FS1.corp.adventureworks.com'
Set @DBName = 'Social_DB'
Set @Time = '0130'
SET @DBName = UPPER(REPLACE(@DBName, ' ', ''))
SET @DBName = '''' + REPLACE(@DBName, ',', ''', ''') + ''''
Set @CMD =   ' Select ' +
'''DECLARE  @SP_Add_RetCode As int, @LS_BackupJobIdAS uniqueidentifier,  @LS_PrimaryIdAS uniqueidentifier
EXEC @SP_Add_RetCode = master.dbo.sp_add_log_shipping_primary_database ' + CHAR(10) +
'@database = ''''''  + db.Name + ''''''' + CHAR(10) +
',@backup_directory = ''''\\' + @BkpDrive + '\LS\' + ''' + db.Name + ''''' + '''' + CHAR(10) +
',@backup_share = ' + '''''\\' + @BkpDrive + '\LS\' + ''' + db.Name + ''''' + ''''  + CHAR(10) +
',@backup_job_name = ''''' + 'LSBackup_' + ''' + db.Name + ''''' + '''' + CHAR(10) +
',@backup_retention_period = 4320
,@backup_compression = 1
,@backup_threshold = 180 
,@threshold_alert_enabled = 1
,@history_retention_period = 5760 
,@backup_job_id = @LS_BackupJobId OUTPUT 
,@primary_id = @LS_PrimaryId OUTPUT 
,@overwrite = 1 ' +
'IF (@@ERROR = 0 AND @SP_Add_RetCode = 0) 
BEGIN 
DECLARE @LS_BackUpScheduleUIDAs uniqueidentifier ,@LS_BackUpScheduleIDAS int 
EXEC msdb.dbo.sp_add_schedule 
@schedule_name = ''''' + 'LSBackupSchedule_'+ @PrimServer + '_' + ''' + db.Name + ''''' + ''''  + CHAR(10) +
',@enabled = 1 
,@freq_type = 4 
,@freq_interval = 1 
,@freq_subday_type = 4 
,@freq_subday_interval = 13 
,@freq_recurrence_factor = 0 
,@active_start_date = 20090506 
,@active_end_date = 99991231 
,@active_start_time = ' + @Time  + CHAR(10) +
',@active_end_time = 235900 
,@schedule_uid = @LS_BackUpScheduleUID OUTPUT 
,@schedule_id = @LS_BackUpScheduleID OUTPUT 
EXEC msdb.dbo.sp_attach_schedule @job_id = @LS_BackupJobId ,@schedule_id = @LS_BackUpScheduleID  
EXEC msdb.dbo.sp_update_job @job_id = @LS_BackupJobId ,@enabled = 1 
END 
EXEC master.dbo.sp_add_log_shipping_alert_job 
EXEC master.dbo.sp_add_log_shipping_primary_secondary 
@primary_database = '''  + ''''' + db.Name + ''''' + ''''  + CHAR(10) + 
',@secondary_server = ''''' + @SecInstance + ''''''  + CHAR(10) +
',@secondary_database = ''' + ''''' + db.Name + ''''' + ''''  + CHAR(10) +
',@overwrite = 1 ''' +
' [LSDBs] FROM sys.databases db  where name in (' + @DBName + ')' +
'and    db.name  not in (''master'',''model'',''msdb'',''tempdb'',''metricsops'',''periscope'' )
and   Not (exists (select lss.Secondary_database from msdb.dbo.log_shipping_Secondary_databases lss where  db.Name = lss.Secondary_database)
or exists (select lsp.primary_database from msdb.dbo.log_shipping_primary_databases lsp where  db.Name = lsp.primary_database)
   )'
Insert #LogShipping (LSDBs)
Exec ( @CMD)
Set @Counter = @@rowcount
While (@counter > 0)
  Begin
  select top 1  @CMD = LSDBs from #LogShipping
  exec sp_executesql @CMD
  set @counter = @counter - 1
  delete top (1) from #LogShipping
  End
IF OBJECT_ID ('tempdb.DBO.#LogShipping','U') IS NOT NULL DROP TABLE #LogShipping
-- ****** End: Script to be run at Primary: [DB1-PSMSQL-01] ******
  1. Secondary-Logshippingsetupparameter scripts スクリプトを使用して、セカンダリ データベース サーバーでログ配布を設定します。 ラボ環境において、セカンダリ データベース サーバーは Azure に配置されている復旧ファームにあります。
-- ****** Begin: Script to be run at Secondary:  9.3 BUILD******
SET NOCOUNT ON
USE MSDB
GO
--@PrimServer : Primary Server name
--@SecServer  : DR/Secondary Server Name
--@SecInstance : DR/Secondary FQDN
--@Domain  : Domain Name
--@PrimaryBkpDrive : Production Backup server Name
--@BkpDrive : Secondary Backup server Name
--@DBName : DatabaseName
DECLARE @LS_BackupJobIdAS uniqueidentifier,  @LS_PrimaryIdAS uniqueidentifier , @SP_Add_RetCode As int 
DECLARE @Time as nvarchar(10),@SecInstance as nvarchar(250), @PrimServer as nvarchar(50),@SecServer as nvarchar(50),
@Domain as nvarchar(50),@DBName as nvarchar(max),@PrimaryBkpDrive as nvarchar(250),@BkpDrive as nvarchar(250),@CMD as nvarchar(max),@CMD2 as nvarchar(max),@Counter int
DECLARE  @Delimeter char(1),@DB nvarchar(200), @StartPos int, @Length int
IF OBJECT_ID ('tempdb.DBO.#LogShipping','U') IS NOT NULL DROP TABLE #LogShipping
Create table #LogShipping ( LSDBs nvarchar(max))
IF OBJECT_ID ('tempdb.DBO.#DBs','U') IS NOT NULL DROP TABLE #DBs
Create TABLE #DBs (Name nvarchar(200))
Set @PrimServer ='az-sql-ha1'
Set @SecServer =' az-sql-ha2'
Set @SecInstance ='SQL1.corp.adventureworks.com'
Set @Domain =' corp.adventureworks.com '
SET @PrimaryBkpDrive = 'fs1.corp.adventureworks.com'
Set @BkpDrive =' az-sp-fs.corp.adventureworks.com '
Set @DBName = 'Social_DB'
Set @Time = '0130'
--Parsing Function
SET @Delimeter = ','
WHILE LEN(@DBName) > 0
  BEGIN
    SET @StartPos = CHARINDEX(@Delimeter, @DBName)
    IF @StartPos < 0 SET @StartPos = 0
    SET @Length = LEN(@DBName) - @StartPos - 1
    IF @Length < 0 SET @Length = 0
    IF @StartPos > 0
      BEGIN
        SET @DB = Rtrim(Ltrim(SUBSTRING(@DBName, 1, @StartPos - 1)))
        SET @DBName = SUBSTRING(@DBName, @StartPos + 1, LEN(@DBName) - @StartPos)
      END
    ELSE
      BEGIN
        SET @DB = Rtrim(Ltrim(@DBName))
        SET @DBName = ''
      END
    INSERT #DBs (Name) VALUES(@DB)
END
--SET @DBName = UPPER(REPLACE(@DBName, ' ', ''))
--SET @DBName = '''' + REPLACE(@DBName, ',', ''', ''') + ''''
Set @CMD = 'Select ' +
''' DECLARE @LS_Secondary__CopyJobId AS uniqueidentifier, @LS_Secondary__RestoreJobId AS uniqueidentifier ,@LS_Secondary__SecondaryId AS uniqueidentifier , @LS_Add_RetCode As int ,@LS_Add_RetCode2 As int 
  DECLARE @LS_SecondaryCopyJobScheduleUIDAs uniqueidentifier ,@LS_SecondaryCopyJobScheduleIDAS int, @LS_SecondaryRestoreJobScheduleUIDAs uniqueidentifier ,@LS_SecondaryRestoreJobScheduleIDAS int 
  EXEC @LS_Add_RetCode = master.dbo.sp_add_log_shipping_secondary_primary 
@primary_server = ''''' + @PrimServer + ''''''+  CHAR(10) +
',@primary_database = '' + ' +  ''''''''' + db.Name + ''''''''' +  CHAR(10) +
' + '',@backup_source_directory = ' + '''''\\' + @PrimaryBkpDrive + '\LS\'' + db.Name + ''''''' +  CHAR(10) +
' ,@backup_destination_directory =  ' + '''''\\' + @BkpDrive + '\LS\'' + db.Name + ''''''' +  CHAR(10) +
',@copy_job_name = ''''LSCopy_DB1-PSMSQL-01_'' + db.Name + ''''''' +  CHAR(10) +
',@restore_job_name = ''''LSRestore_'+ @PrimServer + '_'' + db.Name + ''''''' +  CHAR(10) +
',@file_retention_period = 4320 
,@overwrite = 1 
,@copy_job_id = @LS_Secondary__CopyJobId OUTPUT 
,@restore_job_id = @LS_Secondary__RestoreJobId OUTPUT 
,@secondary_id = @LS_Secondary__SecondaryId OUTPUT 
IF (@@ERROR = 0 AND @LS_Add_RetCode = 0) 
BEGIN 
EXEC msdb.dbo.sp_add_schedule 
@schedule_name =''''DefaultCopyJobSchedule'''' 
,@enabled = 1 
,@freq_type = 4 
,@freq_interval = 1 
,@freq_subday_type = 4 
,@freq_subday_interval = 15 
,@freq_recurrence_factor = 0 
,@active_start_date = 20090506 
,@active_end_date = 99991231 
,@active_start_time = ' + @Time + ' 
,@active_end_time = 235900 
,@schedule_uid = @LS_SecondaryCopyJobScheduleUID OUTPUT 
,@schedule_id = @LS_SecondaryCopyJobScheduleID OUTPUT 
EXEC msdb.dbo.sp_attach_schedule 
@job_id = @LS_Secondary__CopyJobId 
,@schedule_id = @LS_SecondaryCopyJobScheduleID  
EXEC msdb.dbo.sp_add_schedule 
@schedule_name =''''DefaultRestoreJobSchedule'''' 
,@enabled = 1 
,@freq_type = 4 
,@freq_interval = 1 
,@freq_subday_type = 4 
,@freq_subday_interval = 15 
,@freq_recurrence_factor = 0 
,@active_start_date = 20090506 
,@active_end_date = 99991231 
,@active_start_time = ' + @Time + '
,@active_end_time = 235900 
,@schedule_uid = @LS_SecondaryRestoreJobScheduleUID OUTPUT 
,@schedule_id = @LS_SecondaryRestoreJobScheduleID OUTPUT 
EXEC msdb.dbo.sp_attach_schedule 
@job_id = @LS_Secondary__RestoreJobId 
,@schedule_id = @LS_SecondaryRestoreJobScheduleID  
END 
IF (@@ERROR = 0 AND @LS_Add_RetCode = 0) 
BEGIN 
EXEC @LS_Add_RetCode2 = master.dbo.sp_add_log_shipping_secondary_database 
@secondary_database = ' +  ''''''' + db.Name + ''''''' +  CHAR(10) + '
,@primary_server = ''''' + @PrimServer + '''''
,@primary_database = '+  ''''''' + db.Name + ''''''' +  CHAR(10) +
',@restore_delay = 0 
,@restore_mode = 1 
,@disconnect_users= 1 
,@restore_threshold = 180   
,@threshold_alert_enabled = 1 
,@history_retention_period= 5760 
,@overwrite = 1 
END 
IF (@@error = 0 AND @LS_Add_RetCode = 0) 
BEGIN 
EXEC msdb.dbo.sp_update_job @job_id = @LS_Secondary__CopyJobId ,@enabled = 0 
EXEC msdb.dbo.sp_update_job @job_id = @LS_Secondary__RestoreJobId ,@enabled = 1 
END '''  + '[LSDBs] FROM #DBs db'
--Print @CMD
Insert #LogShipping (LSDBs)
Exec ( @CMD)
Set @Counter = @@rowcount
While (@counter > 0)
  Begin
  select top 1  @CMD = LSDBs from #LogShipping
  exec sp_executesql @CMD
  set @counter = @counter - 1
  delete top (1) from #LogShipping
  End
IF OBJECT_ID ('tempdb.DBO.#LogShipping','U') IS NOT NULL DROP TABLE #LogShipping
IF OBJECT_ID ('tempdb.DBO.#DBs','U') IS NOT NULL DROP TABLE #DBs
-- ****** End: Script to be run at Secondary:  9.3 Build ******
  1. トランザクション ログが共有に配布され、DFS が Azure ファイル サーバーの共有にこれらのログをレプリケートしていることを確認します。 SQL Server でジョブの利用状況モニターを開き、トランザクション ログが正常に配布されたことを確認します。 運用ファームと Azure ファームの両方のファイル サーバーで共有フォルダーを開き、DFS がトランザクション ログを転送していることを確認します。

関連項目

概念

SharePoint Server SQL Server Always On可用性グループを構成する

その他のリソース

ログ配布について (SQL Server)

レプリケーションのチュートリアル