При обслуживании баз данных 1С на платформе MS SQL Server администраторы часто сталкиваются с ситуацией, когда стандартная процедура восстановления из полного и дифференциального (разностного) бэкапа завершается ошибкой. Сообщение «Невозможно восстановить журнал или разностную резервную копию, так как нет файлов, готовых к накату (Microsoft.SqlServer.SmoExtended)» или Ошибка 3136 указывает на критическое нарушение логики резервного копирования. В рамках этой статьи мы подробно разберем, почему это происходит и как правильно организовать процесс восстановления.
Для начала проанализируем ситуацию. SQL Server использует так называемые LSN (Log Sequence Number) — регистрационные номера последовательности транзакций. Каждый дифференциальный бэкап «привязан» к конкретной полной резервной копии через эти номера. Разберем по шагам, что происходит в момент возникновения ошибки:
В итоге, когда мы пытаемся накатить дифференциальный бэкап понедельника на полный бэкап воскресенья, SQL Server видит, что между ними была другая база (другая опорная точка), и выдает ошибку: «Разностная резервная копия не была восстановлена в более раннем состоянии».
Выясним причину разрыва цепочки с помощью технических средств. Для этого нам понадобится команда RESTORE HEADERONLY. Рассмотрим пример кода, который поможет нам увидеть внутренние параметры файлов бэкапа:
RESTORE HEADERONLY FROM DISK = 'E:\Backups\Full_Base.bak';
RESTORE HEADERONLY FROM DISK = 'E:\Backups\Diff_Base.bak';
Проанализируем вывод команды, обратив внимание на следующие поля:
CheckpointLSN того полного бэкапа, который вы используете для восстановления.Если эти цифры различаются — цепочка разорвана. Это значит, что между вашим полным и разностным архивами «вклинился» еще один полный бэкап.
Посмотрим на типичные сценарии, которые приводят к этой ошибке:
Рассмотрим, как правильно делать дополнительные или внеплановые бэкапы, чтобы не ломать цепочку восстановления. Для этого в MS SQL Server существует параметр COPY_ONLY (Только копирование).
Когда вы делаете резервную копию с этим флагом, SQL Server сохраняет текущее состояние базы, но не меняет LSN-метку для будущих дифференциальных бэкапов. Они по-прежнему будут «считать» своим родителем предыдущий стандартный полный бэкап.
Пример правильной команды для внепланового полного бэкапа:
BACKUP DATABASE [ВашаБаза]
TO DISK = 'E:\Backup\Full_Manual_Copy.bak'
WITH COPY_ONLY, STATS = 10;
Если вы используете План обслуживания (Maintenance Plan), изучите инструкцию по настройке регламентных операций и обязательно найдите в настройках задачи резервного копирования галочку «Копировать только резервную копию» (Copy-only backup).
Если у вас есть правильная цепочка файлов, разберем по шагам, как выполнить восстановление через T-SQL (это надежнее, чем через графический интерфейс SSMS):
RESTORE DATABASE [ИмяБазы]
FROM DISK = 'E:\Backups\Full_Base.bak'
WITH NORECOVERY, REPLACE;
WITH RECOVERY, чтобы база стала доступной для пользователей.
RESTORE DATABASE [ИмяБазы]
FROM DISK = 'E:\Backups\Diff_Base.bak'
WITH RECOVERY;
Рассмотрим еще несколько важных нюансов:
Расширения файлов: Не путайте расширения .bak, .dif или .trn. Для SQL Server это всего лишь текстовые метки. Вы можете назвать разностный бэкап как угодно, его тип определяется только внутренним заголовком. Однако для удобства администрирования лучше придерживаться стандартов.
Модель восстановления: Если у вас Simple (Простая) модель, вы ограничены только схемой «Полный + Дифференциальный». Если модель Full (Полная), вам также придется следить за цепочкой логов транзакций (Transaction Logs). Принцип LSN там работает аналогично — каждый следующий лог должен иметь FirstLSN, равный LastLSN предыдущего.
Проверка целостности: Рекомендуем периодически проверять возможность восстановления без фактического наката данных командой RESTORE VERIFYONLY. Это позволит заранее узнать, не повреждена ли цепочка LSN в ваших текущих планах обслуживания.
Таким образом, мы выяснили, что ключ к стабильному восстановлению баз данных 1С — это строгое соблюдение последовательности LSN и использование режима COPY_ONLY для любых бэкапов, которые не входят в основной цикл обслуживания.