SqlServer 2008R2 sp1 CHECKDB falla cuando está presente un índice espacial

SqlServer 2008R2 sp1 CHECKDB falla cuando está presente un índice espacial

Hemos tenido un problema con el bloqueo de DBCC CHECKDB con una infracción de acceso (deferencia de puntero nulo) en Sql Server 2008R2 cuando hay índices espaciales presentes. Es repetible con DBCC CHECKDB CON EXTENDED_LOGICAL_CHECKS pero también ocurre en algunos casos solo con DBCC CHECKDB.

Esto nos ocurre en Sql Server 2008 R2 sp1 estándar (y edición para desarrolladores) en Windows 2008 R2 y en Windows 7 (todos de 64 bits).

Aquí hay un script T-SQL simple que demuestra el problema. Si lo ejecuta en SSMS, verá el resultado y la conexión SQL finalizada.

usar maestro
ir
si existe (seleccione * de sys.databases donde nombre = 'DbccCrashExample') elimine la base de datos DbccCrashExample
ir
crear base de datos DbccCrashExample
IR
utilizar DbccCrashEjemplo
ir
CREAR TABLA dbo.GeometryTable
(
    GeometryTableID int NO NULO,
    Geometría de característica NO NULA,
    RESTRICCIÓN PK_GeometryTable CLAVE PRIMARIA AGRUPADA (GeometryTableID)
)
IR
insertar en dbo.GeometryTable (GeometryTableID, característica)
seleccione 1, geometría::STGeomFromText('PUNTO(0 0)', 4326)
ir
cree un índice espacial SPATIAL_GeometryTable_Feature en dbo.GeometryTable(Feature) con (BOUNDING_BOX=(0, -2, 1, 2))

-- obras
--DBCC COMPROBARDB

-- falla
DBCC CHECKDB CON EXTENDED_LOGICAL_CHECKS

Una cosa extraña es que parece que DBCC se completó sin errores, pero luego ocurre un error grave:

CHECKDB encontró 0 errores de asignación y 0 errores de coherencia en la base de datos 'DbccCrashExample'.
Mensaje 0, Nivel 11, Estado 0, Línea 0
Se produjo un error grave en el comando actual. Los resultados, si los hubiera, deben descartarse.
Mensaje 0, Nivel 20, Estado 0, Línea 0
Se produjo un error grave en el comando actual. Los resultados, si los hubiera, deben descartarse.

En el registro de errores del servidor Sql obtenemos un volcado de pila como este:

SqlDumpExceptionHandler: El proceso 59 generó una excepción fatal c0000005 EXCEPTION_ACCESS_VIOLATION. SQL Server está finalizando este proceso.                                                                                        
* ************************************************* *******************************                                
*                                                                                                                
* COMENZAR EL VOLCADO DE LA PILA:                                                                                              
* 20/11/11 13:23:34 spid 59                                                                                    
*                                                                                                                
*                                                                                                                
* Dirección de excepción = Módulo 0000000000E84A8D (sqlservr+0000000000274A8D)                                       
* Código de excepción = c0000005 EXCEPTION_ACCESS_VIOLATION                                                      
* Se produjo una infracción de acceso al leer la dirección 0000000000000000                                                   
* Búfer de entrada 408 bytes -                                                                                       
* crear índice espacial SPATIAL_GeometryTable_Feature en dbo.Geo                                      
* metryTable(Característica) con (BOUNDING_BOX=(0, -2, 1, 2)) -- funciona --DBCC                                       
* CHECKDB - falla DBCC CHECKDB CON EXTENDED_LOGICAL_CHECKS                                                   
*                                                                                          

Hemos abierto un caso de soporte pago con Microsoft sobre el problema. Estoy publicando este problema aquí para compartirlo con otros. Publicaré lo que escuchemos de Microsoft sobre el tema.

Respuesta1

Actualizar:

La solución se publicó en Sql Server 2008 r2 sp1 cu4.

Paquete de actualización acumulativa 4 para SQL Server 2008 R2 Service Pack 1

Más detalles sobre el problema están disponibles aquí:

REVISIÓN: Infracción de acceso cuando ejecuta un comando DBCC CHECKDB en una base de datos que contiene una tabla que tiene un índice espacial en SQL Server 2008 o SQL Server 2008 R2

