2009-07-28 4 views
22

간단한 복구 모드를 사용하는 상당히 큰 SQL Server 데이터베이스가 있습니다. 우리는 두 번째 회복까지는 필요가 없기 때문에이 모드를 유지하는 것이 좋습니다.간단한 복구 모드에서 SQL Server 데이터베이스로 이루어진 거대한 트랜잭션 로그

어떤 이유로이 데이터베이스의 트랜잭션 로그는 대량 (410GB)이며 99 %의 공간이 할당되지 않았습니다.

(DBCC SHRINKFILE (MyDatabase_log, 20000))을 사용하여 파일 축소를 시도했지만 작동하지 않는 것 같습니다.

누구나 간단한 복구 모드 데이터베이스에 거대한 파일이있는 이유에 대한 정보를 얻을 수 있습니까? 나는 그것을 아래로 축소시키는 것을 정말로하고 싶다.

답변

22

한 번 트랜잭션이 오래 걸리면 로그가 410GB로 커지게됩니다. 롤백 정보를 지울 수 없으므로 활성 트랜잭션이있는 경우 로그를 다시 사용할 수 없습니다. 이러한 예는 누군가가 SSMS 쿼리를 열고 트랜잭션을 시작하고 레코드를 업데이트 한 다음 휴가를가는 경우입니다. 트랜잭션이 활성화되어 로그가 최종적으로 커밋되거나 롤백 될 때까지 증가하도록합니다. 결국 트랜잭션이 끝나면 사용 된 공간을 다시 확보하여 거대한 빈 로그 파일을 남길 수 있습니다.

또 다른 시나리오는 약 200GB의 데이터가 단일 트랜잭션에서 업데이트 된 경우입니다. 로그는 변경 사항의 이전 및 이후 이미지를 저장하므로 두 배의 공간을 소비하며 모든 단일 트랜잭션이기 때문에 다시 사용할 수 없습니다.

업데이트 또한 로그 자르기를 방지 할 수있는 요인 복제를 언급 무시. 분산 트랜잭션 인 Mirroring (기술적으로는 '활성 트랜잭션'과 동일하지만 DTC의 의미는 별개의 사례입니다). 전체 목록과 설명은 Factors That Can Delay Log Truncation입니다.

+0

중간 롤백/트랜잭션 인 경우 할당되지 않은 공간으로 표시되지 않습니까? – Eric

+0

고마워요! 이것은 매우 가능합니다. 이 잠긴 상태에있는 경우 로그를 제거하기 위해 수행 할 수있는 작업을 알고 있습니까? –

+0

할당되지 않은 것으로 표시되면 SIMPLE 복구 모드로 공간을 이미 취소해야합니다. 문제의 데이터베이스에 대한 sys.databases의'log_reuse_wait_desc' 컬럼에'NOTHING'이 있습니까? –

5

당신은 dbcc shrinkfile에 인수를 놓치고 :

dbcc shrinkfile (MyDatabase_log, 20000, TRUNCATEONLY) 

NOTRUNCATE이 할당되지 않은 공간의 시작 부분에 블록을 할당 이동하는 기본이다. TRUNCATEONLY은 할당되지 않은 공간을 제거합니다. 따라서 NOTRUNCATE 다음에 TRUNCATEONLY을 입력하면 로그가 하나 줄어 듭니다.

+0

나는 그것을 시도했다. 아무것도 바뀌지 않았습니다. 나는 두 번째 로그 파일을 추가하여 공간이 부족할 때 데이터베이스를 다시 온라인 상태로 만들었습니다. 어쩌면 그 부분일까요? –

+1

@Eric (좋은 이름, btw) : 올바른 로그를 줄이고 있는지 확인하십시오. 로그 파일이 두 개인 경우 두 파일을 모두 독립적으로 축소해야합니다. 데이터베이스 속성의 파일 섹션에서 호출 된 항목을 확인하십시오. 기본값은'MyDatabase_log_1'이지만 내 머리 꼭대기로 갈 것입니다. – Eric

3

하나의 mdf 파일과 하나의 로그 파일이있는 경우 가장 간단한 방법은 데이터베이스를 분리하고 로그의 이름을 바꾸고 데이터베이스를 다시 연결하는 것입니다. SQL Server에서 새 로그 파일을 만듭니다. 그 후에 거대한 로그 파일을 안전하게 삭제할 수 있습니다.

데이터 파일이 여러 개인 경우에도 작동하지 않습니다.

+0

감사합니다. 나는 이것을 시도했지만 데이터베이스가 복제 게시자의 역할을하기 때문에 분리 할 수 ​​없었습니다. –

+0

이것은 훌륭하게 작동했습니다. 전 세계의 DBCC SHRINKFILE을 축소시키지 않을 수 없었습니다. 어쨌든 그것은 프로덕션이 아닌 테스트 DB 일 뿐이니까요. 작품은 위의 "다시 부착".ldf 파일 부분을 제거해야합니다. 감사! – bendecko

2

복제 게시자? 이것은 거대한 트랜잭션 로그의 원인 일 수 있습니까?

1

다른 응답에서와 마찬가지로 활성 트랜잭션복제이이 문제의 일반적인 원인입니다.
눈에 잘 띄지 않는 또 다른 이미지는 변경 데이터 캡처 (CDC)입니다.

나는 최근에 비슷한 문제가 있었다 나를 로그를 확보 할 수있는 절차는 다음과 같이이었다 :

  • 안 CDC : EXEC sys.sp_cdc_disable_db
  • 질문
  • 의 데이터베이스 내에서 임의의 테이블에 게시 만들기
  • 이/모든 발행물을 삭제하십시오. 은 편리한 방법입니다.

더미/결코 사용하지 발행 생성/삭제 필요했지만 그렇게 왜 내가 확실 해요을 원하는대로

  • 로그를 축소. 일시적으로 데이터베이스에는 이전 처분이 제대로 처리되지 않았을 수 있습니다 (이전 백업에서 복원 된 데이터베이스의 경우 자주 발생한다고 함).

    또 다른 유용한 진단 관용구는 잘못된 데이터베이스에 대한하려면 sys.databases의 log_reuse_wait_desc에게를 확인하는 것입니다. 위의 절차를 완료 할 때까지이 필드는 REPLICATION입니다.

    SELECT log_reuse_wait_desc, * FROM sys.databases where name = 'my_db' 
    
  • 관련 문제