При работе с планами обслуживания в MS SQL Server часто возникают ситуации, когда стандартный процесс восстановления базы данных завершается ошибкой из-за нарушения «цепочки» LSN (Log Sequence Number). Давайте разберем, что такое цепочка LSN, почему она прерывается и как правильно настроить процесс восстановления, чтобы избежать потери данных.
Цепочка резервных копий журнала транзакций — это непрерывная последовательность файлов бэкапа, которые охватывают временной отрезок от последней полной или дифференциальной копии до момента восстановления. Каждый бэкап лога содержит информацию о номере транзакции, на котором закончился предыдущий бэкап. Если в этой последовательности образуется «пропуск» или происходит разрыв, сервер не может гарантировать целостность данных, так как транзакции становятся не связанными друг с другом.
Рассмотрим ситуации, из-за которых возникают проблемы с восстановлением:
WITH COPY_ONLY, который создает резервную копию без включения её в основную последовательность LSN.FULL в модель SIMPLE и обратно мгновенно разрывает цепочку логов. После возврата к FULL необходимо в обязательном порядке создать новый полный бэкап базы.Частой ошибкой является попытка «накатить» все имеющиеся дифференциальные бэкапы подряд. SQL Server работает иначе. Чтобы успешно восстановить базу, следуйте этой последовательности:
Важно помнить, что цепочка логов должна быть абсолютно непрерывной. Проверьте, нет ли смены модели восстановления или сторонних процессов, которые могут усекать журнал (например, через BACKUP LOG … WITH TRUNCATE_ONLY в старых версиях).
Если вы столкнулись с ошибкой, проанализируйте системные таблицы msdb.dbo.backupset и msdb.dbo.backupmediafamily. В них хранится история всех операций. Вы можете сравнить значения first_lsn и last_lsn для соседних файлов бэкапа логов. Если last_lsn одного файла не совпадает с first_lsn следующего — вы нашли место разрыва.
Помните, что использование параметра WITH CONTINUE_AFTER_ERROR при восстановлении поврежденных цепочек крайне опасно, так как это не исправляет саму базу данных, а лишь принудительно заставляет сервер «проглотить» поврежденные участки журнала, что практически гарантированно приведет к логической порче данных внутри базы.
Мы рекомендуем придерживаться следующего правила: если вы хотите создавать дополнительные копии для нужд разработки или тестирования, всегда используйте скрипт с указанием COPY_ONLY, чтобы основной план обслуживания оставался «невидимым» для этих действий и сохранял непрерывность вашей рабочей цепочки:
BACKUP LOG [ИмяБазы]
TO DISK = 'C:\Backups\ManualBackup.trn'
WITH COPY_ONLY;
Следуя этим простым шагам, вы сможете обеспечить надежное восстановление данных и избежать неприятных сюрпризов при критических сбоях.