SharePoint Server에서 로그 전달 구성

적용 대상:yes-img-132013 yes-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의 웜 대기 솔루션 요소

이 그림의 내용

  • Azure의 복구(대기) 팜과 온-프레미스 SharePoint 팜의 두 환경이 나란히 표시되어 있습니다.

  • 각 환경에는 파일 공유가 있습니다.

  • 온-프레미스 환경의 보조 데이터베이스 서버에서 로컬 파일 공유로 로그를 복사하는 데 로그 전달이 사용됩니다.

  • DFSR은 온-프레미스 환경의 파일 공유에서 Azure 환경의 파일 공유로 파일을 복사합니다. WAN 시나리오에서 DFSR은 Azure의 보조 서버로 직접 로그를 전달하는 것보다 더 효율적입니다.

  • 로그 전달은 Azure 환경의 파일 공유에서 복구 환경의 SQL Server Always On 가용성 그룹의 주 복제본으로 로그를 재생합니다.

  • 로그 전달 데이터베이스는 복구 작업이 수행될 때까지 SharePoint Server 팜에 연결되지 않습니다.

다음 그림에서는 Azure 솔루션에 포함된 SharePoint Server 재해 복구를 완료하는 7개 단계를 보여 줍니다. 이 다이어그램에서는 6단계: 복구 팜으로의 로그 전달 설정이 강조 표시되어 있으며 관련 내용은 다음 섹션에 설명되어 있습니다.

재해 복구 솔루션 로드맵

재해 복구에 로그 전달 사용

로그 전달을 사용하여 자동으로 기본 데이터베이스 서버 인스턴스의 데이터베이스에 대한 트랜잭션 로그 파일을 보조 데이터베이스 서버 인스턴스로 전송할 수 있습니다. 온-프레미스 테스트 환경에서는 고가용성을 위해 두 개의 복제본이 있는 Always On 가용성 그룹을 사용합니다. 두 복제본에서 로그 전달을 구성했습니다. 각 복제본은 트랜잭션 로그를 전달할 수 있어야 합니다. 활성 상태이고 데이터베이스를 소유하는 복제본만 로그를 전달할 수 있습니다. 그렇지만 장애 조치 이벤트가 발생하고 보조 복제본이 활성 상태가 되면 장애가 있는 복제본 대신 트랜잭션 로그를 전달해야 합니다.

트랜잭션 로그는 Azure 환경에서 수신된 다음 한 번에 하나씩 보조 데이터베이스 서버의 각 SharePoint 데이터베이스로 복원됩니다. 테스트 환경에 대한 자세한 내용은 Microsoft 개념 증명 환경을 참조하세요.

참고

일부 조직에서는 세 번째 데이터베이스 서버를 모니터로 사용하여 백업 및 복원 작업의 내역과 상태를 기록합니다. 이 선택적 모니터 서버는 백업 작업이 실패할 때 알림을 생성합니다.

로그 전달에 대한 자세한 내용은 다음 표에 나열된 문서를 참조하세요.

표: 로그 전달에 대한 참조 문서

URL 설명
로그 전달 정보(SQL Server)
로그 전달 트랜잭션 로그 백업 및 사용 가능한 옵션에 대해 설명합니다.
로그 전달 구성(SQL Server)
SQL Server Management Studio 또는 Transact-SQL을 사용하여 SQL Server 2012에서 로그 전달을 구성하는 방법을 설명합니다.
로그 전달 보고서 보기(SQL Server Management Studio)
SQL Server Management Studio에서 트랜잭션 로그 전달 상태 보고서를 보는 방법을 설명합니다. 모니터 서버, 기본 서버 또는 보조 서버에서 상태 보고서를 실행할 수 있습니다.

성능 고려 사항

로그 전달은 세 가지 작업으로 구성되어 있습니다. 각 작업은 다음 작업 중 하나를 수행합니다.

  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)

복제 자습서