본문 바로가기
etc

SQL Server 2008에서 트랜잭션 로그 잘라 내기(Log Truncation)

by (주)엠플 2011. 10. 17.

SQL Server 2000/2005에서는 트랜잭션 로그 백업을 주기적으로 받지 않음에 따라 트랜잭션 로그 파일의 크기가 비정상적으로 커지는 현상이 발생했을 때 다음과 같이 NO_LOG TRUNCATE_ONLY 옵션을 지정하여 BACKUP LOG 문을 수행하는 방법을 사용하여 응급 조치를 하곤 했습니다. NO_LOG TRUNCATE_ONLY 옵션을 지정하여 BACKUP LOG 문을 수행하면 실제로 백업 파일이 생성되지 않고도 트랜잭션 로그 파일 내의 비활성화된 로그가 삭제되기 때문에 DBCC SHRINKFILE 문을 통해 트랜잭션 로그 파일의 크기를 축소하여 디스크의 사용 가능 공간을 확보할 수 있었습니다

backup log test with truncate_only

 

SQL Server 2008에서는 BACKUP LOG 문에서 NO_LOG TRUNCATE_ONLY 옵션이 지원되지 않습니다. 그래서 SQL Server 2000/2005에 익숙한 사용자들은 적잖이 당황스러울 수도 있습니다. SQL Server 2008에서 NO_LOG TRUNCATE_ONLY 옵션이 지원되지 않는 이유는 이 옵션을 사용했을 때 로그 체인(Log Chain)이 깨져서 데이터베이스 복원 전략에 심각한 문제를 유발할 수 있기 때문입니다. 물론 주의 깊은 관리자라면 NO_LOG TRUNCATE_ONLY 옵션을 사용하여 트랜잭션 로그를 잘라 내었을 때 로그 체인이 깨지는 것을 인식하고 전체 백업을 곧바로 받아 주겠지만 그렇지 못한 경우에는 추후 심각한 문제에 봉착할 수 있습니다.

 

그렇다면 SQL Server 2008에서 트랜잭션 로그 백업을 실제로 수행하지 않고 트랜잭션 로그를 잘라 낼 수 있는 방법은 무엇일까요? 그것은 의외로 단순하게도 데이터베이스의 복구 모델을 '단순(Simple)'로 바꾸었다가 다시 원래의 복구 모델('전체' '대량 로그')로 바꿔 주는 것입니다. 데이터베이스의 복구 모델이 '단순'일 경우에는 비활성화된 로그가 자동으로 삭제되기 때문에 데이터베이스의 복구 모델을 '단순'으로 변경 하자마자 비활성화된 트랜잭션 로그가 삭제됩니다.

 

SQL Server 2008에서 데이터베이스의 복구 모델을 '단순'으로 변경해 주는 방법이 트랜잭션 로그 백업 없이 트랜잭션 로그의 비활성화된 부분을 삭제하는 방법으로 권장됩니다. 하지만, 테스트 환경이라든가 특수한 목적에 따라서는 SQL Server 2000/2005에서처럼 BACKUP LOG 명령을 통해 트랜잭션 로그를 잘라 내고 싶을 수 있습니다. 이때 사용할 수 있는 방법이 있는데 그것은 바로 'NUL:' 저장소를 지정하는 것입니다. 다음과 같이 BACKUP LOG 명령에 'NUL:' 저장소를 지정하면 실제로 백업 파일은 생성되지 않고 로그 백업이 수행되기 때문에 백업 처리된 트랜잭션 로그는 삭제되게 됩니다

backup log test to disk='NUL:'

 

상기와 같이 'NUL:' 저장소를 지정하는 방법은 기본적으로 NO_LOG TRUNCATE_ONLY 옵션을 지정한 것과는 그 동작 방식이 다릅니다. NO_LOG TRUNCATE_ONLY 옵션을 지정했을 경우에는 백업 명령 수행시 SQL Server에서 실제 백업이 수행되는 것은 아님을 알기 때문에 비활성화된 트랜잭션 로그의 삭제 작업만을 수행합니다. 하지만, 'NUL:' 저장소를 지정하는 방법은 SQL Server에서는 트랜잭션 로그의 백업 작업이 그대로 수행되면서 단지 저장만 되지 않는 것입니다. 따라서, 'NUL:' 저장소를 지정하는 방법 사용시에는 트랜잭션 로그 파일을 읽어서 처리하는 작업에 일정 시간이 소요되며 백업 명령 완료시 다음과 같이 정상적인 백업 명령 실행시와 동일한 결과 메시지가 출력됩니다또한, SQL Server에서는 로그 체인이 깨졌다는 것을 전혀 모르기 때문에 로그 체인이 깨졌다는 경고성 메시지를 ERRORLOG 파일에 출력한다던가(SQL Server 2000의 경우) 다음 트랜잭션 로그 백업 시도시 오류가 발생하면서 실패하는(SQL Server 2005의 경우) 등의 작업도 수행되지 않습니다.

파일 1에서 데이터베이스 'test', 파일 'test_log'에 대해 1461개의 페이지를 처리했습니다 .
BACKUP LOG
() 1461개의 페이지를 0.567초 동안 처리했습니다(20.125MB/).

 

정리하면, SQL Server 2008에서는 지원되지 않는 NO_LOG TRUNCATE_ONLY 옵션 대신에 'NUL:' 저장소를 지정하는 방식으로 트랜잭션 로그 잘라 내기를 수행할 수 있습니다. 하지만, 그 동작 방식이 NO_LOG TRUNCATE_ONLY 옵션을 지정했을 때와는 다르므로 충분히 주의해서 사용해야 합니다. 기본적으로 SQL Server 2008에서 트랜잭션 로그를 잘라 내기 위해 권장되는 방법은 데이터베이스의 복구 모델을 '단순(Simple)'으로 변경하였다가 다시 원래의 복구 모델로 변경해 주는 것입니다

댓글