SQL Server Diagnose erkennt nicht gemeldete E/A-Probleme aufgrund veralteter Lesevorgänge oder verlorener Schreibvorgänge.

In diesem Artikel wird erläutert, wie SQL Server Diagnostics 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

Symptome

Wenn Betriebssystem-, Treiber- oder Hardwareprobleme zu verlorenen Schreib- oder veralteten Lesebedingungen im E/A-Pfad führen, werden möglicherweise Fehlermeldungen im Zusammenhang mit der 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 neue E/A-Diagnosefunktionen eingeführt, die mit SQL Server 2000 Service Pack 4 beginnen, und diese Diagnose sind seitdem Teil des Produkts. Diese Funktionen sind darauf ausgelegt, 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 diese nicht durch ein Ereignis wie einen Ausfall eines physischen Laufwerks erklärt werden, überprüfen Sie alle bekannten Probleme mit SQL Server, dem Betriebssystem, den Treibern und der Hardware. Die Diagnose versuchen, Informationen zu den folgenden beiden Bedingungen bereitzustellen:

  • Verlorener Schreibzugriff: Ein erfolgreicher Aufruf der WriteFile-API, aber das Betriebssystem, ein Treiber oder der Cachecontroller leeren die Daten nicht ordnungsgemäß auf die physischen Medien, obwohl SQL Server informiert wird, dass der Schreibvorgang erfolgreich war.

  • Veralteter Lesevorgang: Ein erfolgreicher Aufruf der ReadFile-API, aber das Betriebssystem, ein Treiber oder der Cachecontroller gibt fälschlicherweise eine ältere Version der Daten zurück.

Zur Veranschaulichung hat Microsoft Szenarien bestätigt, in denen ein WriteFile-API-Aufruf eine status des Erfolgs zurückgibt, aber ein sofortiges, erfolgreiches Lesen desselben Datenblocks ältere Daten zurückgibt, 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 des 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 Diagnose nur mithilfe des Ablaufverfolgungsflags 818 aktiviert werden. Sie können das Ablaufverfolgungsflag 818 als Startparameter (-T818) für die SQL Server instance angeben, oder Sie können die folgende T-SQL-Anweisung ausführen, um sie zur Laufzeit zu aktivieren:

DBCC TRACEON(818, -1)

Das Ablaufverfolgungsflag 818 aktiviert einen In-Memory-Ringpuffer, der zum Nachverfolgen der letzten 2.048 erfolgreichen Schreibvorgänge verwendet wird, die von dem Computer ausgeführt werden, auf dem SQL Server ausgeführt wird, ohne 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 Liste der letzten Schreibvorgänge verglichen. Wenn die während des Lesevorgangs abgerufene LSN älter als die beim Schreibvorgang verwendete ist, wird im SQL Server Fehlerprotokoll eine neue Fehlermeldung protokolliert. Die meisten SQL Server Schreibvorgänge erfolgen als Prüfpunkte oder verzögerte Schreibvorgänge (ein verzögerter Schreibvorgang ist eine Hintergrundaufgabe, die asynchrone E/A verwendet). Die Implementierung des Ringpuffers ist einfach, und die Auswirkungen auf die Leistung auf das System sind vernachlässigbar.

Details zur Meldung im Fehlerprotokoll

In der folgenden Meldung werden keine expliziten Fehler der WriteFile-API oder der ReadFile-API-Aufrufe angezeigt, die SQL Server. Stattdessen wird ein logischer E/A-Fehler angezeigt, der bei der Überprüfung der LSN aufgetreten ist und der erwartete Wert nicht korrekt war:

Ab SQL Server 2005 wird folgende Fehlermeldung angezeigt:

SQL Server einen logischen konsistenzbasierten E/A-Fehler erkannt: Veralteter Lesevorgang. Dies ist während einer <Read/Write> -Seite <PAGEID> in der Datenbank-ID <DBID> am Offset <PHYSICAL OFFSET> in der Datei <FILE NAME>aufgetreten. Zusätzliche Meldungen im SQL Server Fehlerprotokoll oder Systemereignisprotokoll enthalten möglicherweise weitere Details. Dies ist ein schwerwiegender Fehler, der die Datenbankintegrität gefährdet und sofort korrigiert werden muss. Führen Sie eine vollständige Datenbankkonsistenzprüfung (DBCC CHECKDB) durch. 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 dem Punkt oder bei der Meldung dieses Fehlers enthält entweder der Lesecache eine ältere Version der Seite, oder die Daten wurden nicht ordnungsgemäß auf den physischen Datenträger geschrieben. In beiden Fällen (verlorener Schreibvorgang oder veralteter Lesevorgang) meldet SQL Server ein externes Problem mit dem Betriebssystem, dem Treiber oder den Hardwareebenen.

Wenn Fehler 3448 auftritt, wenn Sie versuchen, ein Rollback für eine Transaktion mit dem Fehler 605 oder 823 auszuführen, schließt der SQL Server instance 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 von dem Computer beibehalten, auf dem SQL Server ausgeführt wird. Während der Wiederherstellung (vor der Wiederholungsphase), wenn die ungültige Seiten-ID gelesen wird, werden die primären Details zum Seitenheader im SQL Server Fehlerprotokoll protokolliert. Diese Aktion ist wichtig, da sie dabei hilft, zwischen Szenarien mit verlorenem Schreibzugriff und veraltetem Lesevorgang zu unterscheiden.

