SqlServer 2008R2 sp1 CHECKDB stürzt ab, wenn räumlicher Index vorhanden ist

SqlServer 2008R2 sp1 CHECKDB stürzt ab, wenn räumlicher Index vorhanden ist

Wir hatten ein Problem mit DBCC CHECKDB, das aufgrund einer Zugriffsverletzung (Nullzeiger-Abweichung) auf SQL Server 2008R2 abstürzte, wenn räumliche Indizes vorhanden waren. Dies ist mit DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS wiederholbar, passiert aber in manchen Fällen auch nur mit DBCC CHECKDB.

Dies tritt bei uns auf SQL Server 2008 R2 SP1 Standard (und Developer Edition) unter Windows 2008 R2 und unter Windows 7 (alle 64 Bit) auf.

Hier ist ein einfaches T-SQL-Skript, das das Problem demonstriert. Wenn Sie es im SSMS ausführen, sehen Sie die Ausgabe und die Beendigung der SQL-Verbindung.

Master verwenden
gehen
wenn vorhanden (wählen Sie * aus sys.databases, wobei Name = 'DbccCrashExample') löschen Sie die Datenbank DbccCrashExample
gehen
Datenbank DbccCrashExample erstellen
GEHEN
verwenden Sie DbccCrashExample
gehen
Tabelle erstellen dbo.GeometryTable
(
    GeometryTableID int NICHT NULL,
    Feature-Geometrie NICHT NULL,
    CONSTRAINT PK_GeometryTable PRIMARY KEY CLUSTERED (GeometryTableID)
)
GEHEN
einfügen in dbo.GeometryTable(GeometryTableID, Feature)
wähle 1, Geometrie::STGeomFromText('PUNKT(0 0)', 4326)
gehen
Erstellen Sie den räumlichen Index SPATIAL_GeometryTable_Feature auf dbo.GeometryTable(Feature) mit (BOUNDING_BOX=(0, -2, 1, 2)).

-- funktioniert
--DBCC CHECKDB

-- schlägt fehl
DBCC CHECKDB MIT EXTENDED_LOGICAL_CHECKS

Merkwürdig ist, dass es so aussieht, als sei DBCC ohne Fehler abgeschlossen worden, dann aber ein schwerwiegender Fehler auftritt:

CHECKDB hat 0 Zuordnungsfehler und 0 Konsistenzfehler in der Datenbank „DbccCrashExample“ gefunden.
Meldung 0, Ebene 11, Status 0, Zeile 0
Beim aktuellen Befehl ist ein schwerwiegender Fehler aufgetreten. Die Ergebnisse (sofern vorhanden) sollten verworfen werden.
Meldung 0, Ebene 20, Status 0, Zeile 0
Beim aktuellen Befehl ist ein schwerwiegender Fehler aufgetreten. Die Ergebnisse (sofern vorhanden) sollten verworfen werden.

Im SQL Server-Fehlerprotokoll erhalten wir einen Stackdump wie diesen:

SqlDumpExceptionHandler: Prozess 59 hat die schwerwiegende Ausnahme c0000005 EXCEPTION_ACCESS_VIOLATION generiert. SQL Server beendet diesen Prozess.                                                                                        
* *******************************************************************************                                
*                                                                                                                
* STACK DUMP BEGINNEN:                                                                                              
* 20.11.11 13:23:34 spid 59                                                                                    
*                                                                                                                
*                                                                                                                
* Ausnahmeadresse = 0000000000E84A8D Modul (sqlservr+0000000000274A8D)                                       
* Ausnahmecode = c0000005 EXCEPTION_ACCESS_VIOLATION                                                      
* Beim Lesen der Adresse 0000000000000000 ist eine Zugriffsverletzung aufgetreten                                                   
* Eingabepuffer 408 Bytes -                                                                                       
* räumlichen Index SPATIAL_GeometryTable_Feature auf dbo.Geo erstellen                                      
* metryTable(Feature) mit (BOUNDING_BOX=(0, -2, 1, 2)) – funktioniert – DBCC                                       
* CHECKDB – DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS schlägt fehl                                                   
*                                                                                          

