Настройка доставки журналов в SharePoint Server

 

**Применимо к:**Microsoft Azure, SharePoint Server 2013, SharePoint Server 2016, SQL Server

**Последнее изменение раздела:**2017-09-20

Сводка. Узнайте, как реализовать доставку журналов для SharePoint Server 2016 и SharePoint Server 2013 в сценарии аварийного восстановления.

Доставка журналов позволяет создавать резервные копии журналов транзакций из основной базы данных в дополнительном экземпляре SQL Server. В описанном здесь сценарии доставка журналов SQL Server используется вместе с репликацией распределенной файловой системы (DFSR) для копирования баз данных и журналов транзакций в ферму восстановления в Microsoft Azure, как показано ниже.

В этом сценарии аварийного восстановления рабочая ферма SharePoint Server находится в локальной среде, а ферма восстановления — в Azure. Вы также можете адаптировать указания из этой статьи для других сценариев аварийного восстановления.

Элементы решения "горячего" резервирования в Azure

Элементы решения теплого резервирования в Azure

На этом рисунке:

  • Две среды показаны параллельно: локальная ферма SharePoint и ферма восстановления (резервная) в Azure.

  • Каждая среда содержит общий файловый ресурс.

  • Доставка журналов используется для копирования журналов со вторичного сервера баз данных в локальной среде в локальный общий ресурс.

  • DFSR копирует файлы из общего ресурса в локальной среде в общий ресурс в среде Azure. При использовании глобальной сети функция DFSR более эффективна, чем прямая доставка журналов на вторичный сервер в Azure.

  • Доставка журналов воспроизводит журналы из общего ресурса в среде Azure в первичной реплике группе доступности AlwaysOn SQL Server в среде восстановления.

  • Базы данных с доставкой журналов присоединяются к ферме SharePoint Server только после восстановления.

На следующем рисунке показаны семь этапов, включенных в полный процесс аварийного восстановления SharePoint Server в решении Azure. Этап 6, "Настройка доставки журналов в ферму восстановления", выделен на рисунке и описывается в следующих разделах.

План решения для аварийного восстановления

В этой статье

  • Использование доставки журналов для аварийного восстановления

  • Рекомендации по производительности

  • Необходимые компоненты для настройки доставки журналов

  • Инфраструктура доставки журналов

  • Действия, необходимые для настройки и проверки доставки журналов

Использование доставки журналов для аварийного восстановления

Доставка журналов позволяет автоматически отправлять файлы журналов транзакций для баз данных с первичного экземпляра сервера баз данных во вторичный экземпляр. В тестовой локальной среде мы используем группы доступности AlwaysOn с двумя репликами для обеспечения высокого уровня доступности. Мы настроили доставку журналов на обеих репликах. Каждая из них должна доставлять журналы транзакций. Только активная реплика, которой принадлежит база данных, может отправлять журналы. Но если произойдет сбой и вторичная реплика станет активной, доставлять журналы транзакций будет она.

После получения журналов транзакций в среде Azure они восстанавливаются по одной в каждой базе данных SharePoint на вторичном сервере баз данных. Дополнительные сведения о тестовой среде см. в разделе Экспериментальная среда Майкрософт.

Примечание

Некоторые организации используют третий сервер баз данных в качестве монитора для записи журнала и состояния операций резервного копирования и восстановления. Этот сервер создает оповещения при сбое резервного копирования.

Подробные сведения о доставке журналов можно найти в статьях, перечисленных в следующей таблице.

Таблица. Справочные статьи о доставке журналов

URL-адрес Описание

Сведения о доставке журналов (SQL Server)

Описание резервных копий журналов транзакций и доступных параметров.

Настройка доставки журналов (SQL Server)

Описание настройки доставки журналов в SQL Server 2012 с помощью SQL Server Management Studio или Transact-SQL.

Просмотр отчета о доставке журналов (SQL Server Management Studio)

Описание просмотра отчета о состоянии доставки журнала транзакций в SQL Server Management Studio. Отчет о состоянии можно запустить на сервере мониторинга, первичном или вторичном сервере.

Рекомендации по производительности

Доставка журналов состоит из трех заданий. Каждое из них выполняет одну из следующих операций:

  1. Резервное копирование журнала транзакций на первичном экземпляре сервера.

  2. Копирование файла журнала транзакций на вторичный экземпляр сервера.

  3. Восстановление резервной копии журнала на вторичном экземпляре сервера.

Каждое задание запускается по расписанию и выполняется в течение определенного интервала, что может значительно повлиять на производительность сервера баз данных и, по умолчанию, фермы SharePoint.

Чтобы правильно настроить интервалы заданий резервного копирования, копирования и восстановления для доставки журналов, необходимо проанализировать объем передаваемых данных. На него влияет ежедневный объем обмена данных в базах данных контента. Процент изменений может сильно колебаться в зависимости от контента, изменений обслуживания и пиков использования.

