Fehler beim Wiederherstellen einer SQL Server-Datenbank mithilfe einer VDI-Anwendung mit Multi-Striping mit Fehler 3456
Dieser Artikel hilft Ihnen, ein Problem zu beheben, das auftritt, wenn Sie virtual Device Interface (VDI)-basierte Anwendungen verwenden, um Ihre SQL Server-Datenbanken wiederherzustellen.
Symptome
Wenn Sie die vollständige Sicherung einer multistripierten virtuellen Geräteschnittstelle (VDI) auf SQL Server 2019 oder höher wiederherstellen, wird möglicherweise der Fehler MSSQLSERVER_3456 angezeigt:
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).
Ursache
Wenn SQL Server mit VDI gesichert wird, werden Daten über einen Puffer an die VDI übergeben. Die VDI behandelt dann die Formatierung der Speicherung dieser Sicherung. In vielen Fällen erwartet der VDI-Client jedoch möglicherweise nur eine einzelne Kopie jeder Datenseite.
Wenn Sie eine Sicherung auf VDI entfernen, bilden mehrere Sicherungsgeräte zusammen den Inhalt einer vollständigen Sicherung. Die Daten werden asynchron geschrieben, und die Reihenfolge der Datenkopie wird von der Logik des VDI-Clients behandelt. Da die Datenkopiephase asynchron ist, können die Daten aus der Reihenfolge geschrieben werden. In einem vollständigen Sicherungsszenario vor SQL Server 2019 gibt es jedoch nur eine Kopie pro Datenseite. Wenn der VDI-Client Daten an den Puffer sendet, aus dem SQL Server für eine Wiederherstellung liest, wäre SQL Server also immer noch in der Lage, genau zu wissen, wo und wie jede Datenseite wiederhergestellt werden kann. Mit der Einführung der verzögerten Protokoll-Pinning in SQL Server 2019 können mehrere Kopien der Datenseite in den Sicherungsdateien gefunden werden. Mehrere Kopien sind aufgrund einer mini differenziellen Sicherung innerhalb der vollständigen Sicherung vorhanden (weitere Informationen finden Sie im Abschnitt "Weitere Informationen "). Der VDI-Client erwartet entweder nicht mehrere Kopien derselben Datenseite oder übergibt die Datenseiten in der falschen Reihenfolge an SQL Server. Dieses Verhalten verursacht den Wiederherstellungsfehler. Der Fehler 3456 Could not redo log record
gibt an, dass SQL Server versucht, einen Protokolldatensatz anzuwenden, der die neueste Version der Datenseite erwartet, aber eine ältere Version findet.
Lösung
Je nach Konfiguration müssen Sie ein oder mehrere Ablaufverfolgungskennzeichnungen als Startparameter für Ihre SQL Server-Instanz aktivieren:
Wenn Sie vollständige Sicherungen durchführen, wenn die Instanz als primäres Replikat oder als Instanz ohne Verfügbarkeitsgruppen fungiert, aktivieren Sie das Ablaufverfolgungskennzeichen 3471, um das Feature zum Anheften verzögerter Protokolle für vollständige Sicherungen zu deaktivieren.
Wenn Sie differenzielle Sicherungen durchführen, wenn die Instanz als primäres Replikat oder als Instanz ohne Verfügbarkeitsgruppen fungiert, aktivieren Sie das Ablaufverfolgungskennzeichen 3475, um das Feature zum verzögerten Anheften von Protokollen für differenzielle Sicherungen zu deaktivieren.
Wenn Sie vollständige Sicherungen mit COPY_ONLY durchführen, wenn die Instanz als sekundäres Replikat fungiert, aktivieren Sie das Ablaufverfolgungskennzeichen 3472, um das Feature zum verzögerten Anheften von Protokollen für differenzielle Sicherungen zu deaktivieren.
Starten Sie SQL Server neu.
Führen Sie Ihre vollständigen oder differenziellen Sicherungen erneut aus.
Notiz
Sie können diese Ablaufverfolgungskennzeichnungen auch vorübergehend mit dem BEFEHL DBCC TRACEON aktivieren.
DBCC TRACEON(3471,3472,3475,-1)
Dieser Befehl kann verwendet werden, um das Problem zu beheben, wenn Sie Ihre SQL Server-Instanz nicht sofort neu starten können.
Wichtig
Aufgrund dieses Problems können vorhandene Sicherungen möglicherweise nicht wiederhergestellt werden, wenn die folgenden Bedingungen zutreffen:
- Die Sicherung wird mit aktivierter Funktion zum Anheften des Verzögerungsprotokolls übernommen.
- Das Sicherungstool verwendet VDI.
- Die Sicherung erfolgt mithilfe von Multi-Striping (Sicherung bis zu mehreren Dateien).
Wir empfehlen Ihnen, Ihre vorhandenen Sicherungen auf einem Testserver wiederherzustellen, um zu überprüfen, ob sie erfolgreich wiederhergestellt werden können.
Weitere Informationen
SQL Server 2019 führt ein Feature namens verzögertes Anheften von Protokollen ein. Vor der Einführung dieses Features blockiert SQL Server während einer vollständigen Datenbanksicherung alle Transaktionen (heftet das Protokoll an), kopiert die Daten und das Protokoll und entfernt dann den Pin direkt am Anfang. Da das Feature vorhanden ist, verzögert SQL Server Transaktionen vom Ablauf (heftet das Protokoll) bis zum Ende der Sicherungsdauer, anstatt direkt am Anfang. Dieses Feature wurde entwickelt, um ein vollständiges Transaktionsprotokollproblem (MSSQLSERVER_9002 Fehler) während einer vollständigen Sicherung zu vermeiden, die lange Zeit in Anspruch nimmt. Da das Anheften des Protokolls verzögert wird, dürfen Transaktionen weiterhin auf die Datenseiten der Datenbank angewendet werden, während die Sicherung fortgesetzt wird. SQL Server verwaltet eine Bitmap, um die Seiten zu identifizieren, die seit der Startzeit der laufenden vollständigen Sicherung geändert wurden, sodass sie eine mini differenzielle Sicherung davon in Anspruch nehmen kann. Auf diese Weise wird eine aktualisierte Kopie jeder Datenseite angezeigt, die geändert wurde, während die gesamte Datenbank gesichert wird. Dies führt zu einer zusätzlichen Kopie einiger Datenseiten. Darüber hinaus wird dieser zusätzliche Abschnitt der vollständigen Sicherung erstellt.