2011-01-12 5 views
0

웹 서버에 SQL 2008 db를 시뮬레이트 한 SQL 2008이 있고 환경 테스트를위한 로컬 SQL 2005 db가 있습니다.SQL 로그 및 활성 트랜잭션

이렇게하면 2008 서버 백업이 2005 서버로 복원되지 않으므로 테스트 용 데이터 백업/복원을위한 스크립트를 사용할 수 있습니다. 내 생산 웹 SQL 서버에서 테이블의 크기를 줄이기 위해이 SQL 쿼리를 실행할 때

는 (2008)

DELETE FROM TickersDay 
WHERE (DATEDIFF(day, TickersDay.[date], GETDATE()) >= 8) 
GO 

나는이 메시지를 얻을 :

Msg 9002, Level 17, State 4, Line 3 
The transaction log for database 'VTNET' is full. To find out why space in the log 
cannot be reused, see the log_reuse_wait_desc column in sys.databases 

그것은 나오면을 때 때때로 스크립트를 게시하십시오.

SELECT [name], recovery_model_desc, log_reuse_wait_desc 
FROM sys.databases 

결과 : 여기

[name]  recovery_model_desc  log_reuse_wait_desc 

VTNET SIMPLE      ACTIVE_TRANSACTION 

내 질문과 문제입니다 :이 SQL 명령을 실행하면

나는 다음과 같은 결과 얻을 나는 그것을 얻을

  1. 을 .. 롤백 명령이 필요한 트랜잭션 문이 있습니다.

< 경우 @@ TRANCOUNT> 0 롤백> ..하지만 난 그렇게하기 전에, 그래서 내가 100 저장 프로 시저를 가지고 .... 그동안

  1. 는 ... 내가 어떻게이 문제를 근절 할 수 ?? 나는 SHRINKING을 시도했고 Db를 백업하려고 시도했다. ...

  2. 위에서 볼 수 있듯이 SIMPLE 모드이다 ... LOG ONLY 파일을 백업하는 방법을 모른다. ...) 그 작업을 수행하는 방법을 발견하지 않았습니다

답변

1

당신은 단순히 사용하여 전체 테이블을 할 필요한 경우에만 날짜에 인덱스를 처리하기 위해 SQL 하지를 얻어서이 문제를 해결받을 수 있습니다 삭제됨 다음은 TickersDay에 인덱스를 통해 1/9 이하를 처리하는 당신이 (적어도 매일)이 충분히 자주 실행하는 경우가

DELETE FROM TickersDay 
WHERE TickersDay.[date] <= DATEADD(day, -8, GETDATE()) 
GO 

친화적 인덱스로 바꿔 ([날짜]) 대신에 갈 필요의 필드에서 DATEDIFF를 사용하면 전체 테이블을 통해.

이 여전히이 발생하면 :

데이터베이스 'VTNET'에 대한 트랜잭션 로그 당신은 정말이 자동 증가로 설정되어 있지 의심 때문에 로그 크기를 늘려야

가득 이 작업을 수행하기에 충분하지 않습니다. 삭제 또는 일괄 처리를 일일이 보거나 (날짜를 기준으로 다시 가정하므로 100 행만 효율적으로 타겟팅합니다.)

DELETE TOP (100) FROM TickersDay 
WHERE TickersDay.[date] <= DATEADD(day, -8, GETDATE()) 
GO 

@@ rowcount> 0 인 동안 루프를 반복하거나 더 짧은 간격으로 배경 삭제를 수행 할 수 있습니다.

+0

자세한 설명과 여러 답변을 주셔서 감사합니다. 확실하지 않은 작업은 있지만 크기를 늘리고 제한되지 않고 사용했으며 쿼리를 사용하여 훌륭하게 작동합니다. 충분히 커밋되지 않은 트랜잭션 bs ... 나중에 걱정할 것입니다. – CraigJSte

관련 문제