SQL Server Frozen Ghost Cleanup 해결 방법이 필요했습니다.


15

5M과 1.5G 사이의 행 수를 가진 여러 테이블이 있습니다.

각 테이블에는 BLOB 필드가 있으며 크기는 100 바이트에서 30MB까지 다양하며 '행에서 큰 값 유형'= ON으로 저장됩니다.

테이블은 서로 다른 디스크 @ 서로 다른 LUN @ 매우 빠른 SAN에 각각 3-4 개의 파일이있는 다른 파일 그룹에 저장됩니다.

이 테이블의 크기는 매일 5 ~ 100Gb, 600 ~ 1.5M 행으로 증가합니다.

2 주에서 6 개월까지 의 일정 시간이 지나면 일부 행이 삭제되거나 아카이브 DB로 이동되므로 6 개월이 지난 작업 테이블에는 행이 없습니다.

서버의 현재 구성 :

  • SQL Server 엔진은 2008 R2 SP1 Enterprise @ 24 코어, @ 64Gb RAM입니다.
  • SQL Server는 추가 시작 플래그와 함께 실행됩니다.

-T 3640; (저장 프로 시저의 각 명령문에 대해 DONE_IN_PROC 메시지를 클라이언트로 보내는 것을 제거합니다. 이는 SET NOCOUNT ON의 세션 설정과 유사하지만 추적 플래그로 설정하면 모든 클라이언트 세션이이 방식으로 처리됩니다)

-T 1118; (tempDB에서 할당을 한 번에 1pg에서 (처음 8 페이지) 한 범위로 전환합니다.)

-T 2301; (의사 결정 지원 조회에 특정한 고급 최적화를 사용합니다.이 옵션은 큰 데이터 세트의 의사 결정 지원 처리에 적용됩니다)

-T 1117; (모든 데이터 파일을 한 번에 증가시킵니다. 그렇지 않으면 차례로 진행됩니다.)

-이자형; (파일 그룹의 각 파일에 할당 된 익스텐트 수를 증가시킵니다.이 옵션은 인덱스 또는 데이터 스캔을 실행하는 사용자 수가 제한된 데이터웨어 하우스 애플리케이션에 유용 할 수 있습니다)

