web-dev-qa-db-ja.com

空間インデックスが存在する場合、SqlServer 2008R2 sp1CHECKDBがクラッシュする

空間インデックスが存在する場合、SQL Server 2008R2でアクセス違反(nullポインターの差異)が発生してDBCCCHECKDBがクラッシュするという問題が発生していました。これは、DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKSで繰り返すことができますが、DBCCCHECKDBだけで発生する場合もあります。

これは、Windows 2008R2およびWindows7(すべて64ビット)のSQL Server 2008 R2 sp1標準(および開発者版)で発生しています。

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

 use master 
 go 
 if present(select * from sys.databases where name = 'DbccCrashExample')drop database DbccCrashExample 
 go 
 create database DbccCrashExample 
 GO 
 use DbccCrashExample 
 go 
 CREATE TABLE dbo.GeometryTable 
(
 GeometryTableID int NOT NULL、
フィーチャジオメトリNOTNULL、
 CONSTRAINT PK_GeometryTable PRIMARY KEY CLUSTERED(GeometryTableID)
)
 GO 
 dbo.GeometryTable(GeometryTableID、Feature)[.____に挿入します。 ] select 1、geometry :: STGeomFromText( 'POINT(0 0)'、4326)
 go 
 dbo.GeometryTable(Feature)の空間インデックスSPATIAL_GeometryTable_Featureを(BOUNDING_BOX =(0、-2 、1、2))
 
-動作
-DBCCCHECKDB 
 
-失敗
 DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS 

奇妙なことに、DBCCはエラーなしで完了したように見えますが、重大なエラーが発生します。

 CHECKDBは、データベース 'DbccCrashExample'で0の割り当てエラーと0の整合性エラーを検出しました。
メッセージ0、レベル11、状態0、行0 
現在のコマンドで重大なエラーが発生しました。結果がある場合は、破棄する必要があります。
メッセージ0、レベル20、状態0、行0 
現在のコマンドで重大なエラーが発生しました。結果がある場合は、破棄する必要があります。

SQL Serverのエラーログには、次のようなスタックダンプがあります。

 SqlDumpExceptionHandler:プロセス59で致命的な例外c0000005EXCEPTION_ACCESS_VIOLATIONが生成されました。 SQLServerはこのプロセスを終了しています。 
 * ******************************************** *********************************** 
 * 
 *スタックダンプの開始:
 * 11/20/11 13:23:34 spid 59 
 * 
 * 
 *例外アドレス= 0000000000E84A8D Module(sqlservr + 0000000000274A8D)
 *例外コード= c0000005 EXCEPTION_ACCESS_VIOLATION 
 *アクセス違反occ urred読み取りアドレス0000000000000000 
 *入力バッファ408バイト-
 * dbo.Geo 
 *に空間インデックスSPATIAL_GeometryTable_Featureを作成します(BOUNDING_BOX =(0、-2、1 、2))-動作します--DBCC 
 * CHECKDB-失敗しますDBCCCHECKDB WITH EXTENDED_LOGICAL_CHECKS 
 * 

この問題について、マイクロソフトとの有料サポートケースを開始しました。この問題を他の人と共有するために、ここに投稿します。この問題についてマイクロソフトから返信があったことを投稿します。

1

更新:

この修正は、SQL Server 2008 r2 sp1cu4でリリースされました。

SQL Server 2008 R2 Service Pack 1の累積的な更新パッケージ4

この問題の詳細については、こちらをご覧ください。

修正:SQL Server2008またはSQLServer 2008R2で空間インデックスを持つテーブルを含むデータベースに対してDBCCCHECKDBコマンドを実行するとアクセス違反が発生します

歴史:

この問題についてマイクロソフトにサポートケースを提出しました。どうやらそれは他のバージョンのSQLServer(2008 SP2 CU7、2008 SP3 CU3、2008R2 RTM CU11、2008R2 SP1 CU4)で修正され、SQL Server2008R2で修正される既知の問題です。 SP1 CU4(sp1累積更新プログラム4)。

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

