[10g] Redo Log 관리


Redo Log 동작 방식


요소
- GROUP
- MEMBER

관련 Backgroup Process
- LGWR
- ARCn 

사용목적
- instance recovery
- media recovery
- fast commit

관리
- 다중관리
- 조회
- 그룹과 redo log 파일 생성
- 그룹 삭제
- 맴버 삭제
 



Redo Log 동작 방식



 데이터 파일과 컨트롤파일의 변경사항을 기록하며 빠른 Commit과  복구시에 사용한다.
아래과 같은 주요특징들이 있다.

   1. 데이터베이스(Control File, Data File)의 모든 변경사항을 기록한다.
   2. 최소 두개의 Redo Log 그룹이 존재해야 하며, 순환 방식(Round - robin)으로 기록된다.
   3. 같은 그룹의 Member는 동일한 정보를 가지고 있다.



위의 그림에서 보면 Redo Log은 두개의 그룹과 각 그룹별 각각 두개의 Member가 존재한다.



요소


GROUP
  그림으로 예를들어 설명한다. 두개의 그룹은 순환방식으로 변경사항이 저장된다.
즉 첫번째 그룹이 사용중이면 'CURRENT' 상태라면 두번째 그룹은 'INACTIVE' 또는 ACTIVE 상태일 수 있다. 
 첫번째 그룹에 변경Log 모두 기록하고 두번째 그룹에 Log를 기록한다면 두번째 그룹이 Current 상태가 되는데 이렇게 순환이 일어나는것을
Log Switch 라고 한다. 또 이렇게 Log Switch 가 발생될때마다 'LSN(Log Sequence Number)' 이 증가 하게 된다.

그 상태는 다음 문장으로 조회할 수 있다.

select * from v$log;

그룹의 상태표
V$LOG 를 조회했을때 Status는 4가지가 있다.
 상태 설명 
 CURRENT 현재 사용중 그룹
 ACTIVE CheckPoint 미완료
 INACTIVE CheckPoint 완료
 UNUSED 한번도 사용하지 않은 그룹

 간혹 ACTIVE와 INACTIVE 가 Archive 여부와 혼동할 수 있는데. 설명에도 나와있듯이 DB Buffer 의 내용을 DataFile에 기록을 했는지의 여부이다. ( CheckPoint 발생시 LGWR이 내려쓴다.)



MEMBER
 한 그룹안의 Member은 내용이 동일하다. 때문에 위와같이 두개의 맴버를 사용하는경우 하나의 맴버파일이 손상되더라도 다른 맴버파일이 존재하므로 계속적인 운영과 복구가 가능하다.
 

그룹별 맴버의 조회는 다음 쿼리문으로 조회할 수 있다.
select * from v$logfile;
 
 
위와 같이 그룹과 맴버들을 여러개 만드는 이유는 안정성을 위함이다. Redo Log 는 완전복구를 하기 위한 중요한 데이터이다.  하지만 redo log 파일이 많아지면 변경사항을 저장해야 할 곳이 많아지게 되므로 성능이 떨어지게 된다. I/O는 컴퓨터 자원중 가장 많은 시간이 걸리는 작업이라는것을 잊지 말자.



관련 Backgroup Process


LGWR
메모리 영역인 SGA 에는 Redo Log Buffer 가 존재한다. 이 Buffer에는  DB의 변경사항이 들어 있으며 아직 디스크에 저장되지 않은 상태이다. 이렇게 아직 써지지 않은 상태의 Buffer 내용을 Online Redo Log 파일에 기록하는 역할을 하는것이 바로 LGWR이다.
SGA의 Redo Log Buffer 의 내용이 Online Redo Log 파일에 내려쓰는 시점은 다음과 같다.
1. 3초마다
2. Commit 이 일어날때 마다
3. Checkpoint 발생시
4. Buffer 가 1MB 가 될때
5. Buffer 가 1/3 이 찼을때

ARCn
Log Switch 가 발생될 때마다 Online RedoLog 는 덮어쓰게 된다. 그렇게 되면 복구시에 데이터 손실을 입을 수 있게 되므로 따로 보관하게 되는데 그 역할을 하는것이 바로 ARCn 이고 저장된 파일은 그림의 'Archive Redo Log File'이 된다.. ARCn을 사용하기 위해서는 spfile 레벨의 설정이 필요하다.(서버 재시작 필요)
설정하는 방법은 아래와 같다.
Alter System set log_archive_start=true scope=spfile; 


