Sql Server-Diagnose erkennt nicht gemeldete E/A-Probleme aufgrund veralteter Lesevorgänge oder verlorener Schreibvorgänge
In diesem Artikel wird erläutert, wie die SQL Server-Diagnose hilft, nicht gemeldete Eingabe- oder Ausgabeprobleme zu erkennen, die aufgrund veralteter Lesevorgänge oder verlorener Schreibvorgänge auftreten.
Ursprüngliche Produktversion: SQL Server
Ursprüngliche KB-Nummer: 826433
Problembeschreibung
Wenn Betriebssystem-, Treiber- oder Hardwareprobleme zu verlorenen Schreib- oder veralteten Lesebedingungen im E/A-Pfad führen, werden möglicherweise Fehlermeldungen zur Datenintegrität angezeigt, z. B. Fehler 605, 823, 3448 und 3456 in SQL Server. Möglicherweise erhalten Sie Fehlermeldungen, die den folgenden Beispielen ähneln:
2003-07-24 16:43:04.57 spid63 Getpage: bstat=0x9, sstat=0x800, cache
2003-07-24 16:43:04.57 spid63 pageno is/should be: objid is/should be:
2003-07-24 16:43:04.57 spid63 (1:7040966)/(1:7040966) 2093354622/2039782424
2003-07-24 16:43:04.57 spid63 ... IAM indicates that page is allocated to this object
2003-07-24 16:52:37.67 spid63 Error: 605, Severity: 21, State: 1
2003-07-24 16:52:37.67 spid63 Attempt to fetch logical page (1:7040966) in database 'pubs' belongs to object 'authors', not to object 'titles'..
2003-07-24 16:52:40.99 spid63 Error: 3448, Severity: 21, State: 1
2003-07-24 16:52:40.99 spid63 Could not undo log record (63361:16876:181), for transaction ID (0:159696956), on page (1:7040977), database 'pubs' (database ID 12). Page information: LSN = (63192:958360:10), type = 2. Log information: OpCode = 2, context 1..
2003-07-09 14:31:35.92 spid66 Error: 823, Severity: 24, State: 2
2003-07-09 14:31:35.92 spid66 I/O error (bad page ID) detected during read at offset 0x00000016774000 in file 'h:\sql\MSSQL\data\tempdb.mdf'..
2010-02-06 15:57:24.14 spid17s Error: 3456, Severity: 21, State: 1.
2010-02-06 15:57:24.14 spid17s Could not redo log record (58997:5252:28), for transaction ID (0:109000187), on page (1:480946), database 'MyDatabase' (database ID 17). Page: LSN = (58997:5234:17), type = 3. Log: OpCode = 2, context 5, PrevPageLSN: (58997:5243:17). Restore from a backup of the database, or repair the database.
Neue E/A-Diagnosefunktionen in SQL Server
SQL Server hat ab SQL Server 2000 Service Pack 4 neue E/A-Diagnosefunktionen eingeführt, und diese Diagnosen sind seitdem Teil des Produkts. Diese Funktionen dienen dazu, externe E/A-Probleme zu erkennen und die im Abschnitt "Symptome " beschriebenen Fehlermeldungen zu beheben.
Wenn Sie eine der Fehlermeldungen erhalten, die im Abschnitt "Symptome" aufgeführt sind und von einem Ereignis wie einem physischen Laufwerksfehler nicht erläutert werden, überprüfen Sie alle bekannten Probleme mit SQL Server, dem Betriebssystem, den Treibern und der Hardware. Die Diagnose versucht, Informationen zu den folgenden beiden Bedingungen bereitzustellen:
Verlorener Schreibzugriff: Ein erfolgreicher Aufruf der WriteFile-API, aber das Betriebssystem, ein Treiber oder der Cachecontroller löscht die Daten nicht ordnungsgemäß auf die physischen Medien, obwohl SQL Server informiert wurde, dass der Schreibvorgang erfolgreich war.
Veraltetes Lesen: Ein erfolgreicher Aufruf der ReadFile-API, aber das Betriebssystem, ein Treiber oder der Cachecontroller gibt fälschlicherweise eine ältere Version der Daten zurück.
Um zu veranschaulichen, hat Microsoft Szenarien bestätigt, in denen ein WriteFile-API-Aufruf einen Erfolgsstatus zurückgibt, aber ein sofortiges, erfolgreiches Lesen desselben Datenblocks gibt ältere Daten zurück, einschließlich Daten, die wahrscheinlich in einem Hardwarelesecache gespeichert sind. Manchmal tritt dieses Problem aufgrund eines Lesecacheproblems auf. In anderen Fällen werden die Schreibdaten nie auf den physischen Datenträger geschrieben.
Aktivieren der Diagnose
In SQL Server 2017 und höheren Versionen ist diese Diagnosefunktion standardmäßig aktiviert. In SQL Server 2016 und früheren Versionen können diese Diagnosen nur mithilfe des Ablaufverfolgungskennzeichnungs 818 aktiviert werden. Sie können das Ablaufverfolgungskennzeichnung 818 als Startparameter , -T818, für die SQL Server-Instanz angeben oder die folgende T-SQL-Anweisung ausführen, um sie zur Laufzeit zu aktivieren:
DBCC TRACEON(818, -1)
Ablaufverfolgungskennzeichnung 818 ermöglicht einen Speicherringpuffer, der zum Nachverfolgen der letzten 2.048 erfolgreichen Schreibvorgänge verwendet wird, die vom Computer ausgeführt werden, auf dem SQL Server ausgeführt wird, nicht einschließlich Sortier- und Arbeitsdatei-E/A. Wenn Fehler wie 605, 823 oder 3448 auftreten, wird der Wert der Protokollsequenznummer (Log Sequence Number, LSN) des eingehenden Puffers mit der zuletzt verwendeten Schreibliste verglichen. Wenn der während des Lesevorgangs abgerufene LSN älter als der im Schreibvorgang verwendete ist, wird eine neue Fehlermeldung im SQL Server-Fehlerprotokoll protokolliert. Die meisten SQL Server-Schreibvorgänge treten als Prüfpunkte oder als faule Schreibvorgänge auf (ein fauler Schreibvorgang ist eine Hintergrundaufgabe, die asynchrone E/A verwendet). Die Implementierung des Ringpuffers ist leicht und die Leistungswirkung auf das System ist vernachlässigbar.
Details zur Meldung im Fehlerprotokoll
Die folgende Meldung zeigt keine expliziten Fehler aus der WriteFile-API oder die ReadFile-API an, die SQL Server aufruft. Stattdessen wird ein logischer E/A-Fehler angezeigt, der beim Überprüfen des LSN aufgetreten ist und der erwartete Wert nicht korrekt war:
Ab SQL Server 2005 wird die angezeigte Fehlermeldung wie folgt angezeigt:
SQL Server hat einen logischen Konsistenz-basierten E/A-Fehler erkannt: Veraltetes Lesen. Es ist während einer
<Read/Write>
Seite<PAGEID>
in der Datenbank-ID<DBID>
beim Offset<PHYSICAL OFFSET>
in der Datei<FILE NAME>
aufgetreten. Weitere Informationen finden Sie möglicherweise in anderen Fehlermeldungen im SQL Server-Fehlerprotokoll oder im Systemereignisprotokoll. Dies ist ein schwerer Fehler, der die Datenbankintegrität bedroht und sofort behoben werden muss. Führen Sie eine vollständige Datenbankkonsistenzprüfung (DBCC CHECKDB) aus. Dieser Fehler kann durch viele Faktoren verursacht werden. Weitere Informationen finden Sie in der SQL Server-Onlinedokumentation.
Weitere Informationen zu Fehler 824 finden Sie unter MSSQLSERVER_824.
An der Stelle oder meldung dieses Fehlers enthält der Lesecache entweder eine ältere Version der Seite, oder die Daten wurden nicht ordnungsgemäß auf den physischen Datenträger geschrieben. In beiden Fällen (verlorene Schreibvorgänge oder veraltete Lesevorgänge) meldet SQL Server ein externes Problem mit dem Betriebssystem, dem Treiber oder den Hardwareebenen.
Wenn Fehler 3448 auftritt, wenn Sie versuchen, eine Transaktion mit Fehler 605 oder 823 zurückzuziehen, schließt die SQL Server-Instanz die Datenbank automatisch und versucht, sie zu öffnen und wiederherzustellen. Die erste Seite, auf der Fehler 605 oder 823 auftritt, wird als ungültige Seite betrachtet, und die Seiten-ID wird vom Computer mit SQL Server aufbewahrt. Während der Wiederherstellung (vor der Redo-Phase) beim Lesen der ungültigen Seiten-ID werden die primären Details zum Seitenheader im SQL Server-Fehlerprotokoll protokolliert. Diese Aktion ist wichtig, da sie dabei hilft, zwischen Lost Write- und Stale Read-Szenarien zu unterscheiden.
Verhalten bei veralteten Lesevorgängen und verlorenen Schreibvorgängen
In veralteten Leseszenarien werden möglicherweise die folgenden beiden gängigen Verhaltensweisen angezeigt:
Wenn die Datenbankdateien geschlossen und dann geöffnet werden, werden die richtigen und zuletzt geschriebenen Daten während der Wiederherstellung zurückgegeben.
Wenn Sie einen Prüfpunkt ausstellen und die
DBCC DROPCLEANBUFFERS
Anweisung ausführen (um alle Datenbankseiten aus dem Arbeitsspeicher zu entfernen), und führen Sie dann dieDBCC CHECKDB
Anweisung für die Datenbank aus, werden die zuletzt geschriebenen Daten zurückgegeben.
Die im vorherigen Absatz erwähnten Verhaltensweisen deuten auf ein Problem mit der Lesezwischenspeicherung hin und werden häufig gelöst, indem der Lesecache deaktiviert wird. Die Aktionen, die im vorherigen Absatz beschrieben werden, erzwingen in der Regel eine Ungültigung des Caches und die erfolgreichen Lesevorgänge, die auftreten, zeigen, dass die physischen Medien ordnungsgemäß aktualisiert werden. Das Verhalten des verlorenen Schreibvorgangs tritt auf, wenn die zurückgelesene Seite weiterhin die ältere Version der Daten ist, auch nach einem erzwungenen Leeren der Zwischenspeicherungsmechanismen.
Manchmal ist das Problem möglicherweise nicht spezifisch für einen Hardwarecache. Es kann ein Problem mit einem Filtertreiber sein. Überprüfen Sie in solchen Fällen Ihre Software, einschließlich Sicherungshilfsprogramme und Antivirensoftware, und überprüfen Sie dann, ob Probleme mit dem Filtertreiber auftreten.
Beschreibung verschiedener veralteter Lese- und Verlorenschreibszenarien
Microsoft hat auch Bedingungen festgestellt, die die Kriterien für Fehler 605 oder 823 nicht erfüllen, aber durch dieselbe veraltete Lese- oder Verlorenschreibaktivität verursacht werden. In einigen Fällen wird eine Seite zweimal aktualisiert, jedoch mit demselben LSN-Wert. Dieses Verhalten kann auftreten, wenn die Objekt-ID und die Seiten-ID korrekt sind (Seite, die dem Objekt bereits zugeordnet ist), und eine Änderung an der Seite vorgenommen und auf den Datenträger geleert wird. Der Abruf der nächsten Seite gibt ein älteres Bild zurück, und dann wird eine zweite Änderung vorgenommen. Das SQL Server-Transaktionsprotokoll zeigt an, dass die Seite zweimal mit demselben LSN-Wert aktualisiert wurde. Diese Aktion wird zu einem Problem, wenn Sie versuchen, eine Transaktionsprotokollsequenz oder mit Datenkonsistenzproblemen wie Fremdschlüsselfehlern oder fehlenden Dateneinträgen wiederherzustellen. Die folgende Fehlermeldung veranschaulicht ein Beispiel für diese Bedingung:
Fehler: 3456, Schweregrad: 21, Status: 1 Protokolldatensatz konnte nicht wiederholt werden (276666:1664:19), für Transaktions-ID (0:825853240), auf Seite (1:1787100), Datenbank "Autoren" (7). Seite: LSN = (276658:4501:9), Typ = 1. Protokoll: OpCode = 4, Kontext 2, PrevPageLSN: (275565:3959:31)..
Einige Szenarien werden in den folgenden Listen ausführlicher beschrieben:
LSN SequenceAction
1 Checkpoint
2 Begin Transaction
3 Table created or truncated
4 Inserts (Pages allocated)
5 Newly allocated page written to disk by Lazy Writer
6 Select from table - Scans IAM chain, newly allocated page read back from disk (LRU | HASHED = 0x9 in getpage message), encounters Error 605 - Invalid Object ID
7 Rollback of transaction initiated
LSN SequenceAction
1 Checkpoint
2 Begin Transaction
3 Page Modification
4 Page written to disk by Lazy Writer
5 Page read in for another modification (stale image returned)
6 Page Modified for a second time but because of stale image does not see first modification
7 Rollback - Fails - Transaction Log shows two different log records with the same PREV LSN for the page
SQL Server-Operatoren sort
führen E/A-Aktivitäten aus, häufig in der tempdb
Datenbank. Diese E/A-Vorgänge ähneln den E/A-Puffervorgängen; Sie wurden jedoch bereits für die Verwendung von Lese-Wiederholungslogik entwickelt, um ähnliche Probleme zu beheben. Die in diesem Artikel erläuterte zusätzliche Diagnose gilt nicht für diese E/A-Vorgänge.
Microsoft hat festgestellt, dass die Ursache für die folgenden Sortierlesefehler im Allgemeinen ein veralteter Lesevorgang oder ein verlorener Schreibvorgang ist:
2003-04-01 20:13:31.38 spid122 SQL Server Assertion: File: <p:\sql\ntdbms\storeng\drs\include\record.inl>, line=1447 Failed Assertion = 'm_SizeRec > 0 && m_SizeRec <= MAXDATAROW'.
2003-03-29 09:51:41.12 spid57 Sort read failure (bad page ID). pageid = (0x1:0x13e9), dbid = 2, file = e:\program files\Microsoft SQL Server\mssql\data\tempdb.mdf. Retrying.
2003-03-29 09:51:41.13 spid57 Error: 823, Severity: 24, State: 7
2003-03-29 09:51:41.13 spid57 I/O error (bad page ID) detected during read at offset 0x000000027d2000 in file 'e:\program files\Microsoft SQL Server\mssql\data\tempdb.mdf'..
* 00931097 Module(sqlservr+00531097) (utassert_fail+000002E3)
* 005B1DA8 Module(sqlservr+001B1DA8) (RecBase::Resize+00000091)
* 00407EE7 Module(sqlservr+00007EE7) (RecBase::LocateColumn+00000012)
* 00852520 Module(sqlservr+00452520) (mergerow+000000A4)
* 008522B3 Module(sqlservr+004522B3) (merge_getnext+00000285)
* 0085207D Module(sqlservr+0045207D) (mergenext+0000000D)
* 004FC5FB Module(sqlservr+000FC5FB) (getsorted+00000021)
Da ein veraltetes Lesen oder verloren gegangene Schreibvorgänge zu einer nicht erwarteten Datenspeicherung führen, kann eine Vielzahl von Verhaltensweisen auftreten. Es kann als fehlende Daten erscheinen, aber einige der häufigeren Auswirkungen fehlender Daten werden als Indexbeschädigungen angezeigt, z. B. Fehler 644 oder 625:
Fehler 644 Schweregrad 21 Nachrichtentext Konnte den Indexeintrag für RID '%.*hs' auf der Indexseite %S_PGID, Index-ID %d, Datenbank '%.*ls' nicht finden.
Fehler 625 Schweregrad 21 Nachrichtentext Kann Zeile von Seite %S_PGID von RID nicht abrufen, da die Slotid (%d) ungültig ist.
Einige Kunden haben nach dem Ausführen von Zeilenzählungsaktivitäten fehlende Zeilen gemeldet. Dieses Problem tritt aufgrund eines verlorenen Schreibvorgangs auf. Vielleicht sollte die Seite mit der gruppierten Indexseitenkette verknüpft werden. Wenn der Schreibvorgang physisch verloren ging, gehen die Daten ebenfalls verloren.
Wichtig
Wenn Sie eins der Verhaltensweisen erleben oder ähnliche Probleme zusammen mit dem Deaktivieren von Zwischenspeicherungsmechanismen verdächtig sind, empfiehlt Microsoft dringend, das neueste Update für SQL Server zu erhalten. Microsoft empfiehlt außerdem dringend, dass Sie eine strenge Überprüfung Ihres Betriebssystems und der zugehörigen Konfigurationen durchführen.
Beachten Sie, dass Microsoft bestätigt hat, dass einige Hardwareplattformen unter seltenen und schweren E/A-Lasten einen veralteten Lesevorgang zurückgeben können. Wenn die erweiterte Diagnose eine mögliche veraltete Lese- oder Verlorenschreibbedingung angibt, wenden Sie sich an Ihren Hardwareanbieter, um die sofortige Nachverfolgung durchzuführen und mit dem SQLIOSim-Hilfsprogramm zu testen.
SQL Server erfordert Systeme, die die garantierte Übermittlung an stabile Medien unterstützen, wie unter den SQL Server-I/O-Zuverlässigkeitsprogrammanforderungen beschrieben. Weitere Informationen zu den Eingabe- und Ausgabeanforderungen für das SQL Server-Datenbankmodul finden Sie unter Microsoft SQL Server Datenbank-Engine Input/Output Requirements.