問題の説明
 ----------------------------- 
 
 DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKSは以下のエラーで失敗し、アクセス違反ダンプを生成します
 
 CHECKDBは、データベース 'AriesTempForEtlOnly'。
 Msg 0、Level 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 Call Site 
 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`0e3d8ee 00000000`0e3d8f20 00000000`01a3d781 sqlservr!CRelOp_Project :: XRelBind + 0x56 
 00000000`0e3d8f90 00000000`01a3f877 sqlservr!CRelOp_Union :: XRelBind + 0xa 5 
 00000000`0e3d8ff0 00000000`01a3f990 sqlservr!CRelOp_Query :: XRelBind + 0x27 
 00000000`0e3d9020 00000000`00d48d4b sqlservr!CRelOp_Query :: XRelBindQuery + 0xb4 sqlservr!CProchdr :: FNormQuery + 0x3a 
 00000000`0e3d9230 00000000`00876644 sqlservr!CProchdr :: FNormalizeStep + 0x13ae 
 00000000`0e3d9700 00000000`00877259 sqlservr!CSQLSource :: F ] 00000000`0e3dbd20 00000000`008770fc sqlservr!CSQLSource :: FCompWrapper + 0xc1 
 00000000`0e3dbdf0 00000000`0074ac63 sqlservr!CSQLSource :: Transform + 0x4de 
 00000000`0e3dbeb0 00000000` Execute + 0x449 
 00000000`0e3dbfe0 00000000`02418255 sqlservr!CSQLSource :: SeExecute + 0x17c 
 00000000`0e3dc0a0 00000000`028abc55 sqlservr!ExecXrel + 0x1f1 
 00000000` !CheckRowsetDiff :: ExecuteXREL + 0x195 
 00000000`0e3dc5f0 00000000`028ad41a sqlservr!CheckRowsetDiff :: Execute + 0x55 
 00000000`0e3dc630 00000000`02 8845eb sqlservr!RowsetDiffExecutor :: Execute + 0x386 
 00000000`0e3dd300 00000000`02882661 sqlservr!UtilDbccCheckDatabase + 0x1a37 
 00000000`0e3de670 00000000`028bd0b0 sqlservr!DbccCheck `01bd50a2 sqlservr!DbccCommand :: Execute + 0xc8 
 00000000`0e3de7a0 00000000`00749a86 sqlservr!CStmtDbcc :: XretExecute + 0x8ce 
 00000000`0e3deb20 00000000`0074b4af sqlserv ____。] 00000000`0e3dec30 00000000`0074ad6c sqlservr!CMsqlExecContext :: FExecute + 0x97e 
 00000000`0e3dedb0 00000000`0076cfa6 sqlservr!CSQLSource :: Execute + 0x7b5 
 00000000`0e3de + 0x64b 
 00000000`0e3df540 00000000`006eb450 sqlservr!process_commands + 0x4e5 
 00000000`0e3df750 00000000`006eb116 sqlservr!SOS_Task :: Param :: Execute + 0x12a 
 00000000`0 006eaf5b sqlservr!SOS_Scheduler :: RunTask + 0x96 
 00000000`0e3df8c0 00000000`008244fa sqlservr!SOS_Scheduler :: ProcessTa sks + 0x128 
 00000000`0e3df930 00000000`008247dd sqlservr!SchedulerManager :: WorkerEntryPoint + 0x2d2 
 00000000`0e3dfa10 00000000`00c6c0cd sqlservr!SystemThread :: RunWorker + 0xcc [.__ `008253d2 sqlservr!SystemThreadDispatcher :: ProcessWorker + 0x2db 
 00000000`0e3dfb00 00000000`733037d7 sqlservr!SchedulerManager :: ThreadEntryPoint + 0x173 
 00000000`0e3dfba0 00000000`73303894 msvcr80 00000000`0e3dfbd0 00000000`76cc652d msvcr80!_threadstartex + 0x84 
 00000000`0e3dfc00 00000000`773bc521 kernel32!BaseThreadInitThunk + 0xd 
 00000000`0e3dfc30 00000000`00000000 ntdll!RtlUser
  • キリマンジャロRTM CU11からキリマンジャロSP1CU4へのホットフィックスリクエストがポートに提出されました
  • 空間インデックスに対してCheckTableを実行すると、CScaOp_Identifier :: Decorateで例外アクセス違反が発生します。
  • この問題は、関数CScaOp_Identifier :: Decorateのコード行で発生します。
  • ここでは、構造体pLR(LookupResult)を逆参照しようとしていますが、これはNULLに設定されています。
  • この問題は、次のビルドで修正されています:2008 SP2 CU7、2008 SP3 CU3、2008R2 RTM CU11、2008R2 SP1 CU4
  • キリマンジャロRTM CU11からキリマンジャロSP1CU4へのホットフィックスリクエストがポートに提出されました
1