Wir haben zu diesem Problem einen kostenpflichtigen Supportfall bei Microsoft eröffnet. Ich poste dieses Problem hier, um es mit anderen zu teilen. Ich werde posten, was wir von Microsoft zu diesem Problem hören.

Antwort1

Aktualisieren:

Der Fix wurde in SQL Server 2008 R2 SP1 Cu4 veröffentlicht.

Kumulatives Updatepaket 4 für SQL Server 2008 R2 Service Pack 1

Weitere Einzelheiten zu diesem Problem finden Sie hier:

Update: Zugriffsverletzung beim Ausführen eines DBCC CHECKDB-Befehls für eine Datenbank, die eine Tabelle mit einem räumlichen Index in SQL Server 2008 oder SQL Server 2008 R2 enthält

Geschichte:

Wir haben bei Microsoft einen Supportfall zu diesem Problem eingereicht. Anscheinend handelt es sich um ein bekanntes Problem, das in anderen Versionen von SQL Server (2008 SP2 CU7, 2008 SP3 CU3, 2008R2 RTM CU11, 2008R2 SP1 CU4) behoben wurde und in SQL Server 2008R2 SP1 CU4 (sp1 Cumulative Update 4) behoben wird.

Daher besteht die Lösung vorerst darin, „WITH EXTENDED_LOGICAL_CHECKS“ nicht auszuführen oder „DBCC CHECKDB“ ganz zu überspringen, bis das kumulative Update Mitte Dezember 2011 erscheint.

Fehlerbeschreibung
-----------------------------

DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS schlägt mit dem folgenden Fehler fehl und generiert einen Zugriffsverletzungs-Dump

CHECKDB hat 0 Zuordnungsfehler und 0 Konsistenzfehler in der Datenbank „AriesTempForEtlOnly“ gefunden.
Meldung 0, Ebene 11, Status 0, Zeile 0
Beim aktuellen Befehl ist ein schwerwiegender Fehler aufgetreten. Die Ergebnisse (sofern vorhanden) sollten verworfen werden.
Meldung 0, Ebene 20, Status 0, Zeile 0
Beim aktuellen Befehl ist ein schwerwiegender Fehler aufgetreten. Die Ergebnisse (sofern vorhanden) sollten verworfen werden.

DBCC CHECKDB läuft einwandfrei und wenn Sie räumliche Indizes entfernen, scheint es einwandfrei zu funktionieren.

Analyse
--------------------
-- Anweisung, die auf Zugriffsverletzung gestoßen ist

sqlservr!CScaOp_Identifier::Decorate+0x63:
00000000`00954a8d 488b01 mov rax, qword ptr [rcx] ds:00000000`00000000=????????????????

