在存在空间索引时,我们遇到了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