SQL Server 이야기

SQL Server 2005/2008에서 트랜잭션 로그 파일(.ldf)을 재생성하는 방법

늘푸르른나 2010. 6. 24. 17:48

트랜잭션 로그 파일(.ldf)은 데이터베이스의 일관성을 유지하기 위해 매우 중요합니다. SQL Server는 데이터베이스를 시작하면서 트랜잭션 로그 파일을 분석하고(Analysis), 트랜잭션은 커밋되었으나 디스크의 데이터 페이지에 반영되지 않은 변경 내용들에 대해서는 Redo 작업을(Roll-forward), 트랜잭션은 커밋되지 않았으나 디스크의 데이터 페이지에 이미 반영된 변경 내용들에 대해서는 Undo 작업을(Rollback) 수행합니다. 이런 과정을 Recovery라고 하는데 데이터베이스는 Recovery 과정을 거쳐야만 일관성이 보장되고 온라인 상태가 될 수 있기 때문에 트랜잭션 로그 파일에 문제가 발생하면 데이터베이스를 정상적으로 사용할 수 없게 됩니다.

 

트랜잭션 로그 파일이 부주의로 인해 삭제되거나 디스크 문제로 인해서 손상되면 데이터베이스를 온라인 상태로 만들기 위해 트랜잭션 로그 파일을 재생성해 주어야 합니다. 트랜잭션 로그 파일에는 문제가 없지만 데이터 파일(.mdf, ,ldf)에 일관성 오류가 발생했을 경우에도 Recovery 과정에서 로그 레코드와 데이터 페이지의 내용이 일치하지 않는 문제로 인해서 Recovery가 실패하고 결과적으로 데이터베이스를 사용할 수 없는 상태가 될 수 있는데 이런 경우 트랜잭션 로그 파일을 재생성해 주는 방법으로 데이터베이스 복구를 시도하기도 합니다. 또한, 대량의 변경 작업으로 인해 트랜잭션 로그 파일의 크기가 수십GB 이상으로 커져 있는 상태에서 SQL Server를 재시작하면 Recovery 작업이 오랫동안(몇 시간 이상) 수행되는 현상이 발생할 수 있는데 빠른 서비스 정상화를 위해 트랜잭션 로그 파일을 재생성하는 응급 조치를 취하기도 합니다(이는 권장하는 사항이 아니며 데이터베이스의 일관성 오류가 유발될 수 있습니다).

 

SQL Server 2000까지는 DBCC REBUILD_LOG라는 명령을 이용하여 트랜잭션 로그 파일을 재생성할 수 있었습니다. 하지만, SQL Server 2005부터는 DBCC REBUILD_LOG 명령이 지원되지 않으며 ALTER DATABASE 구문을 사용하여 동일한 작업을 수행할 수 있습니다. SQL Server 2005/2008에서 트랜잭션 로그 파일을 재생성하는 방법은 다음과 같습니다.

 

1. 동일한 이름의 파일이 존재하면 트랜잭션 로그 파일 재생성 작업이 실패하게 되므로 트랜잭션 로그 파일이 존재하는 상태라면 데이터베이스를 오프라인한 다음 기존의 트랜잭션 로그 파일을 삭제하고 데이터베이스를 다시 온라인합니다. 데이터베이스의 오프라인 및 온라인 작업은 다음과 같은 명령을 통해 할 수 있으며 명령이 여의치 않으면 SQL Server 서비스를 중지했다가 재시작하는 방법을 사용합니다. 

alter database 데이터베이스명 set offline

go

-- 트랜잭션 로그 파일 삭제 작업 -- 

alter database 데이터베이스명 set online

go 

 

2. 다음의 명령을 수행하여 데이터베이스를 응급 모드로 설정합니다. 응급 모드는 트랜잭션 로그 파일을 사용한 Recovery 과정 없이 데이터베이스를 온라인한 상태로 트랜잭션 로그 파일을 사용할 수 없는 상태이기 때문에 변경은 불가능하고 읽기만 가능한 상태입니다. 트랜잭션 로그 파일의 재성성을 위해서 데이터베이스는 반드시 응급 모드에 있어야 합니다. 

alter database 데이터베이스명 set emergency

go

 

3. 다음의 명령을 통해 트랜잭션 로그 파일을 재생성합니다. 참고적으로, 트랜잭션 로그 파일의 논리적인 이름과 절대경로는 시스템 카탈로그 뷰인 sys.master_files를 통해 확인해 볼 수 있는데 name 칼럼이 논리적인 이름을, physical_name 칼럼이 절대경로를 의미합니다.

alter database 데이터베이스명 rebuild log on (name=<로그 파일의 논리적인 이름(예를 들어, main_log)>, filename='<로그 파일의 절대경로(예를 들어, e:\data\main_log.ldf)>')

go

 

명령이 성공적으로 완료되면 다음과 같은 경고 메시지가 표시됩니다.

경고: 데이터베이스 'MAIN'의 로그가 다시 작성되었습니다. 트랜잭션에 일관성이 없습니다. RESTORE 체인이 끊어져 서버에 이전 로그 파일에 대한 컨텍스트가 더 이상 없으므로 해당 로그 파일이 어떤 파일인지 알아야 합니다. DBCC CHECKDB를 실행하여 물리적 일관성을 확인해야 합니다. 데이터베이스가 dbo 전용 모드로 전환되었습니다. 데이터베이스를 사용할 수 있는 준비가 되면 데이터베이스 옵션을 다시 설정하고 모든 추가 로그 파일을 삭제하십시오.

 

4. 트랜잭션 로그 파일을 재생성하게 되면 데이터베이스에 일관성 오류가 발생할 수 있습니다. 따라서, 트랜잭션 로그 파일 재생성 작업이 완료되면 반드시 DBCC CHECKDB를 이용하여 오류 여부를 확인해 보고 오류가 발견되면 이를 복구해 주어야 합니다. DBCC CHECKDB를 이용한 데이터베이스 복구 방법에 대한 자세한 내용은 http://blog.daum.net/partsofmemory/40에서 참고할 수 있습니다.

 

5. 트랜잭션 로그가 재생성될 때 데이터베이스는 '제한된 사용자(RESTRICTED USER)' 모드로 설정됩니다. DBCC CHECKDB를 통한 오류 확인 작업과 복구 작업이 모두 완료되면 다음의 명령을 사용하여 데이터베이스를 '다중 사용자' 모드로 설정하여 정상적으로 사용될 수 있도록 합니다. 

alter database 데이터베이스명 set multi_user

go

 

트랜잭션 로그가 재생성될 때 데이터베이스의 복구 모델도 '단순'으로 변경되므로 복구 모델을 확인하여 기존의 복구 모델로 원상 복구해 주는 작업이 추가적으로 필요합니다.