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

ОБЛАСТЬ ПРИМЕНЕНИЯ:yes-img-132013 yes-img-162016 yes-img-192019 yes-img-seSubscription Edition no-img-sopSharePoint в Microsoft 365

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

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

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

Элементы решения

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

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

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

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

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

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

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

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

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

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

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

После получения журналов транзакций в среде 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. Эти фермы практически идентичны, и каждая из них содержит первичную и вторичную реплику для каждой Always On группы доступности. Файловые серверы FIL1 и AZ-FIL1 настроены одинаково, при этом совпадают число жестких дисков и размеры дисков. Дополнительные серверы фермы не показаны.

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

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

Доставка журналов транзакций настроена на вторичной реплике для снижения влияния резервных копий на производственные базы данных. Эти журналы транзакций записываются в общую папку на локальном файлов сервере (FIL1). Служба репликации распределенной файловой системы (DFS) Windows Server копирует журналы транзакций с 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 передает журналы транзакций.

См. также

Концепции

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

Другие ресурсы

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

Руководства по репликации