본문 바로가기

데이터베이스/MS SQL Server

MSSQL 서버 2008 - 트랜잭션 로그 줄이기

참고: http://ottoradke.com/2008/11/04/microsoft-sql-server-2008-tip-1-purge-transaction-log/

트랜잭션 로그를 줄이는 방법을 검색해보면 대략 다음의 두가지 방법을 찾을 수 있다.

1. 데이터베이스 복구모델을 simple로 변경하는 방법
2. 트랜잭션 로그를 백업하고 로그파일 크기를 줄이는 방법

2번 방법에 대해서는 다음과 같이 수행한다.

2.1 로그파일 백업
backup log DatabaseName to disk='YourPath\YourFilename.trn'
2.2 로그파일 크기 줄임
dbcc shrinkfile('logfilename', 1024)


※ DatabaseName, logfilename 은 해당 DB 정보를 확인
※ YourPath, YourFilename 은 백업할 위치 및 파일명을 입력

그런데 이 방법을 사용하게 되면 한번에 잘될때도 있지만 사용이 빈번한 DB의 경우 한번에 줄어들지 않고 여러번 반복해야 원하는 크기로 줄일 수 있다.

다른 포스트와 다르게 참고 URL을 상단에 둔 이유가 바로 여기에 있다.
Otto R. Radke  라는 분의 블로그 인데 소개글이 재밌다.
Developer & designer. Americano drinker, tennis player. Goal: be simple, passionate & resourceful.

------------------------------------------------------------------------------

-- Otto R. Radke - http://ottoradke.com

-- Info: T-SQL script to shrink a database's transaction log. Just set the

-- database name below and run the script and it will shrink the

-- transaction log.

------------------------------------------------------------------------------

------------------------------------------------------------------------------

-- Update the line below with the name of the database who's transaction

-- log you want to shrink.

------------------------------------------------------------------------------

USE YourDatabaseName

------------------------------------------------------------------------------

-- Don't change anything below this line.

------------------------------------------------------------------------------

GO

-- Declare variables

DECLARE @SqlStatement as nvarchar(max)

DECLARE @LogFileLogicalName as sysname

-- Alter the database to simple recovery

SET @SqlStatement = 'ALTER DATABASE ' + DB_NAME() + ' SET RECOVERY SIMPLE'

EXEC ( @SqlStatement )

-- Make sure it has been altered

SELECT [name], [recovery_model_desc] FROM sys.databases WHERE [name] = DB_NAME()

-- Set the log file name variable

SELECT @LogFileLogicalName = [Name] FROM sys.database_files WHERE type = 1

-- Shrink the logfile

DBCC Shrinkfile(@LogFileLogicalName, 1)

-- Alter the database back to FULL

SET @SqlStatement = 'ALTER DATABASE ' + DB_NAME() + ' SET RECOVERY FULL'

EXEC ( @SqlStatement )

-- Make sure it has been changed back to full

SET @SqlStatement = 'SELECT [name], [recovery_model_desc] FROM ' + DB_NAME() + '.sys.databases WHERE [name] = ''' + DB_NAME() + ''''

EXEC ( @SqlStatement )

------------------------------------------------------------------------------


실행해 보면 1M의 크기로 로그파일을 줄여준다. 너무 고마워서 해당 블로그에 답글도 쓰고 이렇게 국내에도 소개한다. 물론 검색을 잘하면 걸리기야 하겠지만..  ^^;