공간 인덱스가 있는 경우 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 연결이 종료되는 것을 볼 수 있습니다.

마스터 사용
가다
존재하는 경우(이름 = 'DbccCrashExample'인 sys.databases에서 * 선택) 데이터베이스 삭제 DbccCrashExample
가다
데이터베이스 DbccCrashExample 생성
가다
DbccCrash예제 사용
가다
테이블 만들기 dbo.GeometryTable
(
    GeometryTableID int NOT NULL,
    피처 기하학이 NULL이 아닙니다.
    CONSTRAINT PK_GeometryTable PRIMARY KEY CLUSTERED(GeometryTableID)
)
가다
dbo.GeometryTable(GeometryTableID, Feature)에 삽입합니다.
1을 선택하고, 기하학::STGeomFromText('POINT(0 0)', 4326)
가다
(BOUNDING_BOX=(0, -2, 1, 2))를 사용하여 dbo.GeometryTable(Feature)에 공간 인덱스 SPATIAL_GeometryTable_Feature를 만듭니다.

-- 작동
--DBCC 체크DB

-- 실패
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를 생성합니다.                                      
* metryTable(Feature) with (BOUNDING_BOX=(0, -2, 1, 2)) -- 작동 --DBCC                                       
* CHECKDB - EXTENDED_LOGICAL_CHECKS를 사용한 DBCC CHECKDB 실패                                                   
*                                                                                          

이 문제에 대해 Microsoft에 유료 지원 사례를 열었습니다. 이 문제를 다른 사람들과 공유하기 위해 여기에 게시합니다. 이 문제에 대해 Microsoft로부터 들은 내용을 게시하겠습니다.

답변1

업데이트:

수정 사항은 SQL Server 2008 r2 sp1 cu4에서 릴리스되었습니다.

SQL Server 2008 R2 서비스 팩 1용 누적 업데이트 패키지 4

이 문제에 대한 자세한 내용은 여기에서 확인할 수 있습니다.

FIX: 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)에서 수정될 예정인 알려진 문제입니다.

따라서 현재 해결 방법은 2011년 12월 중순에 누적 업데이트가 나올 때까지 "WITH EXTENDED_LOGICAL_CHECKS"를 실행하지 않거나 "DBCC CHECKDB"를 건너뛰는 것입니다.

문제 설명
----------------

EXTENDED_LOGICAL_CHECKS가 포함된 DBCC CHECKDB가 아래 오류로 인해 실패하고 액세스 위반 덤프가 생성됩니다.

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::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`0e3deee0 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까지의 포트에 핫픽스 요청이 제출되었습니다.
  • 공간 인덱스에 대해 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까지의 포트에 핫픽스 요청이 제출되었습니다.

관련 정보