Verhalten bei veralteten Lese- und Verlorenschreibvorgängen

In Szenarien mit veralteten Lesevorgängen werden möglicherweise die folgenden beiden allgemeinen Verhaltensweisen angezeigt:

  • Wenn die Datenbankdateien geschlossen und dann geöffnet werden, werden während der Wiederherstellung die richtigen und zuletzt geschriebenen Daten zurückgegeben.

  • Wenn Sie einen Prüfpunkt ausstellen und die DBCC DROPCLEANBUFFERS -Anweisung ausführen (um alle Datenbankseiten aus dem Arbeitsspeicher zu entfernen), und dann die DBCC CHECKDB Anweisung für die Datenbank ausführen, werden die zuletzt geschriebenen Daten zurückgegeben.

Die im vorherigen Absatz erwähnten Verhaltensweisen weisen auf ein Problem beim Zwischenspeichern von Lesevorgängen hin und werden häufig durch Deaktivieren des Lesecaches gelöst. Die im vorherigen Absatz beschriebenen Aktionen erzwingen in der Regel eine Cache-Invalidierung, und die erfolgreichen Lesevorgänge zeigen, dass die physischen Medien ordnungsgemäß aktualisiert werden. Das Verlorene Schreibverhalten tritt auf, wenn die zurückgelesene Seite immer noch die ältere Version der Daten ist, auch nach einer erzwungenen Leerung 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 vorliegen.

Beschreibung verschiedener Szenarien für veraltete Lese- und Schreibvorgänge

Microsoft hat auch Bedingungen festgestellt, die die Kriterien für Fehler 605 oder 823 nicht erfüllen, aber durch die gleiche veraltete Lese- oder verlorene Schreibaktivität verursacht werden. In einigen Fällen scheint eine Seite zweimal aktualisiert zu werden, 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. Beim nächsten Seitenabruf wird ein älteres Bild zurückgegeben, und dann wird eine zweite Änderung vorgenommen. Das SQL Server Transaktionsprotokolls zeigt, dass die Seite zweimal mit demselben LSN-Wert aktualisiert wurde. Diese Aktion wird zu einem Problem, wenn Sie versuchen, eine Transaktionsprotokollsequenz wiederherzustellen, oder wenn Datenkonsistenzprobleme auftreten, z. B. Fremdschlüsselfehler oder fehlende Dateneinträge. 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 "Authors" (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

sort SQL Server Operatoren führen E/A-Aktivitäten aus, die sich häufig in der Datenbank befindentempdb. Diese E/A-Vorgänge ähneln den Puffer-E/A-Vorgängen. Sie wurden jedoch bereits für die Verwendung von Wiederholungslogik zum Lesen entwickelt, um ähnliche Probleme zu beheben. Die in diesem Artikel erläuterten zusätzlichen Diagnose gelten nicht für diese E/A-Vorgänge.

Microsoft hat festgestellt, dass die Grundursache für die folgenden Sortierlesefehler in der Regel 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 veralteter Lesevorgang oder ein verloren gegangener Schreibvorgang zu einer nicht erwarteten Datenspeicherung führt, kann eine Vielzahl von Verhaltensweisen auftreten. Es kann als fehlende Daten erscheinen, aber einige der häufigeren Auswirkungen fehlender Daten erscheinen als Indexbeschädigungen, z. B. Fehler 644 oder 625:

Fehler 644 Nachrichtentext des Schweregrads 21 Der Indexeintrag für die RID "%.*hs" wurde auf der Indexseite %S_PGID, Index-ID %d, Datenbank '%.*ls' nicht gefunden.

Fehler 625 Schweregrad 21 Meldungstext Kann keine Zeile von Seite %S_PGID durch RID abrufen, weil die Slotid (%d) ungültig ist.

Einige Kunden haben fehlende Zeilen gemeldet, nachdem sie Aktivitäten zur Zeilenanzahl ausgeführt haben. 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 auch die Daten verloren.

Wichtig

Wenn eines der Verhaltensweisen auftritt oder Sie ähnliche Probleme in Verbindung mit der Deaktivierung von Zwischenspeicherungsmechanismen verdächtig sind, empfiehlt Microsoft dringend, das neueste Update für SQL Server zu erhalten. Microsoft empfiehlt auch dringend, dass Sie ihr Betriebssystem und die zugehörigen Konfigurationen streng überprüfen.

Beachten Sie, dass Microsoft bestätigt hat, dass einige Hardwareplattformen bei seltenen und hohen E/A-Lasten einen veralteten Lesevorgang zurückgeben können. Wenn die erweiterte Diagnose auf eine mögliche veraltete Lese- oder Verlorenschreibbedingung hinweisen, wenden Sie sich an Ihren Hardwarehersteller, um eine sofortige Nachverfolgung und Einen Test mit dem SQLIOSim-Hilfsprogramm zu erhalten.

SQL Server erfordert, dass Systeme eine garantierte Übermittlung an stabile Medien unterstützen, wie in den Anforderungen des SQL Server-E/A-Zuverlässigkeitsprogramms beschrieben. Weitere Informationen zu den Eingabe- und Ausgabeanforderungen für die SQL Server-Datenbank-Engine finden Sie unter Eingabe-/Ausgabeanforderungen der Microsoft SQL Server-Datenbank-Engine.