Archive Log와 Archive Hang





  Archive Log

Archive Log를 이해하기 전에 Redo Log를 이해해야 수월하다.
(http://tawool.tistory.com/163 : Redo Log)

Oracle의 Redo Log는 복구시에 사용된다. 어떤 행의 변경이 일어나면 그 정보는 우선 Redo Log Buffer에 먼저 기록 된다(선로그기법) 

Archive Log는 데이터 복구시에 요긴하게 사용되지만 기본값은 사용하지 않는다.
그리고 아래와 같은 이유들로 사용하지 않는 곳도 많다.

1. 추가적인 저장공간을 필요로 한다.
2. DB 성능이 떨어진다.
3. 관리하기 까다롭다.



 극단적인 예를 들자면 데이터의 수정이 많이 일어나는 곳의 경우 Member의 크기가 1GB 의 Redo Log 에 Log Switch가 한시간에 5번만 발생해도 하루에 120GB가 필요하다는 결론이 나온다. 또 파일로 저장하기 위해서는 I/O가 발생하기 때문에 장치 성능이 떨어질수 밖에 없고 그러한 파일들을 백업장치에 관리해야 하기 때문에 까다로울 수 밖에 없다.


하지만 복구시 사용된다고 하였다. 왜 중요한걸까? 아래의 간단한 그림을 보자.

시나리오는 SCN이 100인 A DataFile이 삭제되어 백업 받아놓았던 파일로(SCN : 95) 으로 복구를 시도하는 그림이다.
RedoLog Group에는 98, 99, 100 에 대한 정보밖에 없어서 96, 97에 대한 정보가 없다. 그래서 그때 Archive Log를 이용해 복구를 하게 되는 것이다. 만약 이때 Archive Log 가 없다면 불완전복구를 하는 수밖에 없다.





Archive Log Mode 사용하기.

절차 (pfile을 기준으로 설명한다.)

1. Database Shutdown
2. Parameter File 수정
3. DB Mount
4. Archive Log Mode 변경
5. DB Open



1. Database Shutdown
shutdown immediate


2. Parameter File 수정
 vi {ORACLE_HOME}/product/10g/dbs/initSID.ora 

log_archive_dest_1='location=/path1'
log_archive_dest_2='location=/path2'
log_archive_format=%s_%t_%r.arc


log_archive_dest_n : Log File 다중화를 위해 지정하는 파라미터이다. 두곳에 하게되면 동시에 같은 Archive 파일이 생성된다. 만일 이 값을 지정하지 않는다면 db_recover_file_dest 에 생성된다.
이때 db_recovery_file_dest_size 파라미터는 기본으로 2GB으로 설정되어 있는데 Archive Log 파일의 총합이 2GB가 되면 더이상 생성되지 않고 Archive Hang 이 발생하므로 주의해야 한다.

log_archive_format : 파일의 생성시 파일명 포멧형식이다.
%s log sequence number
%S log sequence number, zero filled
%t thread number : RAC 구성시 장비식별을 위해 사용한다. Non RAC 환경에서는 무조건 1이다.
%T thread number, zero filled
%a activation ID
%d database ID
%r resetlogs ID that ensures unique names are constructed for the archived log files across multiple incarnations of the database
http://docs.oracle.com/cd/B19306_01/server.102/b14237/initparams103.htm

그외 파라미터로는 log_archive_start=true 가 있다. 이 파라미터는 9i까지만 사용된다. (10g에서 사용하면 오류발생)

3. DB Mount
startup mount [pfile={ORACLE_HOME}/product/10g/dbs/initSID.ora]


4. Archive Log Mode 변경
모드 변경은 Mount 상태에서 한다.
alter database archivelog;


5. DB Open
alter database open;

Archive Log Mode 사용하지 않기
파라미터는 수정하지 않아도 되고 그냥 사용하지 않게 설정하면 된다.

shutdown immediate
alter database noarchivelog;
alter database open;



현재 사용여부 조회
archive log list;



Achive Hang

Archive Hang 원인
Archive 저장공간의 부족으로 더 이상 Archive File을 생성하지 못하여 DB가 대기하게 되는 현상을 말한다. 
예를들어  기본 저장 경로인 db_recovery_file_dest 파라미터의 db_recovery_file_dest_size의 기본값이 2GB 으로 설정되어 있어서 변경하지 않고 기본적으로 사용하다 보면 문제에 부닥친다.

1. 저장공간 부족
2. 저장공간 경로의 문제
3. 저장공간의 권한 문제


복구방법

1. alert log 확인 및 상태확인
2. 여유공간 확보
3. archiver 재시작
4. full 백업(권장)



1. alert log 확인 및 상태확인
 {ORACLE_HOME}/admin/SID/bdump/alert_SID.log 을 확인하자. 그러면 archiver 관련 에러를 찾을 수있다.어떤 장애가 발생했을때 로그의 확인은 필수다.

아래에 예를든 로그를 보자. 한눈에 봐도 장애가 발생 한것을 알 수 있다.


그럼 현재 로그 상태를 보도록 한다.
SELECT * FROM V$LOG;
아래의 결과에서 "sequence#"의 번호가 26,27,25 로 표시되어 있고 "archive" 가 모두 NO 이라고 표시되어 있다. "sequence#" 25번부터 저장이 안되어 26,27 모두 archive 가 안된것을 확인할 수 있다.



아래의 명령어로 현재 파라미터 설정값을 확인한다.
show parameter log_archive_dest
그러면 현재 archive 저장 위치와 상태를 알 수 있다. log_archive_dest_state_1 은 아래 3번 과정에서 복구시 사용되는 파라미터이므로 눈여겨 보자.



2. 여유공간 확보 및 장애조치
파일을 삭제하는등의 조치를 취하여 여유공간을 확보한다. 혹시나 여유공간의 문제가 디렉토리에 대한 권한이 없을 수도 있으니 잘 살펴보자.

3. archiver 재시작 
DB를 끄지 않고 복구하는 방법이다.  
운영중인 DB는 함부로 shutdown 할 수없기 때문에 이렇게 복구를 하도록 한다

alter system set log_archive_dest_state_1=defer;
alter system set log_archive_dest_state_1=enable;
alter system archive log stop;
alter system archive log start;
or

10g에서 디렉토리가 삭제되었을때 디렉토리를 다시 생성하고 아래의 명령으로만 archiver 가 동작하는것은 확인 할 수 있었다.
alter system set log_archive_dest_state_1=enable;

위의  log_archive_dest_state_1 이 파라미터는 과정 1번에서 확인했었다.

 

4. full 백업(권장)