SqlServer 2008R2 sp1 CHECKDB falha quando o índice espacial está presente

1

Ocorreu um problema com o DBCC CHECKDB falhando com uma violação de acesso (deferência de ponteiro nulo) no Sql Server 2008R2 quando índices espaciais estão presentes. É repetível com DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS, mas também acontece em alguns casos com apenas DBCC CHECKDB.

Isso está ocorrendo para nós no padrão Sql Server 2008 R2 sp1 (e na edição do desenvolvedor) no Windows 2008 R2 e no Windows 7 (todos de 64 bits).

Aqui está um script simples de T-SQL que demonstra o problema. Se você executá-lo no SSMS, verá a saída e a conexão SQL sendo finalizadas.

use master
go
if exists(select * from sys.databases where name = 'DbccCrashExample') drop database DbccCrashExample
go
create database DbccCrashExample
GO
use DbccCrashExample
go
CREATE TABLE dbo.GeometryTable
(
    GeometryTableID int NOT NULL,
    Feature geometry NOT NULL,
    CONSTRAINT PK_GeometryTable PRIMARY KEY CLUSTERED (GeometryTableID)
)
GO
insert into dbo.GeometryTable(GeometryTableID, Feature)
select 1, geometry::STGeomFromText('POINT(0 0)', 4326)
go
create spatial index SPATIAL_GeometryTable_Feature on dbo.GeometryTable(Feature) with (BOUNDING_BOX=(0, -2, 1, 2))

-- works
--DBCC CHECKDB

-- fails
DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS

Uma coisa estranha é que parece que o DBCC foi concluído sem erros, mas ocorre um erro grave:

CHECKDB found 0 allocation errors and 0 consistency errors in database 'DbccCrashExample'.
Msg 0, Level 11, State 0, Line 0
A severe error occurred on the current command.  The results, if any, should be discarded.
Msg 0, Level 20, State 0, Line 0
A severe error occurred on the current command.  The results, if any, should be discarded.

No log de erro do Sql Server, obtemos um dump de pilha como este:

SqlDumpExceptionHandler: Process 59 generated fatal exception c0000005 EXCEPTION_ACCESS_VIOLATION. SQL Server is terminating this process.                                                                                        
* *******************************************************************************                                
*                                                                                                                
* BEGIN STACK DUMP:                                                                                              
*   11/20/11 13:23:34 spid 59                                                                                    
*                                                                                                                
*                                                                                                                
*   Exception Address = 0000000000E84A8D Module(sqlservr+0000000000274A8D)                                       
*   Exception Code    = c0000005 EXCEPTION_ACCESS_VIOLATION                                                      
*   Access Violation occurred reading address 0000000000000000                                                   
* Input Buffer 408 bytes -                                                                                       
*             create spatial index SPATIAL_GeometryTable_Feature on dbo.Geo                                      
*  metryTable(Feature) with (BOUNDING_BOX=(0, -2, 1, 2))   -- works --DBCC                                       
*  CHECKDB  -- fails DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS                                                   
*                                                                                          

Abrimos um caso de suporte pago com a Microsoft sobre o problema. Estou postando este problema aqui para compartilhar o problema com outras pessoas. Vou postar o que ouvimos da Microsoft sobre o assunto.

    
por Michael Ferrante 20.11.2011 / 22:32

1 resposta

1

Atualização:

A correção foi lançada no Sql Server 2008 r2 sp1 cu4.

Pacote de atualização cumulativa 4 para o SQL Server 2008 R2 Service Pack 1

Mais detalhes sobre o problema estão disponíveis aqui:

CORRECÇÃO: Violação de acesso ao executar um comando DBCC CHECKDB em um banco de dados que contém uma tabela que possui um índice espacial no SQL Server 2008 ou no SQL Server 2008 R2

Histórico:

Apresentamos um caso de suporte à Microsoft sobre o problema. Aparentemente, esse é um problema conhecido que foi corrigido em outras versões do Sql Server (2008 SP2 CU7, 2008 SP3 CU3, 2008R2 RTM CU11, 2008R2 SP1 CU4) e será corrigido no Sql Server 2008R2 SP1 CU4 (sp1 Atualização cumulativa 4).

Portanto, a solução, por enquanto, é não executar "WITH EXTENDED_LOGICAL_CHECKS" ou pular "DBCC CHECKDB" por completo até a atualização cumulativa sair em meados de dezembro de 2011.

Issue Description
-----------------------------

DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS fails with below error and it generates an Access Violation dump

CHECKDB found 0 allocation errors and 0 consistency errors in database 'AriesTempForEtlOnly'.
Msg 0, Level 11, State 0, Line 0
A severe error occurred on the current command.  The results, if any, should be discarded.
Msg 0, Level 20, State 0, Line 0
A severe error occurred on the current command.  The results, if any, should be discarded

DBCC CHECKDB runs fine and when you remove spatial indexes it seems to work fine.

Analysis
--------------------
-- Instruction which hit Access Violation

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

-- Stack of the thread which hit an AV
Child-SP          RetAddr           Call Site
00000000'0e3d8dd0 00000000'01a40289 sqlservr!CScaOp_Identifier::Decorate+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::Execute+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::Execute+0x55
00000000'0e3dc630 00000000'028845eb sqlservr!RowsetDiffExecutor::Execute+0x386
00000000'0e3dd300 00000000'02882661 sqlservr!UtilDbccCheckDatabase+0x1a37
00000000'0e3de670 00000000'028bd0b0 sqlservr!DbccCheckDB+0x2bd
00000000'0e3de6d0 00000000'01bd50a2 sqlservr!DbccCommand::Execute+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::Execute+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::Execute+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
  • Solicitação de hotfix foi arquivada no Porto do Kilimanjaro RTM CU11 para o Kilimanjaro SP1CU4
  • Violação de acesso de exceção em CScaOp_Identifier :: Decorar ao executar CheckTable em relação a um índice espacial.
  • O problema ocorre em uma linha de código na função CScaOp_Identifier :: Decorate.
  • Aqui, estamos tentando desreferenciar a estrutura pLR (LookupResult), mas isso é definido como NULL.
  • o problema é corrigido nas seguintes compilações: 2008 SP2 CU7, 2008 SP3 CU3, 2008R2 RTM CU11, 2008R2 SP1 CU4
  • Solicitação de hotfix foi arquivada no Porto do Kilimanjaro RTM CU11 para o Kilimanjaro SP1CU4
por 22.11.2011 / 23:00