본문 바로가기
데이터베이스/MSSQL

replication 때문에 로그가 지워지지 않는 경우

by 브래드.권 2009. 1. 16.


간혹.. Replication 을 돌릴 때 log 가 지워지지 않아서 서버의 용량이 꽉 차는 문제가 생깁니다. 큰일이죠. 해당 서버에서 다른 작업들을 수행할 수 없게 되니 말입니다. 이 문제는 만들어진 snapshot 데이터들이 모든 subscriber 에게 읽혀지지 않아서 발생하는 문제입니다. 최소 하나의 subscriber라도 동기화 되기 전까지는 log 를 지우지 않고 계속 기다리는 것이죠. 그렇지 않으면 데이터의 일관성이 깨져 버리니까요.

backup log 를 with no_log 나 truncate 같은 것을 사용하여 줄이려해도 줄여지지 않는 경우 아래와 같은 쿼리를 돌려 해당 서버의 데이터베이스들을 확인해보세요.

 select name, is_published, is_subscribed, is_distributor, log_reuse_wait, log_reuse_wait_desc
 from master.sys.databases


그러면 log_reuse_wait 부분에 0,1 이 아닌 값이 나오고 log_reuse_wait_desc 에는 replication 이라고 나오면 replication 에 의해 log 가 재사용을 위해 기다리고 있는 것입니다.

그리고, dbcc opentran 을 사용하여 현재 열려있는 transaction 이 있는지 체크 해봅니다.
만약 replication 으로 인해 log 가 지워지지 않는 것이라면 십중팔구 아래와 같은 transaction 이 열려있을 것입니다.

 Transaction information for database 'REPL_Common'.

 Replicated Transaction Information:
        Oldest distributed LSN     : (0:0:0)
        Oldest non-distributed LSN : (3740:73:140)
 DBCC execution completed. If DBCC printed error messages, contact your system administrator.


그럼 이 transaction 을 닫고 로그를 줄여야겠죠.
아래와 같은 sp를 돌립니다.

 exec sp_repldone @xactid = null, @xact_seqno = null, @numtrans = 1, @time = 0, @reset = 1

그 후 다시 dbcc opentran 를 실행해보면 transaction 이 닫혔을 것입니다.
이제 로그를 줄여야겠죠.

 backup log 'database name' with no_log
 dbcc shrinkfile('database log file name',5)

그럼 이제 log 가 줄여질 겁니다.