SQL Server 2005에서 트랜잭션 로그가 비워지지 않아 로그를 축소할 수 없어 발생한 오류에 대해
아래와 같이 정리하였습니다.

일반적으로 트랜잭션 로그 공간이 다시 사용되지 않는 이유, 트랜잭션 로그를 자를 수 없는 이유를
확인하기 위해서는 sys.databases 카탈로그 뷰의 log_reuse_wait 및 log_reuse_wait_desc 를
검토하여 원인을 확인할 수 있습니다.

데이터베이스 SUSPECT 발생 시, DBCC CHECKDB 명령과 함께 RAPAIR_DATA_ALLOW_LOSS 옵션을
수행할 경우 특정 조건에서 데이터베이스상태가 REPLICATION으로 설정되는 버그인 것으로 알고 있습니다.


[환경]
Windows Server 2003 EESP2
SQL Server 2005 SP2(3282) Cluster


[현상]
1. 사용자 데이터베이스 트랜잭션 로그 Full로 인해 F Drive 의 Disk Full 발생
2. 트랜잭션 로그 백업은 성공하였으나 LOG SPACE USED 공간이 비워지지 않음
(SHRINKFILE 시도할 수 없는 상태)
3. SQL Error Log에 아래와 같은 오류가 기록됩니다.

오류: 9002, 심각도: 17, 상태: 6.
The transaction log for database 'LAIGODB' is full. To find out why space in the log cannot be reused,
see the log_reuse_wait_desc column in sys.databases


데이터베이스 '%.*ls'의 트랜잭션 로그가 꽉 찼습니다. 로그의 공간을 다시 사용할 수 없는 이유를 확인하려면
sys.databases의 log_reuse_wait_desc 열을 참조하십시오.


[원인]
현재 머신에 복제(REPLICATION)를 설정하지 않았지만, 트랜잭션 로그가 PEDING REPLICATION 상태로 되어
있습니다. DBCC CHECKDB WITH REPAIR_ALLOW_DATA_LOSS 로 복구하는 특정 경우
(복구 내부 과정에서 UtilDbccDropRecordWithNoCleanup, UtilDbccConvertForwarded 함수가 호출되는 경우)
복제가 되는 것으로내부 하드코딩 되어있음으로 인해 로그가 truncate 되지 못하고 계속 증가하는 오류입니다.
-- 한국 마이크로소프트 기술지원 자료참조


[WORKAROUND]
해당 데이터베이스를 스냅샷 복제 구성을 한 뒤, sp_repldone 쿼리를 사용하여 트랜잭션을 복제 완료를
수동으로 RESET 한 뒤, 다시 원상태로 복제 구성을 비활성화 합니다.

1. 트랜잭션 로그 추가

ALTER DATABASE LAIGODB ADD LOG FILE (NAME='LAIGODB_LOG1,
FILE='F:\LAIGODBLOG_1.LDF')

-- 가용한 로그 공간이 확보되어 데이터베이스 정상화

2. 스냅숏 복제 구성
가. 복제 - 로컬 게시 - 배포 구성 마법사
나. 스냅숏 설정을 위한 임시 테이블 생성
나. 복제 - 로컬 게시 - 스냅숏 게시 생성

3. sp_repldone 쿼리를 수행하여 복제된 트랜잭션이 있는 상태에서 모두 배포됨 상태로 RESET 합니다.

Sp_repldone null,null,0,0,1


4. REPLICATION 해제 여부 확인

SELECT NAME, LOG_REUSE_WAIT_DESC FROM MASTER.SYS.DATABASES;

-- REPLICATION 상태가 아닌 다른 상태 값으로 변경되어야 합니다.


5. 트랜잭션 로그 TRUNCATE

BACKUP LOG LAIGODB WITH TRUNCATE_ONLY


6. 로그 파일 축소 작업

DBCC SHRINKFILE (LAIGODB_LOG, 5000) -- 5GB


7. 데이터베이스 백업

BACKUP DATABASE LAIGO TO DISK = 'H:\BACKUP\LAIGODB.BAK'


[분석결과]
1. 트랜잭션 로그 사용량 확인
DBCC SQLPERF(LOGSPACE)
LOG SIZE : 100GB / LOG SPACE USED : 100%
-- 트랜잭션 로그 백업 수행 후 USED 줄어들지 않음

2. 활성 트랜잭션 확인
DBCC OPENTRAN

3. 데이터베이스 트랜잭션 로그 상태 확인
SELECT NAME, LOG_REUSE_WAIT_DESC FROM MASTER.SYS.DATABASES;
LAIGODB REPLICATION
--실제 REPLICATION을 구성하지 않은 환경에서 위와 같이 REPLICATION 설정이 변경되어 있음을 확인

4. SQL Error Log 확인 결과 1개월 전 REPAIR_ALLOW_DATA_LOSS를 진행하였음을 확인
DBCC CHECKDB('LAIGODB', REPAIR_ALLOW_DATA_LOSS)


[참고자료]
로그 잘림을 지연시킬 수 있는 요소
http://msdn.microsoft.com/ko-kr/library/ms345414(SQL.90).aspx

SQL Server를 실행하는 컴퓨터에서 트랜잭션 로그가 예기치 않게 커지거나 가득 찬다
http://support.microsoft.com/kb/317375/ko

sp_repldone(Transact-SQL)
http://technet.microsoft.com/ko-kr/library/ms173775(SQL.90).aspx


Posted by 퓨전마법사
,