SQL Server

DB 문제 발생시 트랜잭션 로그백업 및 축소

미스터몽키 2011. 9. 23. 12:17

정상적으로 주기적으로 백업받은 파일을 testDB1.bak라고 가정하고

긴급한 상황에서 복구를 하려면 문제된 시점에 로그백업을 하고  

기존에 마지막 정상적인 백업파일을 이용하여 복원를 해야한다.


문제된 시점에 로그백업은 정상적인 상황에서의 로그백업과는 다르므로 옵션을 사용하여 다음과 같이 백업한다.


BACKUP LOG testDB01 TO DISTK='C:\임시로그백업.bak' 

     WITH NO_TRUNCATE, INIT

-- NO_TRUNCATE 옵션은 데이터베이스에 이상이 발생했을 때에도 로그 백업을 진행할 수 있다.

-- INIT 옵션은 백업매체가 초기화된다. 기존에 '임시로그백업.bak' 로 백업된 내용이 모두 삭제되고 새로 백업된다.


이제 복원은 다음과 같다

먼저 정상적으로 주기적으로 백업받은 testDB1.bak 파일로 "데이터베이스 복원"을 하고

이때 "기존 데이터베이스 덮어쓰기" , 복구상태는 2번째 "RESTORE WITH NORECOVERY"로 하여

임시로그백업을 복원할 수 있는 상태로 만든다.(ssms상에서 DB명옆에 '복원 중...' 이라고 뜬다)


그리고 해당 데이터베이스를 선택하고 "작업"-"복원"-"트랜잭션 로그"를 선택하여  "임시로그백업.bak"파일을 복원하면 

문제된 시점까지의 모든 자료가 복원된다

주기적으로 백업받은 파일이 "전체백업"을 포함한 "차등백업", "로그백업"을 빠짐없이 포함하고 있을 때 가능한 방법이다.


/* 소용량의 백업정책 (내 주관적인 생각)  **************************************************************/

주기적으로 차등백업, 로그백업은 안하고 전체백업만 한다.

먼저 로그를 비우고(로그백업이지만 로그백업파일을 만들지 않는 옵션 WITH NO_LOG 사용)

   BACKUP LOG 데이터베이스이름 WITH NO_LOG 

바로 "전체백업"을 받는다.

   BACKUP DATABASE 데이터베이스이름 TO 백업할 파일


이렇게 매일 주기적으로 백업을 한다면 전체백업이라 부담 스럽지만 1Gb 이하의 크지 않은 용량의 DB는 간단하고 편리한 것 같다.

또한 계속적으로 데이터베이스가 약간이라도 변경되는 경우라면 차등백업, 로그백업은 의미가 없기 때문이기도 하다.


이러다 DB문제 발생시 백업을 받고

   BACKUP LOG testDB01 TO DISTK='C:\임시로그백업.bak' 

       WITH NO_TRUNCATE, INIT


위의 방법으로 복원을 하면 될 것같다.(모든 자료를 복원할 수 있다)

/********************************************************************************************************/


--2011. 09. 24 추가

 위에 방법은 sql 2005버전이고 2008버전부터는 트랜잭션 로그를 비우기 위해 단지 복구모델을 전체에서 단순으로 바꾸었다가

다시 전체로 변경하면 된단다.

그래서 로그 백업을 하고싶다면 다음의 명령으로 할수 있다고 한다.


BACKUP LOG <dbname> TO DISK = 'NUL'  


단지 디스크가 널이므로 저장만 하지 않고 로그백업을 똑같이 진행한다.


-- 2012. 03.31 추가  로그파일 축소하기 성공  ***************************************************************************/

다음과 같이 실행하여 850MB 로그파일을 100MB로 줄였다. 기분좋다.


DBCC SQLPERF ( LOGSPACE )         -- 트랜잭션 로그 공간의 사용에 관한 통계(축소전)

SELECT * FROM sys.database_files  -- 현재 DB의 시스템 뷰


ALTER DATABASE AmanDB SET RECOVERY SIMPLE   -- 복구모델 단순으로 변경

go


DBCC SHRINKFILE(2, 100)                      -- 2는 LOG파일의 file_id,  100은 100MB로 축소,  

go


ALTER DATABASE AmanDB SET RECOVERY FULL      -- 복구모델 전체로 변경(축소후 확인)

GO


결국 3가지 방법으로 축소할 수 있는 듯

 1. 복구 모델을 SIMPLE로 변경 후 DBCC SHRINKFILE을 수행 (위의 방법)

 2. BACKUP LOG <dbname> TO DISK = 'NUL' 을 실행 후 DBCC SHRINKFILE을 수행

 3. 로그 백업을 받고 DBCC SHRINKFILE을 수행


/*****************************************************************************************************************/