存在空間索引時,SqlServer 2008R2 sp1 CHECKDB 崩潰

存在空間索引時,SqlServer 2008R2 sp1 CHECKDB 崩潰

當存在空間索引時,我們在 Sql Server 2008R2 上遇到了 DBCC CHECKDB 因存取衝突(空指標引用)而崩潰的問題。使用 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') 刪除資料庫DbccCrashExample
建立資料庫 DbccCrashExample
使用 DbccCrashExample
建立表 dbo.GeometryTable
    GeometryTableID int NOT NULL,
    特徵幾何形狀不為空,
    CONSTRAINT PK_GeometryTable 主鍵聚集(GeometryTableID)
插入 dbo.GeometryTable(GeometryTableID, Feature)
選擇 1,幾何::STGeomFromText('POINT(0 0)', 4326)
使用 (BOUNDING_BOX=(0, -2, 1, 2)) 在 dbo.GeometryTable(Feature) 上建立空間索引 SPATIAL_GeometryTable_Feature

——作品
--DBCC檢查資料庫

-- 失敗
帶有 EXTENDED_LOGICAL_CHECKS 的 DBCC CHECKDB

一件奇怪的事情是,DBCC 似乎已完成且沒有錯誤,但隨後發生了嚴重錯誤:

CHECKDB 在資料庫「DbccCrashExample」中發現 0 個分配錯誤和 0 個一致性錯誤。
訊息 0,等級 11,狀態 0,行 0
目前命令發生嚴重錯誤。如果有結果,則應丟棄。
訊息 0,等級 20,狀態 0,行 0
目前命令發生嚴重錯誤。如果有結果,則應丟棄。

在 Sql Server 錯誤日誌中,我們得到以下堆疊轉儲:

SqlDumpExceptionHandler:進程 59 產生致命異常 c0000005 EXCEPTION_ACCESS_VIOLATION。 SQL Server 正在終止此程序。                                                                                        
************************************************** *** **********************************                                
*                                                                                                                
* 開始堆疊轉儲:                                                                                              
* 11/20/11 13:23:34 spid 59                                                                                    
*                                                                                                                
*                                                                                                                
* 異常位址 = 0000000000E84A8D 模組(sqlservr+0000000000274A8D)                                       
* 異常代碼 = c0000005 EXCEPTION_ACCESS_VIOLATION                                                      
* 讀取位址 0000000000000000 時發生存取衝突                                                   
* 輸入緩衝區 408 位元組 -                                                                                       
* 在 dbo.Geo 上建立空間索引 SPATIAL_GeometryTable_Feature                                      
* metricTable(Feature) with (BOUNDING_BOX=(0, -2, 1, 2)) -- 有效 --DBCC                                       
* CHECKDB -- DBCC CHECKDB 與 EXTENDED_LOGICAL_CHECKS 失敗                                                   
*                                                                                          

我們已就該問題向 Microsoft 提出了付費支援案例。我將這個問題發佈在這裡與其他人分享這個問題。我將發布我們從 Microsoft 收到的有關此問題的回應。

答案1

更新:

該修復已在 Sql Server 2008 r2 sp1 cu4 中發布。

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

有關該問題的更多詳細信息,請參見此處:

修正:對包含 SQL Server 2008 或 SQL Server 2008 R2 中具有空間索引的資料表的資料庫執行 DBCC CHECKDB 指令時出現存取衝突

歷史:

我們就該問題向 Microsoft 提交了支援案例。顯然,這是一個已知問題,已在其他版本的Sql Server(2008 SP2 CU7、2008 SP3 CU3、2008R2 RTM CU11、2008R2 SP1 CU4)中修復,並將在Sql Server 2008R2 SP1 累積CU4(sp1 更新4)中修復。

因此,目前的解決方案是不要執行“WITH EXTENDED_LOGICAL_CHECKS”或完全跳過“DBCC CHECKDB”,直到 2011 年 12 月中旬累積更新發佈為止。

問題描述
----------------------------

DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS 失敗並出現下列錯誤,並產生存取衝突轉儲

CHECKDB 在資料庫「AriesTempForEtlOnly」中發現 0 個分配錯誤和 0 個一致性錯誤。
訊息 0,等級 11,狀態 0,行 0
目前命令發生嚴重錯誤。如果有結果,則應丟棄。
訊息 0,等級 20,狀態 0,行 0
目前命令發生嚴重錯誤。結果(如果有)應丟棄

DBCC CHECKDB 運作良好,當您刪除空間索引時,它似乎運作正常。

分析
--------------------
-- 遇到存取衝突的指令

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

-- 命中 AV 的執行緒堆疊
子 SP RetAddr 呼叫站點
00000000`0e3d8dd0 00000000`01a40289 sqlservr!CScaOp_Identifier::裝飾+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::轉換+0x4de
00000000`0e3dbeb0 00000000`00bce5c9 sqlservr!CSQLSource::執行+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::執行+0x55
00000000`0e3dc630 00000000`028845eb sqlservr!RowsetDiffExecutor::執行+0x386
00000000`0e3dd300 00000000`02882661 sqlservr!UtilDbccCheckDatabase+0x1a37
00000000`0e3de670 00000000`028bd0b0 sqlservr!DbccCheckDB+0x2bd
00000000`0e3de6d0 00000000`01bd50a2 sqlservr!DbccCommand::執行+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::執行+0x7b5
00000000`0e3deee0 00000000`007965e2 sqlservr!process_request+0x64b
00000000`0e3df540 00000000`006eb450 sqlservr!process_commands+0x4e5
00000000`0e3df750 00000000`006eb116 sqlservr!SOS_Task::參數::執行+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 的修補程序請求
  • 針對空間索引執行 CheckTable 時,CScaOp_Identifier::Decorate 中出現異常存取衝突。
  • 問題出現在函式 CScaOp_Identifier::Decorate 中的一行程式碼處。
  • 在這裡,我們嘗試取消引用結構 pLR (LookupResult),但它被設定為 NULL。
  • 此問題已在以下版本中修復:2008 SP2 CU7、2008 SP3 CU3、2008R2 RTM CU11、2008R2 SP1 CU4
  • 已向港口提交從 Kilimanjaro RTM CU11 到 Kilimanjaro SP1CU4 的修補程序請求

相關內容