SqlServer 2008R2 sp1 CHECKDB は空間インデックスが存在するとクラッシュします

SqlServer 2008R2 sp1 CHECKDB は空間インデックスが存在するとクラッシュします

空間インデックスが存在する場合、Sql Server 2008R2 で DBCC CHECKDB がアクセス違反 (NULL ポインター参照) でクラッシュする問題が発生しています。これは DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS で再現可能ですが、場合によっては DBCC CHECKDB だけでも発生します。

この問題は、Windows 2008 R2 および Windows 7 (すべて 64 ビット) 上の Sql Server 2008 R2 sp1 標準 (および開発者エディション) で発生しています。

この問題を示す簡単な T-SQL スクリプトを以下に示します。これを SSMS で実行すると、出力と SQL 接続が終了することがわかります。

マスターを使用する
行く
存在する場合(sys.databases から * を選択し、name = 'DbccCrashExample' の場合)、データベース DbccCrashExample を削除します。
行く
データベース DbccCrashExample を作成する
行く
DbccCrashExample を使用する
行く
テーブル dbo.GeometryTable を作成します。
    GeometryTableID int NOT NULL、
    フィーチャジオメトリがNULLではありません。
    制約 PK_GeometryTable 主キー クラスター化 (GeometryTableID)
行く
dbo.GeometryTable(GeometryTableID, Feature) に挿入します。
1を選択、geometry::STGeomFromText('POINT(0 0)', 4326)
行く
dbo.GeometryTable(Feature) に (BOUNDING_BOX=(0, -2, 1, 2)) で空間インデックス SPATIAL_GeometryTable_Feature を作成します。

-- 作品
--DBCC CHECKDB

-- 失敗する
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 スパイダー59                                                                                    
*                                                                                                                
*                                                                                                                
* 例外アドレス = 0000000000E84A8D モジュール (sqlservr+0000000000274A8D)                                       
* 例外コード = c0000005 EXCEPTION_ACCESS_VIOLATION                                                      
* アドレス 00000000000000000 の読み取り中にアクセス違反が発生しました                                                   
* 入力バッファ 408 バイト -                                                                                       
* dbo.Geo に空間インデックス SPATIAL_GeometryTable_Feature を作成します。                                      
* metryTable(Feature) と (BOUNDING_BOX=(0, -2, 1, 2)) -- 動作します --DBCC                                       
* CHECKDB -- DBCC CHECKDB WITH 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 Cumulative Update 4) でも修正される予定です。

したがって、現時点での解決策は、2011 年 12 月中旬に累積的な更新プログラムがリリースされるまで、「WITH EXTENDED_LOGICAL_CHECKS」を実行しないか、「DBCC CHECKDB」を完全にスキップすることです。

問題の説明
-----------------------------

DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS は以下のエラーで失敗し、アクセス違反ダンプを生成します。

CHECKDB は、データベース 'AriesTempForEtlOnly' に 0 個の割り当てエラーと 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にヒットしたスレッドのスタック
子 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 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!Dbccコマンド::実行+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!プロセスリクエスト+0x64b
00000000`0e3df540 00000000`006eb450 sqlservr!プロセスコマンド+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!スケジューラマネージャ::ワーカーエントリポイント+0x2d2
00000000`0e3dfa10 00000000`00c6c0cd sqlservr!SystemThread::RunWorker+0xcc
00000000`0e3dfa50 00000000`008253d2 sqlservr!SystemThreadDispatcher::ProcessWorker+0x2db
00000000`0e3dfb00 00000000`733037d7 sqlservr!スケジューラマネージャ::スレッドエントリポイント+0x173
00000000`0e3dfba0 00000000`73303894 msvcr80!_callthreadstartex+0x17
00000000`0e3dfbd0 00000000`76cc652d msvcr80!_threadstartex+0x84
00000000`0e3dfc00 00000000`773bc521 カーネル32!ベーススレッドイニシエートサンク+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 へのポートに対する修正プログラム要求が提出されました。

関連情報