-- Stapel des Threads, der einen AV getroffen hat
Child-SP RetAddr-Aufrufstelle
00000000`0e3d8dd0 00000000`01a40289 sqlservr!CScaOp_Identifier::Dekorieren+0x63
00000000`0e3d8e20 00000000`01a4007a sqlservr!CScaOp_Identifier::XRelBindSelf+0x16d
00000000`0e3d8eb0 00000000`01a3ccd9 sqlservr!CScaOpArg::XRelBind+0x62
00000000`0e3d8ee0 00000000`01a3cda2 sqlservr!XRelBindProjectList+0x8d
00000000`0e3d8f20 00000000`01a3d781 sqlservr!CRelOp_Project::XRelBind+0x56
00000000`0e3d8f90 00000000`01a3f877 sqlservr!CRelOp_Union::XRelBind+0xa5
00000000`0e3d8ff0 00000000`01a3f990 sqlservr!CRelOp_Query::XRelBind+0x27
00000000`0e3d9020 00000000`00d48d4b sqlservr!CRelOp_Query::XRelBindQuery+0xb4
00000000`0e3d91f0 00000000`008b37a5 sqlservr!CProchdr::FNormQuery+0x3a
00000000`0e3d9230 00000000`00876644 sqlservr!CProchdr::FNormalizeStep+0x13ae
00000000`0e3d9700 00000000`00877259 sqlservr!CSQLSource::FCompile+0xc99
00000000`0e3dbd20 00000000`008770fc sqlservr!CSQLSource::FCompWrapper+0xc1
00000000`0e3dbdf0 00000000`0074ac63 sqlservr!CSQLSource::Transform+0x4de
00000000`0e3dbeb0 00000000`00bce5c9 sqlservr!CSQLSource::Ausführen+0x449
00000000`0e3dbfe0 00000000`02418255 sqlservr!CSQLSource::SeExecute+0x17c
00000000`0e3dc0a0 00000000`028abc55 sqlservr!ExecXrel+0x1f1
00000000`0e3dc570 00000000`028ab7d5 sqlservr!CheckRowsetDiff::ExecuteXREL+0x195
00000000`0e3dc5f0 00000000`028ad41a sqlservr!CheckRowsetDiff::Ausführen+0x55
00000000`0e3dc630 00000000`028845eb sqlservr!RowsetDiffExecutor::Ausführen+0x386
00000000`0e3dd300 00000000`02882661 sqlservr!UtilDbccCheckDatabase+0x1a37
00000000`0e3de670 00000000`028bd0b0 sqlservr!DbccCheckDB+0x2bd
00000000`0e3de6d0 00000000`01bd50a2 sqlservr!DbccCommand::Ausführen+0xc8
00000000`0e3de7a0 00000000`00749a86 sqlservr!CStmtDbcc::XretExecute+0x8ce
00000000`0e3deb20 00000000`0074b4af sqlservr!CMsqlExecContext::ExecuteStmts+0x375
00000000`0e3dec30 00000000`0074ad6c sqlservr!CMsqlExecContext::FExecute+0x97e
00000000`0e3dedb0 00000000`0076cfa6 sqlservr!CSQLSource::Ausführen+0x7b5
00000000`0e3deee0 00000000`007965e2 sqlservr!Prozessanforderung+0x64b
00000000`0e3df540 00000000`006eb450 sqlservr!Prozessbefehle+0x4e5
00000000`0e3df750 00000000`006eb116 sqlservr!SOS_Task::Param::Ausführen+0x12a
00000000`0e3df860 00000000`006eaf5b sqlservr!SOS_Scheduler::RunTask+0x96
00000000`0e3df8c0 00000000`008244fa sqlservr!SOS_Scheduler::ProcessTasks+0x128
00000000`0e3df930 00000000`008247dd sqlservr!SchedulerManager::WorkerEntryPoint+0x2d2
00000000`0e3dfa10 00000000`00c6c0cd sqlservr!SystemThread::RunWorker+0xcc
00000000`0e3dfa50 00000000`008253d2 sqlservr!SystemThreadDispatcher::ProcessWorker+0x2db
00000000`0e3dfb00 00000000`733037d7 sqlservr!SchedulerManager::ThreadEntryPoint+0x173
00000000`0e3dfba0 00000000`73303894 msvcr80!_callthreadstartex+0x17
00000000`0e3dfbd0 00000000`76cc652d msvcr80!_threadstartex+0x84
00000000`0e3dfc00 00000000`773bc521 kernel32!BaseThreadInitThunk+0xd
00000000`0e3dfc30 00000000`00000000 ntdll!RtlUserThreadStart+0x1d
  • Hotfix-Anfrage wurde eingereicht zum Portieren von Kilimanjaro RTM CU11 auf Kilimanjaro SP1CU4
  • Ausnahmezugriffsverletzung in CScaOp_Identifier::Decorate beim Ausführen von CheckTable für einen räumlichen Index.
  • Das Problem tritt in einer Codezeile in der Funktion CScaOp_Identifier::Decorate auf.
  • Hier versuchen wir, die Struktur pLR (LookupResult) zu dereferenzieren, aber diese ist auf NULL gesetzt.
  • Das Problem wurde in folgenden Builds behoben: 2008 SP2 CU7, 2008 SP3 CU3, 2008R2 RTM CU11, 2008R2 SP1 CU4
  • Hotfix-Anfrage wurde eingereicht zum Portieren von Kilimanjaro RTM CU11 auf Kilimanjaro SP1CU4

verwandte Informationen