관리


RedoLog 다중관리
Redo Log는 안정성을 위해 물리적으로 분산 저장하는게 바람직하다.
예를들어 그룹을 3개 만들고 각 그룹별 맴버를 두개정도 생성한 다음 각 그룹별 맴버를 물리적으로 다른 디스크로 저장하는 것이다.

예)
DISK 1 : redo01_01.rdo, redo02_01.rdo, redo03_01.rdo
DISK 2 : redo01_02.rdo, redo02_02.rdo, redo03_02.rdo
DISK3 : redo01_03.rdo, redo02_03.rdo, redo03_03.rdo


현재 상태 조회
이런 쿼리는 테이블명만 기억하고 스크립트로 저장하여 사용하는것이 편하다. SQL_PLUS 명령어인 >save log 이렇게 log.sql 파일로 저장하여 >@log  이렇게 사용하도록 하자. (이름지정은 마음대로)
SELECT a.group#, a.bytes, a.archived, a.status, b.member
FROM v$log a, v$logfile b 
WHEREa.group# = b.group# 
ORDER BY 1,5

새로운 그룹과 파일 생성
그룹 n를 생성하고 거기에 맴버파일을 생성하는 것이다.
파일 지정 및 사이즈는 옵션이다. 하지만 사이즈는 생성할 때 지정하는게 좋다.
ALTER DATABASE ADD LOGFILE GROUP n [{'..'}] [SIZE n[M|K]];
기존 그룹에 MEMBER 추가
이렇게 기존의 그룹에 새로운 Member 를 추가 할수 있다.
위의 그림과 같은 구성을 위해 아래와 같이 명령을 수행하였다.
ALTER DATABASE ADD LOGFILE MEMBER
'/disk/disk1/redo01_01.rdo' TO GROUP 1
, '/disk/disk2/redo01_02.rdo' TO GROUP 1
, '/disk/disk3/redo01_03.rdo' TO GROUP 1
, '/disk/disk1/redo02_01.rdo' TO GROUP 2
, '/disk/disk2/redo02_02.rdo' TO GROUP 2
, '/disk/disk3/redo02_03.rdo' TO GROUP 2
, '/disk/disk1/redo03_01.rdo' TO GROUP 3
, '/disk/disk2/redo03_02.rdo' TO GROUP 3
, '/disk/disk3/redo03_03.rdo' TO GROUP 3;


그룹의 삭제

ALTER DATABASE DROP LOGFILE GROUP 4;

그룹의 맴버 삭제

그룹의 삭제는 아래와 같은 명령으로 삭제가 가능하다.
하지만 그룹의 상태가 INACTIVE 이거나 UNUSED 상태여야 가능하다.
그래서 삭제하려는 그룹이나 맴버가 CURRENT 일 경우에는 LOG SWITCH를 발생시킨 후 CheckPoint를 발생시켜서 삭제한다.  CheckPoint 이 발생하면 DB Buffer 의 내용을 DBWR이 내려써서 상태가 INACTIVE 로 변경된다.

ALTER SYSTEM SWITCH LOGFILE;
ALTER SYSTEM CHECKPOINT;
삭제

ALTER DATABASE DROP LOGFILE MEMBER
'$ORACLE_HOME/oradata/SID/redo01.log'



이렇게 분산 관리되는 그룹과 맴버는 Disk3번이 물리적으로 망가져도 모든 그룹이 유지&동작하게 되며 각 그룹의 3 번째 맴버만 장애가 발생하므로 운영에는 큰 영향을 미치지 않는다.(Alert Log 에 에러 상황 남김)

$

'Oracle > Architecture' 카테고리의 다른 글

[Storage - 3] Segment  (0) 2012.01.27
[Storage - 2] Extent  (0) 2012.01.27
[Storage - 1] Database Block  (0) 2012.01.26
SHUTDOWN > NOMOUNT > MOUNT > OPEN  (0) 2012.01.24
Oracle Server Architecture 용어 정리  (0) 2012.01.17