Настройка доставки журналов (Log Shipping) для теплого резерва в MSSQL
Необходимость организации отказоустойчивой архитектуры Disaster Recovery с минимальным бюджетом:
- Отсутствие редакции Enterprise для AlwaysOn и невозможность покупки одинакового оборудования под синхронный кластер;
- Необходимость иметь теплую копию базы с задержкой восстановления (например, отставание на 2 часа для защиты от ошибочного удаления данных);
- Снятие тяжелой аналитической нагрузки на сервер отчетов в режиме Standby.
1. Архитектура и компоненты Log Shipping
Доставка журналов состоит из трех независимых заданий Агента SQL Server:
- Backup Job: Делает бэкап лога на основном сервере (Primary);
- Copy Job: Копирует файлы логов по сети на резервный сервер (Secondary);
- Restore Job: Накатывает скопированные логи на резервную базу;
- Alert Job: Опциональный монитор задержки на третьем сервере.
2. Подготовка сетевого хранилища
Создайте две общие папки с правами на запись для учетных записей SQL Server Agent:
\\primary-server\LogShippingBackup(Каталог на мастере);D:\LogShippingDestination(Локальный каталог на резервном сервере).
3. Конфигурация через T-SQL
Шаг 1: Первичный бэкап и инициализация базы на Secondary
BACKUP DATABASE [ERP_1C] TO DISK = N'\\primary-server\LogShippingBackup\ERP_1C_init.bak' WITH FORMAT;
-- Восстановление на Secondary в режиме NORECOVERY или STANDBY
RESTORE DATABASE [ERP_1C]
FROM DISK = N'\\primary-server\LogShippingBackup\ERP_1C_init.bak'
WITH NORECOVERY, REPLACE;Шаг 2: Настройка Log Shipping на Primary сервере
EXEC msdb.dbo.sp_add_log_shipping_primary_database
@database = N'ERP_1C',
@backup_directory = N'\\primary-server\LogShippingBackup',
@backup_share = N'\\primary-server\LogShippingBackup',
@backup_job_name = N'LSBackup_ERP_1C',
@backup_retention_period = 4320;Шаг 3: Настройка Secondary сервера
EXEC msdb.dbo.sp_add_log_shipping_secondary_database
@primary_server = N'PRIMARY-SQL',
@primary_database = N'ERP_1C',
@secondary_database = N'ERP_1C',
@restore_delay = 0, -- Задержка накатки в минутах (0 для максимальной скорости)
@restore_mode = 1, -- 0 = NORECOVERY, 1 = STANDBY (доступно для чтения)
@disconnect_users = 1; -- Отключать пользователей при накатке лога Частые вопросы (FAQ)
В чем разница между режимами NORECOVERY и STANDBY на secondary сервере?
В режиме NORECOVERY база постоянно недоступна для пользователей и ожидает накатки логов. В режиме STANDBY база открыта в режиме Read-Only между восстановлениями логов, что позволяет строить по ней отчеты.
Что происходит при накатке нового лога, если к STANDBY базе подключены пользователи?
Если включен параметр @disconnect_users = 1, SQL Server принудительно завершит пользовательские сессии для восстановления лога. Если параметр выключен, задание Restore Job завершится ошибкой и повторит попытку по расписанию.
Поддерживается ли Log Shipping в бесплатной редакции SQL Server Express?
База в редакции Express может выступать в роли Secondary (приемника), но не может быть Primary (источником), так как в Express отсутствует служба SQL Server Agent.
Как выполнить ручной переход на резервный сервер (Manual Failover)?
Снимите финальный Tail-Log на Primary, скопируйте и восстановите его на Secondary с параметром WITH RECOVERY. База станет полностью доступна на запись.