SqlServer 2008R2 sp1当空间索引存在时,CHECKDB崩溃

在存在空间索引时,我们遇到了DBCC CHECKDB在Sql Server 2008R2上发生访问冲突(空指针偏差)时崩溃的问题。 DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS是可重复使用的,但在某些情况下也可能只发生DBCC CHECKDB。

在Windows 2008 R2和Windows 7(全部64位)下,Sql Server 2008 R2 sp1标准(和开发者版本)出现这种情况。

这里有一个简单的T-SQL脚本来演示这个问题。 如果你在SSMS中运行它,你会看到输出和sql连接终止。

使用主
走
如果存在(select * from sys.databases where name ='DbccCrashExample')drop database DbccCrashExample
走
创build数据库DbccCrashExample
走
使用DbccCrashExample
走
 CREATE TABLE dbo.GeometryTable
 (
     GeometryTableID int NOT NULL,
    要素几何NOT NULL,
     CONSTRAINT PK_GeometryTable PRIMARY KEY CLUSTERED(GeometryTableID)
 )
走
插入到dbo.GeometryTable(GeometryTableID,Feature)
select1,geometry :: STGeomFromText('POINT(0 0)',4326)
走
用(BOUNDING_BOX =(0,-2,1,2))在dbo.GeometryTable(Feature)上创build空间索引SPATIAL_GeometryTable_Feature

 - 作品
 --DBCC CHECKDB

 - 失败
 DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS

奇怪的是,看起来DBCC没有错误就完成了,但是却发生了一个严重的错误:

 CHECKDB在数据库'DbccCrashExample'中发现了0个分配错误和0个一致性错误。
消息0,级别11,状态0,行0
当前命令发生严重错误。 如果有的话,结果应该被丢弃。
消息0,级别20,状态0,行0
当前命令发生严重错误。 如果有的话,结果应该被丢弃。

在Sql Server错误日志中,我们得到如下的堆栈转储:

 SqlDumpExceptionHandler:进程59生成致命exceptionc0000005 EXCEPTION_ACCESS_VIOLATION。  SQL Server正在终止这个过程。                                                                                        
 * ************************************************* ******************************                                
 *                                                                                                                
 * BEGIN堆栈转储:                                                                                              
 11/20/11 13:23:34 spid 59                                                                                    
 *                                                                                                                
 *                                                                                                                
 *exception地址= 0000000000E84A8D模块(sqlservr + 0000000000274A8D)                                       
 *exception代码= c0000005 EXCEPTION_ACCESS_VIOLATION                                                      
 *发生访问冲突发生读地址为0000000000000000                                                   
 *input缓冲区408字节 -                                                                                        
 *在dbo.Geo上创build空间索引SPATIAL_GeometryTable_Feature                                      
 * metryTable(Feature)with(BOUNDING_BOX =(0,-2,1,2)) -  works --DBCC                                       
 * CHECKDB  -  DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS失败                                                   
 *                                                                                          

我们已经与微软就这个问题展开了一个有偿的支持案例。 我在这里发布这个问题,与他人分享这个问题。 我将发布我们从Microsoft收到的有关此问题的回复。

更新:

该修复程序已在Sql Server 2008 R2 SP2 sp4 cu4中发布。

SQL Server 2008 R2 Service Pack 1的累积更新包4

有关此问题的更多详细信息,请访问:

FIX:对SQL Server 2008或SQL Server 2008 R2中包含具有空间索引的表的数据库运行DBCC CHECKDB命令时出现访问冲突

历史:

我们向微软提交了一个关于这个问题的支持案例。 显然这是一个已知问题已在其他版本的Sql Server(2008 SP2 CU7,2008 SP3 CU3,2008R2 RTM CU11,2008 R2 SP3)中修复,并将在Sql Server 2008R2 SP1 CU4(sp1累积更新4)中得到修复。

因此,现在的解决scheme是不运行“WITH EXTENDED_LOGICAL_CHECKS”或跳过“DBCC CHECKDB”,直到2011年12月中旬累计更新结束。

问题说明----------------------------- DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS失败,出现以下错误,并生成访问冲突转储CHECKDB发现0分配数据库“AriesTempForEtlOnly”中的错误和0一致性错误。 消息0,级别11,状态0,行0当前命令发生严重错误。 如果有的话,结果应该被丢弃。 消息0,级别20,状态0,行0当前命令发生严重错误。 结果,如果有的话,应该丢弃DBCC CHECKDB运行良好,当你删除空间索引似乎工作正常。 分析--------------------  - 指令访问冲突sqlservr!CScaOp_Identifier :: Decorate + 0x63:00000000`00954a8d 488b01 mov rax,qword ptr [rcx] ds :00000000`00000000 = ????????????????  - 打到AV Child-SP RetAddr调用站点的线程堆栈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 sql  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`0e3dee  e0 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 
  • 从Kilimanjaro RTM CU11到Kilimanjaro SP1CU4的端口已经提交了修补程序请求
  • CScaOp_Identifier ::exception访问冲突对空间索引运行CheckTable时进行装饰。
  • 问题发生在函数CScaOp_Identifier :: Decorate的一行代码中。
  • 在这里,我们试图取消引用结构pLR(LookupResult),但设置为NULL。
  • 问题在以下版本中修复:2008 SP2 CU7,2008 SP3 CU3,2008R2 RTM CU11,2008R2 SP1 CU4
  • 从Kilimanjaro RTM CU11到Kilimanjaro SP1CU4的端口已经提交了修补程序请求