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

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

Temos tido um problema com o DBCC CHECKDB travando 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 apenas com DBCC CHECKDB.

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

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

usar mestre
ir
se existir (selecione * em sys.databases onde nome = 'DbccCrashExample') elimine o banco de dados DbccCrashExample
ir
criar banco de dados DbccCrashExample
IR
usar DbccCrashExample
ir
CRIAR TABELA dbo.GeometryTable
(
    GeometryTableID int NÃO NULO,
    Geometria do recurso NÃO NULO,
    CONSTRAINT PK_GeometryTable PRIMARY KEY CLUSTERED (GeometryTableID)
)
IR
insira em dbo.GeometryTable(GeometryTableID, Feature)
selecione 1, geometria::STGeomFromText('POINT(0 0)', 4326)
ir
crie o índice espacial SPATIAL_GeometryTable_Feature em dbo.GeometryTable(Feature) com (BOUNDING_BOX=(0, -2, 1, 2))

-- funciona
--DBCC CHECKDB

- falha
DBCC CHECKDB COM EXTENDED_LOGICAL_CHECKS

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

CHECKDB encontrou 0 erros de alocação e 0 erros de consistência no banco de dados 'DbccCrashExample'.
Mensagem 0, Nível 11, Estado 0, Linha 0
Um erro severo ocorreu no comando atual. Os resultados, se existirem, deveriam ser descartados.
Mensagem 0, Nível 20, Estado 0, Linha 0
Um erro severo ocorreu no comando atual. Os resultados, se existirem, deveriam ser descartados.

No log de erros do SQL Server, obtemos um dump de pilha como este:

SqlDumpExceptionHandler: O processo 59 gerou a exceção fatal c0000005 EXCEPTION_ACCESS_VIOLATION. O SQL Server está encerrando esse processo.                                                                                        
************************************************* ******************************                                
*                                                                                                                
* COMEÇAR O DUMP DA PILHA:                                                                                              
* 20/11/11 13:23:34 espião 59                                                                                    
*                                                                                                                
*                                                                                                                
* Endereço de exceção = Módulo 0000000000E84A8D (sqlservr + 0000000000274A8D)                                       
* Código de exceção = c0000005 EXCEPTION_ACCESS_VIOLATION                                                      
* Ocorreu violação de acesso ao ler o endereço 000000000000000                                                   
* Buffer de entrada 408 bytes -                                                                                       
* crie índice espacial SPATIAL_GeometryTable_Feature em dbo.Geo                                      
* metryTable(Feature) com (BOUNDING_BOX=(0, -2, 1, 2)) – funciona --DBCC                                       
* CHECKDB - falha no DBCC CHECKDB COM EXTENDED_LOGICAL_CHECKS                                                   
*                                                                                          

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

Responder1

Atualizar:

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

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

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

CORREÇÃ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ória:

Abrimos um caso de suporte com a Microsoft sobre o problema. Aparentemente, é 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 (atualização cumulativa sp1 4).

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

descrição do problema
-----------------------------

DBCC CHECKDB COM EXTENDED_LOGICAL_CHECKS falha com o erro abaixo e gera um despejo de violação de acesso

CHECKDB encontrou 0 erros de alocação e 0 erros de consistência no banco de dados 'AriesTempForEtlOnly'.
Mensagem 0, Nível 11, Estado 0, Linha 0
Um erro severo ocorreu no comando atual. Os resultados, se existirem, deveriam ser descartados.
Mensagem 0, Nível 20, Estado 0, Linha 0
Um erro severo ocorreu no comando atual. Os resultados, se existirem, deveriam ser descartados

DBCC CHECKDB funciona bem e quando você remove índices espaciais parece funcionar bem.

Análise
--------------------
-- Instrução que atingiu violação de acesso

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

-- Pilha do thread que atingiu um AV
Site de Chamada RetAddr Criança-SP
00000000`0e3d8dd0 00000000`01a40289 sqlservr!CScaOp_Identifier::Decorar+0x63
00000000`0e3d8e20 00000000`01a4007asqlservr!CScaOp_Identifier::XRelBindSelf+0x16d
00000000`0e3d8eb0 00000000`01a3ccd9 sqlservr!CScaOpArg::XRelBind+0x62
00000000`0e3d8ee0 00000000`01a3cda2sqlservr!XRelBindProjectList+0x8d
00000000`0e3d8f20 00000000`01a3d781sqlservr!CRelOp_Project::XRelBind+0x56
00000000`0e3d8f90 00000000`01a3f877sqlservr!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`008b37a5sqlservr!CProchdr::FNormQuery+0x3a
00000000`0e3d9230 00000000`00876644 sqlservr!CProchdr::FNormalizeStep+0x13ae
00000000`0e3d9700 00000000`00877259 sqlservr!CSQLFonte::FCompile+0xc99
00000000`0e3dbd20 00000000`008770fcsqlservr!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`028abc55sqlservr!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`02882661sqlservr!UtilDbccCheckDatabase+0x1a37
00000000`0e3de670 00000000`028bd0b0sqlservr!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`007965e2sqlservr!process_request+0x64b
00000000`0e3df540 00000000`006eb450 sqlservr!process_commands+0x4e5
00000000`0e3df750 00000000`006eb116 sqlservr!SOS_Task::Param::Execute+0x12a
00000000`0e3df860 00000000`006eaf5bsqlservr!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`733037d7sqlservr!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
  • A solicitação de hotfix foi registrada no porto do Kilimanjaro RTM CU11 para o Kilimanjaro SP1CU4
  • Exceção de violação de acesso em CScaOp_Identifier::Decorate ao executar CheckTable em 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 ela está definida como NULL.
  • o problema foi corrigido nas seguintes compilações: 2008 SP2 CU7, 2008 SP3 CU3, 2008R2 RTM CU11, 2008R2 SP1 CU4
  • A solicitação de hotfix foi registrada no porto do Kilimanjaro RTM CU11 para o Kilimanjaro SP1CU4

informação relacionada