MSSQL 로그 파일 용량 줄이는 방법
개발용 MSSQL 서버를 사용하면서 로그 파일 용량이 점점 늘어갔다. 평소에는 별 상관 없는데 데이터베이스를 복사 떠가려고 하거나 백업할 때마다 엄청나게 많은 시간이 소요되니… 로그 파일이 무려 3기가가 넘었다. 그래서 로그 파일 용량을 줄였다. 데이터베이스 속성을 보면 다음과 같이 크기가 엄청나게 크다.

다음의 코드를 입력한다.

USE GameDB
SELECT DATABASEPROPERTYEX('GameDB', 'Recovery');
ALTER DATABASE GameDB SET RECOVERY SIMPLE
DBCC SHRINKFILE (GameDB_New_log, 10)
ALTER DATABASE GameDB SET RECOVERY FULL
쿼리 실행시 해당하는 데이터베이스에 가서 실행해야 하므로 USE를 한번 써준다. GameDB는 사용하는 데이터베이스 이름, GameDB_New_log는 로그 파일의 논리적 이름을 써주면 된다.
쿼리를 실행하면 몇초 걸리지 않고 굉장히 빨리 처리된다.
주의 : 운영 서버라면 백업 체인이 끊긴다
이 방법은 개발 서버에서만 그대로 써도 되는 방법이다. 위 스크립트는 복구 모델을 SIMPLE로 내렸다가 다시 FULL로 올리는데, 이 과정에서 로그 백업 체인이 끊어진다.
체인이 끊기면 마지막 전체 백업 이후의 시점으로 복구(point-in-time recovery)가 불가능해진다. FULL로 되돌려놓아도 그것만으로는 복구되지 않는다.
운영 서버에서 부득이하게 실행했다면, 직후에 반드시 전체 백업을 받아 체인을 새로 시작해야 한다.
BACKUP DATABASE GameDB TO DISK = 'D:\backup\GameDB_full.bak' WITH INIT
애초에 로그가 왜 커졌는지부터 볼 것
로그 파일이 계속 커진다면 대개 원인이 따로 있다. 줄이기 전에 이유를 확인하는 편이 낫다.
SELECT name
, log_reuse_wait_desc -- 로그를 재사용하지 못하는 이유
FROM sys.databases
WHERE name = 'GameDB'
LOG_BACKUP—FULL복구 모델인데 로그 백업을 하지 않고 있다. 가장 흔한 원인이다. 정기적인 로그 백업만 설정하면 파일이 더 커지지 않는다.ACTIVE_TRANSACTION— 열려 있는 채로 방치된 긴 트랜잭션이 있다.REPLICATION— 복제가 로그를 아직 읽지 않았다.
개발 서버처럼 시점 복구가 필요 없는 환경이라면, 줄였다 되돌리지 말고 아예 복구 모델을 SIMPLE로 두는 것이 답이다.
ALTER DATABASE GameDB SET RECOVERY SIMPLE
파일을 줄인 뒤에는 인덱스가 조각난다
DBCC SHRINKFILE은 데이터 파일에 쓰면 인덱스 조각화를 크게 유발한다. 위 스크립트처럼 로그 파일에만 쓰는 것은 상대적으로 안전하지만, 데이터 파일에는 습관적으로 쓰지 않는 것이 좋다.
다시 데이터베이스 속성을 열어보면 다음과 같이 로그 파일 크기가 줄어있다.

댓글 남기기