Восстановление базы данных SQL Server с помощью приложения VDI с несколькими полосами может завершиться ошибкой 3456
Эта статья поможет устранить проблему, возникающую при использовании приложений на основе виртуального устройства (VDI) для восстановления баз данных SQL Server.
Симптомы
При восстановлении полной резервной копии интерфейса виртуальных устройств (VDI) в SQL Server 2019 или более поздней версии может возникнуть ошибка MSSQLSERVER_3456:
Msg 3456, Level 16, State 1, Line <LineNumber>
Could not redo log record (120600:18965748:1), for transaction ID (0:1527178398), on page (14:1987189), allocation unit 72057761533001728, database 'DB1_STRIPE' (database ID 8).
Page: LSN = (120598:23255372:8), allocation unit = 72057761317781504, type = 1. Log: OpCode = 6, context 2, PrevPageLSN: (120600:18965371:85).
Причина
При резервном копировании SQL Server в VDI передает данные в VDI через буфер. Затем VDI обрабатывает форматирование способа хранения этой резервной копии. Однако во многих случаях клиент VDI может ожидать только одну копию каждой страницы данных.
При чередовке резервной копии в VDI несколько устройств резервного копирования объединяют содержимое полной резервной копии. Данные записываются асинхронно, а порядок копирования данных обрабатывается логикой клиента VDI. Так как этап копирования данных является асинхронным, данные можно записать из порядка. Однако в полном сценарии резервного копирования до SQL Server 2019 существует только одна копия на страницу данных. Поэтому, когда клиент VDI отправляет данные в буфер, из которого SQL Server считывает данные для восстановления, SQL Server по-прежнему сможет точно знать, где и как восстановить каждую страницу данных. При вводе отложенного закрепления журнала в SQL Server 2019 в файлах резервной копии можно найти несколько копий страницы данных. Несколько копий существуют из-за мини-разностной резервной копии внутри полной резервной копии (дополнительные сведения см . в разделе "Дополнительные сведения "). Клиент VDI либо не ожидает нескольких копий одной и той же страницы данных, либо передает страницы данных обратно в SQL Server в неправильном порядке. Это поведение приводит к сбою восстановления. Ошибка 3456 Could not redo log record
указывает, что SQL Server пытается применить запись журнала, которая ожидает последнюю версию страницы данных, но находит старую версию.
Решение
В зависимости от конфигурации необходимо включить один или несколько флагов трассировки в качестве параметров запуска для экземпляра SQL Server:
Если вы выполняете полную резервную копию, когда экземпляр выступает в качестве первичной реплики или экземпляра без групп доступности, включите флаг трассировки 3471, чтобы отключить функцию закрепления журнала отложенного журнала для полного резервного копирования.
Если вы принимаете разностные резервные копии, когда экземпляр выступает в качестве первичной реплики или экземпляра без групп доступности, включите флаг трассировки 3475, чтобы отключить функцию закрепления журнала отложенного журнала для разностных резервных копий.
Если вы принимаете полные резервные копии с COPY_ONLY , когда экземпляр выступает в качестве вторичной реплики, включите флаг трассировки 3472, чтобы отключить функцию закрепления журнала отложенного журнала для разностных резервных копий.
Перезапуск SQL Server.
Снова создайте полные или разностные резервные копии.
Примечание.
Вы также можете временно включить эти флаги трассировки с помощью команды DBCC TRACEON .
DBCC TRACEON(3471,3472,3475,-1)
Эту команду можно использовать для устранения проблемы, если вы не сможете немедленно перезапустить экземпляр SQL Server.
Внимание
Из-за этой проблемы существующие резервные копии могут быть не восстановлены, если выполняются следующие условия:
- Резервное копирование выполняется с включенной функцией закрепления журнала задержки.
- Средство резервного копирования использует VDI.
- Резервное копирование выполняется с помощью нескольких полос (резервное копирование до нескольких файлов).
Мы рекомендуем восстановить существующие резервные копии на тестовом сервере, чтобы убедиться, что они могут быть успешно восстановлены.
Дополнительная информация
SQL Server 2019 представляет функцию, называемую задержкой закрепления журнала. Перед введением этой функции во время полной резервной копии базы данных SQL Server блокирует любые транзакции (закрепляет журнал), копирует данные и журнал, а затем удаляет пин-код прямо в начале. При наличии функции SQL Server задерживает транзакции от выполнения (закрепляет журнал) к концу длительности резервного копирования, а не прямо в начале. Эта функция предназначена для предотвращения полной проблемы журнала транзакций (MSSQLSERVER_9002 ошибки) во время полной резервной копии, которая занимает много времени. Так как закрепление журнала отложено, транзакции по-прежнему могут применяться к страницам данных базы данных во время резервного копирования. SQL Server поддерживает растровое изображение, чтобы определить страницы, которые изменились с момента начала текущей полной резервной копии, чтобы они могли выполнять мини-разностную резервную копию. Таким образом, он получает обновленную копию каждой страницы данных, которая была изменена при резервном копировании всей базы данных. Это приводит к дополнительной копии некоторых страниц данных. Кроме того, создается дополнительный раздел полной резервной копии.