Historia:

Presentamos un caso de soporte a Microsoft sobre el problema. Aparentemente es un problema conocido que se ha solucionado en otras versiones de Sql Server (2008 SP2 CU7, 2008 SP3 CU3, 2008R2 RTM CU11, 2008R2 SP1 CU4) y se solucionará en Sql Server 2008R2 SP1 CU4 (sp1 Cumulative Update 4).

Entonces, la solución por ahora es no ejecutar "WITH EXTENDED_LOGICAL_CHECKS" u omitir "DBCC CHECKDB" por completo hasta que salga la actualización acumulativa a mediados de diciembre de 2011.

descripcion del problema
-----------------------

DBCC CHECKDB CON EXTENDED_LOGICAL_CHECKS falla con el siguiente error y genera un volcado de infracción de acceso

CHECKDB encontró 0 errores de asignación y 0 errores de coherencia en la base de datos 'AriesTempForEtlOnly'.
Mensaje 0, Nivel 11, Estado 0, Línea 0
Se produjo un error grave en el comando actual. Los resultados, si los hubiera, deben descartarse.
Mensaje 0, Nivel 20, Estado 0, Línea 0
Se produjo un error grave en el comando actual. Los resultados, si los hubiera, deben descartarse.

DBCC CHECKDB funciona bien y cuando elimina los índices espaciales parece funcionar bien.

Análisis
--------------------
-- Instrucción que golpeó la infracción de acceso

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

-- Pila del hilo que llegó a un AV
Sitio de llamada RetAddr de SP secundario
00000000`0e3d8dd0 00000000`01a40289 sqlservr!CScaOp_Identifier::Decorar+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!CSQLFuente::FCompile+0xc99
00000000`0e3dbd20 00000000`008770fc sqlservr!CSQLFuente::FCompWrapper+0xc1
00000000`0e3dbdf0 00000000`0074ac63 sqlservr!CSQLFuente::Transformar+0x4de
00000000`0e3dbeb0 00000000`00bce5c9 sqlservr!CSQLFuente::Ejecutar+0x449
00000000`0e3dbfe0 00000000`02418255 sqlservr!CSQLFuente::SeExecute+0x17c
00000000`0e3dc0a0 00000000`028abc55 sqlservr!ExecXrel+0x1f1
00000000`0e3dc570 00000000`028ab7d5 sqlservr!CheckRowsetDiff::ExecuteXREL+0x195
00000000`0e3dc5f0 00000000`028ad41a sqlservr!CheckRowsetDiff::Ejecutar+0x55
00000000`0e3dc630 00000000`028845eb sqlservr!RowsetDiffExecutor::Ejecutar+0x386
00000000`0e3dd300 00000000`02882661 sqlservr!UtilDbccCheckDatabase+0x1a37
00000000`0e3de670 00000000`028bd0b0 sqlservr!DbccCheckDB+0x2bd
00000000`0e3de6d0 00000000`01bd50a2 sqlservr!DbccCommand::Ejecutar+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!CSQLFuente::Ejecutar+0x7b5
00000000`0e3deee0 00000000`007965e2 sqlservr!process_request+0x64b
00000000`0e3df540 00000000`006eb450 sqlservr!process_commands+0x4e5
00000000`0e3df750 00000000`006eb116 sqlservr!SOS_Task::Param::Ejecutar+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
  • Se ha presentado una solicitud de revisión al puerto desde Kilimanjaro RTM CU11 a Kilimanjaro SP1CU4
  • Infracción de acceso de excepción en CScaOp_Identifier::Decorate al ejecutar CheckTable en un índice espacial.
  • El problema ocurre en una línea de código en la función CScaOp_Identifier::Decorate.
  • Aquí, estamos intentando eliminar la referencia a la estructura pLR (LookupResult), pero está configurada en NULL.
  • El problema se solucionó en las siguientes compilaciones: 2008 SP2 CU7, 2008 SP3 CU3, 2008R2 RTM CU11, 2008R2 SP1 CU4.
  • Se ha presentado una solicitud de revisión al puerto desde Kilimanjaro RTM CU11 a Kilimanjaro SP1CU4

información relacionada