Настройка MS SQL Server Log Shipping для отказоустойчивости и DR

Когда основная база SQL Server выходит из строя в самый неподходящий момент, а бэкапы устарели, бизнес рискует потерять часы данных. Мы настраиваем Log Shipping — асинхронную репликацию журналов транзакций, которая создаёт резервную копию на втором сервере и позволяет быстро восстановить работу. Наша команда реализует проект под ключ: от аудита до настройки мониторинга, обеспечивая надёжное DR-решение без лишних затрат.
Часто задаваемые вопросы

Настройка MS SQL Server Log Shipping для репликации

Представьте: primary база вышла из строя в час пик, а бэкапы — от вчерашнего дня. Потеря данных — 12 часов. Альтернатива — Log Shipping. Асинхронная репликация transaction log с secondary сервера, где резервная копия обновляется каждые 15–30 минут. RPO — 15 минут, RTO — 5–10 минут на failover. Без лицензий Enterprise и дорогого оборудования.

Наши инженеры с 10+ летним опытом внедряют DR-решения для SQL Server, где бюджет на Always On AG или FCI отсутствует. Log Shipping — проверенный механизм, работающий с SQL Server 2000 и до последних версий. Принцип прост: primary сервер бэкапит transaction log, копирует файл на secondary, secondary восстанавливает его. Всё через SQL Server Agent jobs, без дополнительной инфраструктуры.

Почему Log Shipping — надежное решение для DR?

Log Shipping даёт экономию по сравнению с Always On AG: стоимость внедрения в 3–5 раз ниже, не требует Enterprise-лицензий и одинакового железа. При этом RPO 15–30 минут удовлетворяет большинство бизнес-требований. Асинхронность — компромисс: при аварии теряется последний незаархивированный интервал. Но это плата за бюджетность. Для критичных систем с нулевой потерей данных — Always On AG, но для типовых DR — Log Shipping оптимален.

Как это работает и где типично ломается

Три job'а: backup (на primary), copy (на secondary), restore (на secondary). Опционально — monitor server, который отслеживает отставание и алертит при проблемах.

Самая частая ошибка при самостоятельной настройке — backup job работает, copy job молчит, в Error Log на secondary: Cannot open backup device '\\PRIMARY\LogShipping\AppDB_20240315_0230.bak'. Operating system error 5. Диагностика — Access Denied на share. SQL Server Agent на secondary работает под учёткой без прав на UNC-путь primary. Мы решаем это настройкой share permissions или сменой сервисного аккаунта. Подобные кейсы — наш ежедневный опыт.

Документация Microsoft рекомендует использовать отдельную учётную запись для SQL Server Agent с минимальными правами на UNC-путь.

Пример скрипта мониторинга:

-- Проверка состояния log shipping после настройки
SELECT primary_server, primary_database, last_backup_file, last_backup_date,
       DATEDIFF(MINUTE, last_backup_date, GETDATE()) AS minutes_since_backup
FROM msdb.dbo.log_shipping_monitor_primary;

SELECT secondary_server, secondary_database, last_restored_file, last_restored_date,
       restore_threshold,
       DATEDIFF(MINUTE, last_restored_date, GETDATE()) AS minutes_since_restore
FROM msdb.dbo.log_shipping_monitor_secondary;

Как настроить Log Shipping с минимальным RPO?

Настройка через T-SQL — воспроизводимый подход. GUI в SSMS удобен для ознакомления, но для автоматизации — только скрипты.

На primary сервере инициализируем backup job:

-- На primary: настройка backup job
EXEC msdb.dbo.sp_add_log_shipping_primary_database
    @database = N'AppDB',
    @backup_directory = N'\\SQLPRIMARY\LogShipping',
    @backup_share = N'\\SQLPRIMARY\LogShipping',
    @backup_job_name = N'LSBackup_AppDB',
    @backup_retention_period = 4320,
    @backup_threshold = 60,
    @threshold_alert_enabled = 1,
    @history_retention_period = 5760,
    @backup_compression = 1,
    @primary_id = @LS_BackupJobId OUTPUT;

На secondary — copy и restore jobs:

-- На secondary: настройка copy + restore
EXEC msdb.dbo.sp_add_log_shipping_secondary_primary
    @primary_server = N'SQLPRIMARY',
    @primary_database = N'AppDB',
    @backup_source_directory = N'\\SQLPRIMARY\LogShipping',
    @backup_destination_directory = N'D:\LogShippingLocal',
    @copy_job_name = N'LSCopy_SQLPRIMARY_AppDB',
    @restore_job_name = N'LSRestore_SQLPRIMARY_AppDB',
    @file_retention_period = 4320,
    @secondary_id = @LS_Secondary OUTPUT;

