Настройка доставки журналов в 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
На этом рисунке:
Две среды показаны параллельно: локальная ферма SharePoint и ферма восстановления (резервная) в Azure.
Каждая среда содержит общий файловый ресурс.
Доставка журналов используется для копирования журналов со вторичного сервера баз данных в локальной среде в локальный общий ресурс.
DFSR копирует файлы из общего ресурса в локальной среде в общий ресурс в среде Azure. При использовании глобальной сети функция DFSR более эффективна, чем прямая доставка журналов на вторичный сервер в Azure.
Доставка журналов воспроизводит журналы из общего ресурса в среде Azure в первичной реплике группе доступности AlwaysOn SQL Server в среде восстановления.
Базы данных с доставкой журналов присоединяются к ферме SharePoint Server только после восстановления.
На следующем рисунке показаны семь этапов, включенных в полный процесс аварийного восстановления SharePoint Server в решении Azure. Этап 6, "Настройка доставки журналов в ферму восстановления", выделен на рисунке и описывается в следующих разделах.
В этой статье
Использование доставки журналов для аварийного восстановления
Рекомендации по производительности
Необходимые компоненты для настройки доставки журналов
Инфраструктура доставки журналов
Действия, необходимые для настройки и проверки доставки журналов
Использование доставки журналов для аварийного восстановления
Доставка журналов позволяет автоматически отправлять файлы журналов транзакций для баз данных с первичного экземпляра сервера баз данных во вторичный экземпляр. В тестовой локальной среде мы используем группы доступности AlwaysOn с двумя репликами для обеспечения высокого уровня доступности. Мы настроили доставку журналов на обеих репликах. Каждая из них должна доставлять журналы транзакций. Только активная реплика, которой принадлежит база данных, может отправлять журналы. Но если произойдет сбой и вторичная реплика станет активной, доставлять журналы транзакций будет она.
После получения журналов транзакций в среде Azure они восстанавливаются по одной в каждой базе данных SharePoint на вторичном сервере баз данных. Дополнительные сведения о тестовой среде см. в разделе Экспериментальная среда Майкрософт.
Примечание
Некоторые организации используют третий сервер баз данных в качестве монитора для записи журнала и состояния операций резервного копирования и восстановления. Этот сервер создает оповещения при сбое резервного копирования.
Подробные сведения о доставке журналов можно найти в статьях, перечисленных в следующей таблице.
Таблица. Справочные статьи о доставке журналов
URL-адрес | Описание |
---|---|
Описание резервных копий журналов транзакций и доступных параметров. |
|
Описание настройки доставки журналов в SQL Server 2012 с помощью SQL Server Management Studio или Transact-SQL. |
|
Просмотр отчета о доставке журналов (SQL Server Management Studio) |
Описание просмотра отчета о состоянии доставки журнала транзакций в SQL Server Management Studio. Отчет о состоянии можно запустить на сервере мониторинга, первичном или вторичном сервере. |
Рекомендации по производительности
Доставка журналов состоит из трех заданий. Каждое из них выполняет одну из следующих операций:
Резервное копирование журнала транзакций на первичном экземпляре сервера.
Копирование файла журнала транзакций на вторичный экземпляр сервера.
Восстановление резервной копии журнала на вторичном экземпляре сервера.
Каждое задание запускается по расписанию и выполняется в течение определенного интервала, что может значительно повлиять на производительность сервера баз данных и, по умолчанию, фермы SharePoint.
Чтобы правильно настроить интервалы заданий резервного копирования, копирования и восстановления для доставки журналов, необходимо проанализировать объем передаваемых данных. На него влияет ежедневный объем обмена данных в базах данных контента. Процент изменений может сильно колебаться в зависимости от контента, изменений обслуживания и пиков использования.
Чтобы получить точное процентное отношение изменений, рассчитайте сумму всех изменений в резервных копиях журнала транзакций для каждой базы данных контента, для которой осуществляется доставка журнала, за данный интервал. Используйте это значение для расчета процента изменений по сравнению с первичной базой данных.
Приведенные ниже рекомендации основаны на опыте доставки журналов, которым поделись специалисты Майкрософт, работавшие с несколькими выпусками SharePoint Server.
Избегайте падения производительности при одновременном запуске всех заданий, убедившись, что все задания доставки журналов выполняются по крайней мере с минутной задержкой после предыдущего задания.
Лучше создавать резервные копии и копировать множество небольших журналов транзакций, чем несколько крупных журналов.
Запланируйте резервное копирование и копирование журналов через короткие интервалы. Восстанавливать журналы транзакций можно реже. Например, начните с 5-минутного интервала копирования (в том числе резервного) и 15-минутного интервала восстановления.
Необходимые компоненты для настройки доставки журналов
Убедитесь, что соблюдаются указанные ниже предварительные требования для использования доставки журналов в решении аварийного восстановления.
Имена входа для SQL Server — это учетные записи домена с уровнями разрешений, необходимыми для доставки разрешений. Для использования хранимых процедур доставки журнал требуется членство в предопределенной роли сервера sysadmin.
Первичная база данных должна использовать модель полного восстановления или модель восстановления с неполным протоколированием.
Предупреждение
При переходе на простую модель восстановления базы данных доставка журналов перестанет работать.
Перед настройкой доставки журналов необходимо создать общий ресурс, чтобы предоставить вторичному серверу доступ к резервным копиям журналов транзакций. В этом общем ресурсе будут создаваться резервные копии журналов транзакций.
В дополнение к целевым точкам восстановления (RPO), убедитесь, что восстановленные данные фермы полны и не повреждены, насколько это возможно. Для достижения этих целей необходимо тщательно спланировать каждый аспект доставки журналов.
Инфраструктура доставки журналов
На следующей схеме показана инфраструктура доставки журналов для нашей среды решения аварийного восстановления.
Инфраструктура и потоки данных доставки журналов
На предыдущей схеме показана инфраструктура и поток данных доставки журналов. На ней представлены серверы баз данных SQL Server и файловые серверы в производственной ферме и ферме восстановления Azure. Эти фермы практически идентичны, каждая из них содержит первичную и вторичную реплику для каждой группы доступности AlwaysOn. Файловые серверы FIL1 и AZ-FIL1 настроены одинаково, при этом совпадают число жестких дисков и размеры дисков. Дополнительные серверы фермы не показаны.
Чтобы обеспечить высокий уровень доступности, каждая реплика в группе доступности хранит резервную копию (полные и разностные журналы, а также журналы транзакций) другой реплики.
Первичная и вторичная реплики (SQL-HA1 и SQL-HA2 соответственно) создают резервные копии, которые хранятся в партнерской реплике в группе доступности.
Доставка журналов транзакций настроена на вторичной реплике для снижения влияния резервных копий на производственные базы данных. Эти журналы транзакций записываются в общую папку на локальном файлов сервере (FIL1). Служба репликации распределенной файловой системы (DFS) Windows Server копирует журналы транзакций с FIL1 в AZ-FIL1. Журналы транзакций на AZ-FIL1 восстанавливаются в AZ-SQL-HA1, первичной реплике группы доступности в ферме восстановления.
Действия, необходимые для настройки и проверки доставки журналов
Действия, необходимые для настройки, запуска и проверки доставки журналов кратко описаны в следующем списке.
Резервное копирование базы данных.
Настройте полное и разностное резервное копирование в локальную папку и общую папку на файловом сервере.
Убедитесь, что резервные копии записаны в локальную папку и общую папку.
Настройте и проверьте репликацию распределенной файловой системы (DFS).
Создайте пространство имен и репликацию для передачи журналов транзакций и резервных копий между локальной фермой и фермой Azure с помощью общей папки на файловом сервере.
Проверьте все операции передачи после выполнения доставки журналов.
Настройте и проверьте доставку журналов.
Настройте доставку журналов на первичном сервер баз данных с помощью следующего скрипта: 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] ******
Настройте доставку журналов на вторичном сервер баз данных с помощью следующего скрипта: 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 ******
Убедитесь, что журналы транзакций доставляются в общий ресурс и что DFS реплицирует журналы в общую папку на файловом сервере Azure. Откройте монитор активности заданий в SQL Server, чтобы проверить успешность доставки журналов транзакций. Откройте общие папки на обоих файловых серверах в производственной ферме и ферме Azure, чтобы убедиться, что DFS передает журналы транзакций.
See also
Настройка групп доступности AlwaysOn SQL Server для SharePoint Server
Сведения о доставке журналов (SQL Server)
Руководства по репликации