Przywracanie bazy danych programu SQL Server przy użyciu aplikacji VDI z wieloma paskami może zakończyć się niepowodzeniem z powodu błędu 3456
Ten artykuł ułatwia rozwiązanie problemu występującego podczas korzystania z aplikacji opartych na interfejsie urządzenia wirtualnego (VDI) w celu przywrócenia baz danych programu SQL Server.
Symptomy
Podczas przywracania pełnej kopii zapasowej interfejsu urządzenia wirtualnego (VDI) z wieloma paskami w programie SQL Server 2019 lub nowszym może wystąpić błąd 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).
Przyczyna
Gdy program SQL Server tworzy kopię zapasową do karty VDI, przekazuje dane do interfejsu VDI za pośrednictwem buforu. Następnie VDI obsługuje formatowanie sposobu przechowywania tej kopii zapasowej. Jednak w wielu przypadkach klient VDI może oczekiwać tylko jednej kopii każdej strony danych.
W przypadku usuwania kopii zapasowej z interfejsem VDI wiele urządzeń kopii zapasowych razem składa się z zawartości pełnej kopii zapasowej. Dane są zapisywane asynchronicznie, a kolejność kopiowania danych jest obsługiwana przez logikę klienta VDI. Ponieważ faza kopiowania danych jest asynchroniczna, dane mogą być zapisywane w kolejności. Jednak w scenariuszu tworzenia pełnej kopii zapasowej przed programem SQL Server 2019 istnieje tylko jedna kopia na stronę danych. W związku z tym, gdy klient VDI wysyła dane do buforu, z którego program SQL Server odczytuje dane na potrzeby przywracania, program SQL Server nadal będzie mógł wiedzieć dokładnie, gdzie i jak przywrócić każdą stronę danych. Wraz z wprowadzeniem opóźnionego przypinania dziennika w programie SQL Server 2019 w plikach kopii zapasowych może znajdować się wiele kopii strony danych. Istnieje wiele kopii z powodu mini różnicowej kopii zapasowej wykonywanej wewnątrz pełnej kopii zapasowej (zobacz sekcję Więcej informacji , aby uzyskać szczegółowe informacje). Klient VDI nie oczekuje wielu kopii tej samej strony danych lub przekazuje strony danych z powrotem do programu SQL Server w niewłaściwej kolejności. To zachowanie powoduje niepowodzenie przywracania. Błąd 3456 Could not redo log record
wskazuje, że program SQL Server próbuje zastosować rekord dziennika, który oczekuje najnowszej wersji strony danych, ale znajduje starszą wersję.
Rozwiązanie
W zależności od konfiguracji należy włączyć co najmniej jedną flagę śledzenia jako parametry uruchamiania dla wystąpienia programu SQL Server:
Jeśli wykonujesz pełne kopie zapasowe, gdy wystąpienie działa jako replika podstawowa lub wystąpienie bez grup dostępności, włącz flagę śledzenia 3471, aby wyłączyć opóźnioną funkcję przypinania dziennika dla pełnych kopii zapasowych.
Jeśli wykonujesz różnicowe kopie zapasowe, gdy wystąpienie działa jako replika podstawowa lub wystąpienie bez grup dostępności, włącz flagę śledzenia 3475, aby wyłączyć funkcję opóźnionego przypinania dziennika dla różnicowych kopii zapasowych.
Jeśli wykonujesz pełne kopie zapasowe z COPY_ONLY , gdy wystąpienie działa jako replika pomocnicza, włącz flagę śledzenia 3472, aby wyłączyć funkcję opóźnionego przypinania dziennika dla różnicowych kopii zapasowych.
Uruchom ponownie program SQL Server.
Ponownie wykonaj pełne lub różnicowe kopie zapasowe.
Uwaga 16.
Możesz również tymczasowo włączyć te flagi śledzenia za pomocą polecenia DBCC TRACEON .
DBCC TRACEON(3471,3472,3475,-1)
To polecenie może służyć do rozwiązania problemu, jeśli nie można natychmiast ponownie uruchomić wystąpienia programu SQL Server.
Ważne
Z powodu tego problemu istniejące kopie zapasowe mogą nie być przywracalne, jeśli spełnione są następujące warunki:
- Kopia zapasowa jest wykonywana z włączoną funkcją przypinania dziennika opóźnień.
- Narzędzie do tworzenia kopii zapasowych używa interfejsu VDI.
- Tworzenie kopii zapasowej odbywa się przy użyciu wielu pasków (tworzenie kopii zapasowej do kilku plików).
Zachęcamy do przywrócenia istniejących kopii zapasowych na serwerze testowym, aby sprawdzić, czy można je pomyślnie przywrócić.
Więcej informacji
Program SQL Server 2019 wprowadza funkcję o nazwie opóźnione przypinanie dziennika. Przed wprowadzeniem tej funkcji podczas tworzenia pełnej kopii zapasowej bazy danych program SQL Server blokuje wykonywanie wszelkich transakcji (przypina dziennik), kopiuje dane i dziennik, a następnie usuwa numer PIN bezpośrednio na początku. W przypadku obecnej funkcji program SQL Server opóźnia transakcje z powodu wystąpienia (przypina dziennik) do końca czasu tworzenia kopii zapasowej, a nie bezpośrednio na początku. Ta funkcja została zaprojektowana tak, aby uniknąć pełnego problemu z dziennikiem transakcji (MSSQLSERVER_9002 błędem) podczas pełnej kopii zapasowej, która zajmuje dużo czasu. Ponieważ przypinanie dziennika jest opóźnione, transakcje nadal mogą być stosowane do stron danych bazy danych podczas tworzenia kopii zapasowej. Program SQL Server utrzymuje mapę bitową w celu zidentyfikowania stron, które uległy zmianie od czasu rozpoczęcia trwającej pełnej kopii zapasowej, dzięki czemu może wykonać mini różnicową kopię zapasową. W ten sposób pobiera zaktualizowaną kopię każdej strony danych, która została zmieniona podczas tworzenia kopii zapasowej całej bazy danych. Powoduje to dodatkową kopię niektórych stron danych. Ponadto jest tworzona dodatkowa sekcja pełnej kopii zapasowej.