Seminar Question
“안녕하십니까? 저자님 책으로 공부중인 사람입니다.
우선 훌륭한 내용과 쉬운 풀이에 감사 드립니다. 저희 같은 초짜들도 이해하기 쉽게
쓰신 것 같습니다.
한가지 여쭤볼게 있습니다. 트랜잭션 로그를 기록하지 않게 하는 옵션은 없나요.
너무 황당한 질문인가요? 데이터의 정합성 같은 것 보다 오로지 성능과
하드웨어리소스만이 중요한 DB라면 굳이 로그를 기록하지 않아도 되지 않을까 해서
드리는 질문입니다. 현재 꽤 트랜잭션이 한꺼번에 많이(자주는 아니구요)
발생하는 프로젝트를 하고 있는데 이런 경우입니다. truncate logon checkpoint 옵션을
줘도 일단 기록한 다음, 지우는 것으로 이해를 했는데요. 아예 처음부터
기록을 하지 않게 하는 옵션은 없을까요? 뉴스그룹이나 이책,저책 다 뒤져봐도
그런 내용은 없네요. 황당한 소리하지마라!라는 말도 들었습니다만,
듣기에 오라클에는 그런 옵션이 있다고 합니다.오라클에 있는데 SQL에 없다는
것은 좀 이해할 수 없군요.
바쁘신 와중에 읽어주셔서 감사합니다. 답변 기대하겠습니다.”
이번 달 질문은 이메일로 질문하신 어떤 독자님의 글입니다. 사실은 조금은 날짜가
된 질문이지만, 다시 한번 정리해서 답변 드리도록 하겠습니다. 질문의 요지는
트랜잭션 로그가 데이터베이스의 데이터 파일보다 많이 쌓여서 고민이라는 말씀
같습니다. 많은 분들이 골치아파 하는 주제이기도 하지요. 그래서 이
트랜잭션 로그 파일을 어떻게 하면 줄일 수 있을까? 혹은 어떻게 하면 만들지
않도록 할 수 있을까 하는 것입니다. 오라클에는 이러한 옵션이 있다고
말씀하셨는데, DELAYED_LOGGING_BLOCK_CLEANOUTS 시작 파라미터를
말씀하시는 게 아닌가 하네요. 일반적으로 관계형 데이터베이스에서 트랜잭션은
굉장히 중요한 개념이고, 데이터베이스의 복구를 위해서는 트랜잭션 로그도
반드시 필요한 부분입니다. 하지만, 데이터 파일과는 다르게 트랜잭션 로그 파일은
시간이 지나면 지날수록 계속 쌓여 만 가기 때문에 주기적인 관리를 해주지
않는다면 골치 아픈 주제이죠. 실제로 어떤 사이트에서는 데이터파일은
수백메기밖에 안 되는데, 트랜잭션 로그 파일은 거의 수 기가 바이트를 점유해서
더 이상 데이터베이스가 수행되지 않는 경우가 있었습니다.
이 경우 유용한 옵션중의 하나가 그 유명한 “trunc. log on chkpt” 옵션입니다.
SQL 서버 7.0에서 유용하게 사용되다가 SQL 서버 2000에서는 이 옵션을 찾을 수
없어서 고민하시는 분들이 계셨죠. 사실 SQL 서버 2000에서는 이 옵션은
단순 복구 모델로 변경되어 데이터베이스의 복구 모델을 수정하는 것 만으로도
동일한 효과를 보실 수가 있습니다. 이 옵션은 단순 모드로 있는 동안 로그가
포함하는 트랜잭션들이 커밋되거나 롤백 되자 마자 로그의 섹션들을 재사용할 수
있도록 하는 것으로 실제 트랜잭션 로그가 중요한 역할을 하는 운영 서버에서는
위험한 방법이라고 할 수 있습니다. 그리고 이 옵션을 선택한다고 해서 실제
로그파일의 크기가 줄어들지는 않습니다.
또 다른 방법은 풀 백업이나
“BACKUP TRAN 데이터베이스 명 WITH TRUNCATE_ONLY”과 같이 트랜잭션
로그 파일을 비워주는 것입니다. 물론 이방법도 때로는 유용하지만 커져 있는
로그 파일의 크기를 줄여주지는 않습니다.
좀더 유용한 방법은 데이터베이스를 분리하였다가 다시 연결하면서 MDF 파일인
데이터 파일만을 연결하는 것입니다. 이 경우 로그 파일은 새로운 1M 짜리로
생성되게 됩니다. SQL 서버 7.0을 사용하시는 경우에는 데이터베이스가 정상적으로
종료된 후 LDF 파일인 트랜잭션 로그 파일을 삭제하면 동일한 프로세스를
실행하기도 했습니다만, 이 경우에는 LDF 파일이 하나인 경우만 해당되었지요.
가장 좋은 방법은 아래와 같은 명령을 사용하는 것입니다.
우선 저는 BANK라는 데이터베이스를 가지고 있고 이 데이터베이스의
트랜잭션 로그 파일의 크기는 20M 입니다. 아래와 같은 에러가 발생하면서
파일을 줄일 수가 없었습니다.
|
use bank go DBCC SHRINKFILE(bank_log, 2) go 결과 논리 로그 파일의 총 수가 2보다 적을 수 없으므로 로그 파일 2(bank_Log)을(를) 축소할 수 없습니다.
DbId FileId CurrentSize MinimumSize UsedPages EstimatedPages ------ ------ ----------- ----------- ----------- -------------- 8 2 625 625 624 624 (1개 행 적용됨) DBCC 실행이 완료되었습니다. DBCC에서 오류 메시지를 출력하면 시스템 관리자에게 문의하십시오.
|
아래 명령을 사용하면 최소 로그 파일 크기로 트랜잭션 로그 파일의 크기가
축소됩니다. 실제 폴더를 확인해 보면 파일의 크기가 줄어든 것을 확인하실 수
있을 것입니다. 하지만, 로그의 파일 크기는 원하던 크기와 다를 수도 있습니다.
필자의 경우에는 5MB로 줄어들었습니다. 이는 가상 로그의 크기 때문에 저의
경우에는 5MB 이하로는 더 이상 줄일 수 없었기 때문입니다.
DBCC SHRINKDATABASE문이나 자동 축소 작업이 시작되더라도 동일한 결과를
얻을 수 있습니다. 별것 아니죠. 헤헤. 그럼 다음 달에도 재미있는 질문들을 보내
주시기 바랍니다.
|
BACKUP LOG BANK WITH TRUNCATE_ONLY go DBCC SHRINKFILE(bank_log, 2) go
|


댓글을 달아 주세요
핵심은
BACKUP LOG BANK WITH TRUNCATE_ONLY
go
DBCC SHRINKFILE(bank_log, 2)
go