EXEC msdb.dbo.sp_add_log_shipping_secondary_database
    @secondary_database = N'AppDB',
    @primary_server = N'SQLPRIMARY',
    @primary_database = N'AppDB',
    @restore_delay = 0,
    @restore_mode = 1,
    @disconnect_users = 0,
    @restore_threshold = 45,
    @threshold_alert_enabled = 1,
    @history_retention_period = 5760,
    @secondary_id = @LS_Secondary;

@restore_mode = 1 (STANDBY) разрешает чтение secondary между восстановлениями — удобно для отчётов. @restore_mode = 0 (NORECOVERY) даёт минимальный RTO при failover. @restore_delay — задержка применения логов. Защита от случайного DROP TABLE: ставим задержку 60 минут — есть час, чтобы остановить restore и вытащить данные.

Инициализация secondary базы

Перед запуском log shipping восстанавливаем полный бэкап primary на secondary в NORECOVERY:

-- На primary: полный бэкап
BACKUP DATABASE AppDB TO DISK = N'\\SQLPRIMARY\LogShipping\AppDB_init.bak' WITH COMPRESSION, STATS = 10;

-- На secondary: восстановление
RESTORE DATABASE AppDB FROM DISK = N'\\SQLPRIMARY\LogShipping\AppDB_init.bak' WITH NORECOVERY, MOVE 'AppDB' TO 'D:\SQLData\AppDB.mdf', MOVE 'AppDB_log' TO 'D:\SQLLog\AppDB_log.ldf', STATS = 10;

После этого запускаем jobs — они начнут копировать и применять transaction log файлы. Типовые сроки настройки: одна база — 1 день, несколько баз с monitor сервером — 2-3 дня, миграция — до 3 дней.

Switchover при failover

-- На secondary при failover:
-- 1. Применить все доступные логи вручную
RESTORE LOG AppDB FROM DISK = N'D:\LogShippingLocal\AppDB_last.trn' WITH NORECOVERY;
-- 2. Вывести базу в онлайн
RESTORE DATABASE AppDB WITH RECOVERY;
-- 3. Переключить connection string приложения на secondary сервер

Сравнение: Log Shipping vs Always On AG

Критерий Log Shipping Always On AG
Автоматический failover Нет Да
Readable secondary Только в STANDBY Да
Требования к лицензии Standard Enterprise
Стоимость внедрения Низкая Высокая
RPO 15-30 мин 0 (синхронный режим)
RTO при failover 5-10 мин (ручной) 30 сек (авто)

Типичные RPO/RTO в зависимости от конфигурации

Конфигурация RPO RTO Сложность настройки
Базовый Log Shipping (интервал 15 мин) 15 мин 10 мин Низкая
Log Shipping с задержкой (restore_delay=60) 75 мин 10 мин Средняя
Log Shipping + monitor сервер 15 мин 5 мин Средняя
Log Shipping + mirror (ручной failover) 0 (если синхронизирован) 5 мин Высокая
Расширенный скрипт проверки состояния
-- Детальный мониторинг отставания
SELECT db.name, ls.primary_database, ls.last_backup_date, ls.last_restored_date,
       DATEDIFF(MINUTE, ls.last_backup_date, GETDATE()) AS backup_age_min,
       DATEDIFF(MINUTE, ls.last_restored_date, GETDATE()) AS restore_age_min
FROM sys.databases db
JOIN msdb.dbo.log_shipping_monitor_primary ls ON db.name = ls.primary_database;

Что входит в работу

  • Аудит текущей инфраструктуры SQL Server
  • Настройка backup/copy/restore jobs
  • Конфигурация monitor сервера с алертами
  • Тестирование failover и switchback
  • Документация и Runbook по восстановлению
  • Обучение дежурной смены

Наши инженеры имеют сертификаты Microsoft и более 50 успешных проектов по Log Shipping. Получите консультацию — оценим вашу задачу и предложим оптимальную схему репликации.

Типичные ошибки при настройке

  • Неправильные права на UNC-путь (Access Denied)
  • Отсутствие NORECOVERY при инициализации secondary
  • Неверный restore_delay — данные могут быть потеряны при быстром failover
  • Игнорирование мониторинга отставания — проблема становится заметной только при аварии

Для исключения этих проблем свяжитесь с нами — мы настроим Log Shipping под ключ за 1-3 дня в зависимости от сложности.

Наши компетенции:

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1393
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1368
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    815
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1139