-T 834; SQL Server는 버퍼 풀 ( http://msdn2.microsoft.com/en-us/library/aa366720.aspx) , http://support.microsoft에 할당 된 메모리에 대해 Windows 대형 페이지 할당을 사용합니다 . com / kb / 920093 )

  • SQL Server는 큰 페이지 확장명을 사용합니다
  • SQL Server는 빠른 파일 초기화 옵션을 사용합니다
  • 모든 데이터베이스에 대해 AUTOSHRINK가 꺼져 있습니다.

문제는 - 서버의 가동 시간의 어느 시점부터 (개월 며칠에서) 것을 GHOST CLEANUP몇 초에서 몇 페이지 (정리 - 프로세스가 거부 강제 정리를 해결하고 단순히 일반적인 작업을 수행 할 수 which is seen thru Extended Events있다), 적합하지가 있기 때문에, 삭제 된 모든 행을 정리할 수 없습니다

문제는 SQL Server 2005 RTM Enterprise 시대부터 지속됩니다.

내가 문제를 해결하려고 시도한 방법 :

  • 테이블의 클러스터 된 인덱스에서 SCAN 작업을 강제로 시도했습니다.
  • 테이블의 클러스터 된 인덱스에서 BLOB 열의 모든 내용을 포함하는 SCAN 작업을 강제로 시도했습니다.
  • 시스템 sp_clean_db_free_space 및 sp_clean_db_file_free_space
  • DB의 모든 파일 및 페이지에 대해 수동으로 dbcc cleanpage (@dbid, @fileid, @page)
  • 클러스터형 인덱스 재 구축 및 재구성
  • 데이터베이스 재 작성
  • DBCC FORCEGHOSTCLEANUP

  • 쿼리를 실행할 때 :

    select * 
    from sys.dm_db_index_physical_stats(db_id(), object_id('ProblemTable'), 1, 0, 'detailed')

    LOB_DATA의 할당 단위 유형에 대해서만 수백만에서 수천만 개의 고스트 레코드가 표시됩니다.

도움이되는 유일한 것 :

  • SHUTDOWN 명령으로 서버를 중지하거나 전체 호스트를 다시 시작-GHOST CLEANUP 프로세스를 다시 시작한 후 몇 시간 동안 실행되고 실제로 모든 고스트 레코드를 정리합니다.
  • EMPTYFILE 옵션을 사용하는 DBCC SHRINKFILE-한 파일에서 다른 파일 또는 새로 생성 된 파일로 모든 데이터를 이동하면이 파일의 고스트 레코드 만 정리됩니다. 문제는 축소 작업이 실제로 싫어한다는 것입니다. 하나의 파일에 3-4 일이 걸립니다.

문제 는 서버 다운 타임이 시간당 수천에서 수만 달러까지 너무 비싸고 심지어 용납 할 수 없기 때문에 서버 다운 타임없이 GHOST CLEANUP을 강제로 수행 할 수 있는 프로그래밍 방식 (바람직한) 또는 유지 보수 방법이 있습니까?

내 것과 같은 문제가 나타났습니다.

그리고 바로 여기에 있습니다 :

답변:


12

마지막으로 MS는이 문제를 버그로 인식했습니다. http://support.microsoft.com/kb/2622823

간단히 : 고정

  • SQL Server 2008 SP3 CU4
  • SQL Server 2008 R2 CU10
  • Sql Server 2008 R2 SP1 CU4

Sql Server 2012 SP1에서 1 년 이상의 런타임 문제가 발생하지 않습니다.


3

이것은 CSS로 이동하여 문제를 해결할 수있는 일종의 질문입니다. 소프트웨어 보증 및 지원 계약이있을 수 있습니다. 인스턴스를 다시 시작하는 데 시간당 수천 달러가 소요되는 경우 수백 달러를 지불하지 않아도 큰 문제는 아닙니다.

데이터베이스를 닫은 다음 온라인 상태로 만들려고 했습니까? 이로 인해 응급 복구가 실행되고 고스트 정리가 시작될 수 있습니다.

당신은 자주 테이블에 쓰고 있습니까? 자주 나는 항상 의미합니까?

MSKB 932115에 따르면 고스트 레코드가 모든 파일에만 남아있는 것으로 보입니까, 아니면 파일 그룹의 첫 번째 파일을 정리합니까?

-T1117 및 인스턴트 파일 init를 사용하는 이유는 무엇입니까?


1. 나는 확실히 MS 지원에 갈 것이다. 2. DB를 닫으면 약 10-30 분 동안 앞뒤로 롤링되는 롤업이 발생하여 허용되지 않습니다. 3. GC가 실행 중이지만 삭제 된 행 외부 LOB 항목을 처리하지 않습니다. 4. 초당 20에서 600 회의 쓰기와 시간에 따라 지속적으로 수행되는 테이블에 쓰기. 5. DB의 첫 번째 파일은 사용되지 않습니다. 큰 테이블이없고 시스템 스토리지로만 사용되므로 고스트 레코드가 없습니다.
Oleg Dok

-T1117을 사용하면 여유 공간이 여전히 존재하는 파일 그룹에 파일이 하나만 남아있을 때 대신 여러 파일 사이에 모든로드를 분산하고 싶습니다 .PFS의 래치가 느려지기 시작합니다. 즉석 파일 초기화는 파일 증가 시간을 최소화합니다. 회 전당 증분이 10-50Gb로 설정되어 있기 때문입니다. 파일을 오늘날 예상 할 수있는 볼륨과 볼륨을 완전히 예측할 수 없기 때문에 파일을 최대한 크게 설정할 수는 없습니다. 공간을 추가해야하는 WHom을 예측하는 것보다 SAN 관리자에게 더 많은 공간을 추가하도록 요청하는 것이 더 간단합니다.
Oleg Dok
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.