Чтобы получить точное процентное отношение изменений, рассчитайте сумму всех изменений в резервных копиях журнала транзакций для каждой базы данных контента, для которой осуществляется доставка журнала, за данный интервал. Используйте это значение для расчета процента изменений по сравнению с первичной базой данных.

Приведенные ниже рекомендации основаны на опыте доставки журналов, которым поделись специалисты Майкрософт, работавшие с несколькими выпусками SharePoint Server.

  • Избегайте падения производительности при одновременном запуске всех заданий, убедившись, что все задания доставки журналов выполняются по крайней мере с минутной задержкой после предыдущего задания.

  • Лучше создавать резервные копии и копировать множество небольших журналов транзакций, чем несколько крупных журналов.

  • Запланируйте резервное копирование и копирование журналов через короткие интервалы. Восстанавливать журналы транзакций можно реже. Например, начните с 5-минутного интервала копирования (в том числе резервного) и 15-минутного интервала восстановления.

Необходимые компоненты для настройки доставки журналов

Убедитесь, что соблюдаются указанные ниже предварительные требования для использования доставки журналов в решении аварийного восстановления.

  • Имена входа для SQL Server — это учетные записи домена с уровнями разрешений, необходимыми для доставки разрешений. Для использования хранимых процедур доставки журнал требуется членство в предопределенной роли сервера sysadmin.

  • Первичная база данных должна использовать модель полного восстановления или модель восстановления с неполным протоколированием.

    Предупреждение

    При переходе на простую модель восстановления базы данных доставка журналов перестанет работать.

  • Перед настройкой доставки журналов необходимо создать общий ресурс, чтобы предоставить вторичному серверу доступ к резервным копиям журналов транзакций. В этом общем ресурсе будут создаваться резервные копии журналов транзакций.

В дополнение к целевым точкам восстановления (RPO), убедитесь, что восстановленные данные фермы полны и не повреждены, насколько это возможно. Для достижения этих целей необходимо тщательно спланировать каждый аспект доставки журналов.

Инфраструктура доставки журналов

На следующей схеме показана инфраструктура доставки журналов для нашей среды решения аварийного восстановления.

Инфраструктура и потоки данных доставки журналов

Показывает инфраструктуру доставки журналов и направленный поток между локальной фермой и фермой Azure.

На предыдущей схеме показана инфраструктура и поток данных доставки журналов. На ней представлены серверы баз данных SQL Server и файловые серверы в производственной ферме и ферме восстановления Azure. Эти фермы практически идентичны, каждая из них содержит первичную и вторичную реплику для каждой группы доступности AlwaysOn. Файловые серверы FIL1 и AZ-FIL1 настроены одинаково, при этом совпадают число жестких дисков и размеры дисков. Дополнительные серверы фермы не показаны.

Чтобы обеспечить высокий уровень доступности, каждая реплика в группе доступности хранит резервную копию (полные и разностные журналы, а также журналы транзакций) другой реплики.

Первичная и вторичная реплики (SQL-HA1 и SQL-HA2 соответственно) создают резервные копии, которые хранятся в партнерской реплике в группе доступности.

Доставка журналов транзакций настроена на вторичной реплике для снижения влияния резервных копий на производственные базы данных. Эти журналы транзакций записываются в общую папку на локальном файлов сервере (FIL1). Служба репликации распределенной файловой системы (DFS) Windows Server копирует журналы транзакций с FIL1 в AZ-FIL1. Журналы транзакций на AZ-FIL1 восстанавливаются в AZ-SQL-HA1, первичной реплике группы доступности в ферме восстановления.

Действия, необходимые для настройки и проверки доставки журналов

Действия, необходимые для настройки, запуска и проверки доставки журналов кратко описаны в следующем списке.

  1. Резервное копирование базы данных.

    1. Настройте полное и разностное резервное копирование в локальную папку и общую папку на файловом сервере.

    2. Убедитесь, что резервные копии записаны в локальную папку и общую папку.

  2. Настройте и проверьте репликацию распределенной файловой системы (DFS).

    1. Создайте пространство имен и репликацию для передачи журналов транзакций и резервных копий между локальной фермой и фермой Azure с помощью общей папки на файловом сервере.

    2. Проверьте все операции передачи после выполнения доставки журналов.

  3. Настройте и проверьте доставку журналов.

    1. Настройте доставку журналов на первичном сервер баз данных с помощью следующего скрипта: 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]  ******
      
    2. Настройте доставку журналов на вторичном сервер баз данных с помощью следующего скрипта: 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 ******
      
    3. Убедитесь, что журналы транзакций доставляются в общий ресурс и что DFS реплицирует журналы в общую папку на файловом сервере Azure. Откройте монитор активности заданий в SQL Server, чтобы проверить успешность доставки журналов транзакций. Откройте общие папки на обоих файловых серверах в производственной ферме и ферме Azure, чтобы убедиться, что DFS передает журналы транзакций.

See also

Настройка групп доступности AlwaysOn SQL Server для SharePoint Server

Сведения о доставке журналов (SQL Server)
Руководства по репликации