ORACLE/Admin

6장 Redo Log 관리하기

히드라야 2015. 3. 30. 10:40

출처: 서진수 강사님 oracle 취업 강좌, 오라클 관리실무 책, 기타 블로그, oracle 공식문서

◎ 역할

□ Redo Log Buffer & LGWR 프로세스 &Disk 간의 구성 

데이터를 변경하기 전 기록, 변경 후 기록을 모두 DB log file 로 기록해둠 

이러한 Instance내에 Redo Log Bufferr 가 내용을 가지고 있음

어떠한 시점이 되면 LGWR이 Redo Log Buffer → log file 로 기록  


◎ Redo Log File 구성 & 관리 

 □  구성 

    -최소 : 2개 그룹과 그룹당 1개의 member을 가질것 (설정할때 무조건 지켜야함)

    -권장 : 3개의 그룹과 2개 이상의 member을 가질 것 

     ※ 한디스크에 같은 그룹의 member가 있으면 안됨 같은 그룹의 맴버가 각각 다른 disk에

        분리되도록 저장을 해야함 

     ※ 그룹안에 맴버간에는 내용과 크기가 동일

   


□ 권장 구성 & 비권장 구성


※ 참고사항 

 Alert Log File에 not completed 메시지 (redo Log File 크기나 그룹이 적다)

     → redo log file 크기를 늘리거나 그룹을 더 만들어줌 

   Checkpoint Not Completed 메시지 (Log Switch 빈번하게 발생)

    → redo log file 크기를 늘리거나 그룹을 더 만들어줌 


□ Redo Log File 상태(disk에 redo log file 이 저장되면 끝)

- CURRENT: LGWR 이 기록하고 있는 상태

- ACTIVE   : BufferCache에서 data file 로 저장이 되지 않은 상태(chekpoint 안됨)

- INACTIVE : redo log도 저장이되고 data file도 저장이된상태 

   ※CURRENT         ACTIVE             INACTIVE

               (Log Switch)           (check point)



◎ disk data를 불러와서 변경 후 저장

 ※ 저장시에 먼저 redo log 기록을 남기고 dbbuffer cache를 남김


□ db buffer cache로 일딴 가져오기 

① 서버프로세스는 DB Buffer Cache에 해당 데이터가 있는 지 확인  

② 없으면 데이터 블록(DB)에서 db buffer cache로 데이터를 가져옴 

③ 이때 db buffer 블록을 Lock 설정 (page fix)

④ PGA 에서 Redo Change Vector 생성 (redo log에 기록할 데이터)


□ PGA 의 redo Change Vector를 Redo Log Buffer 에 복사하기 

① 여러프로세스들이 동시에 작업( redo Change Vector → Redo Log Buffer)하기

   때문에 순서를 위해서는 Latch(래치)를 획득(번호표) 해야함 

 번호표 획득의 순서는 Redo Copy Latche를 먼저 획득 

Redo Copy Latche의 수: _log_simultaneous_copies 파라미터

  Redo Copy Latche 획득 후 Redo Allocation Latch 확보 해야함


Shared Redo Strand 기능(9i): Redo log buffer 의 공간을 여러 곳으로 나누어 Redo Allocation Latch 배치 

_LOG_PARALLELISM : redo log buffer 나누는 갯수 

_LOG_PARALLELISM_DANAMIC : true 시에 자동으로 관리 


Private Redo Strand(10g): shard pool에 strand Change Vector을 저장해 놓고 바로 (zero copy redo 기능)

                                  LGWR이 redo log File 에 기록 (아마 같은 SGA 공간에 있으니 빠른듯)

_LOG_PRIVATE_PARALLELISM :  파라미터 true 시


□ redo log buffer의 내용을 redo log file에 저장 하고, DB Buffer Cache에서 DBWR이 datafile을 저장  

 ① redo log buffer 에 기록된 내용(Redo Entry)을 특정시점에 LGWR 프로세스가 redo log file에 

    기록 (Log file:Current상태)

 ② 기록한 후에는 redo log buffer에 있는 내용은 삭제(FLUSH

 ③ LGWR가 redo log buffer에서 log file로 저장 도중 SCN 꽉차면 Log Switch를 하게됨 

    (Log file: Active 상태)

 ④ 그 시점에서 ckpk 프로세스에서 DWDR에게 checkpoikt를 발생시킴 

 ⑤ CKPT가 control file, data file에 기록(SCN)을 남긴 후 

 ⑥ DWDR이 dbbuffer cache 내용을 data file에 저장 (Log file: INACTIVE상태)



※ SCN : system commit number


※ 특정 시점 

- 3초마다

- Redo Log Buffer 가 1/3 or 1M 넘을 경우

- 사용자가 commit 명령을 수행 할때 

- DBWR이 LGWR에게 쓰기를 요청할때

  



실습

group 추가 절차 2개의 맴버로 

① 추가를 하려면 group 부터 만들어야함 

② group를 만들면 맴버 1개가 있음 

③ 여기서 member를 추가를 해줌 




조회하는 log 파일 만들기

set line 200

col group# for 999

col mb for 999

col member for a45

col seq# for 999

col status for a8

col arc for a5


SELECT a.group#, a.member, b.bytes/1024/1024 MB, b.sequence# "SEQ#", b.status, b.archived "ARC"

FROM v$logfile a, v$log b

WHERE a.group# = b.group#

ORDER BY 1,2

/



[group 추가하기]

alter database add logfile group 4

'/app/oracle/oradata/testdb/redo04_a.log' size 5M;


[member 추가하기]

alter database add logfile member

'/app/oracle/oradata/testdb/redo04_b.log' to group 4;



[ACTIVE 상태로 만들기 위해]

SYS>alter system switch logfile;


[INACTIVE 상태로 만들기 위해] 

SYS>alter system checkpoint;


[맴버 삭제 하기]

alter database drop logfile member

'/app/oracle/oradata/testdb/redo04_b.log';


[그룹 삭제]

alter database drop logfile group 4 ;


※ redo log를 맴버추가, 그룹추가를 해서 구성하는 것을 배움

   → 그룹에서 지운 맴버를 OS 에서 redo log를 제거 해야함 

(이때 가능하면 DB 꺼진 상태에서 지울것 아니면 DB가 안꺼짐..)    


  기존의 데이터를 복사해서 구성 후에 control 파일을 수정 할수도

있음(redo log 경로만 바꾸고 싶을 경우)


alter database rename

file '/app/oracle/oradata/testdb/redo01.log'

to '/app/oracle/disk4/redo01_a.log';



[연습문제]

oracle/disk1/redo01.a.rdo, redo02.a.rdo redo03.a.rdo, ctrl01.ctl

       /disk2/redo01.b.rdo, redo02.b.rdo redo03.b.rdo, ctrl02.ctl

       /disk3/redo01.c.rdo, redo02.c.rdo redo03.c.rdo, ctrl03.ctl



group1개 member1개인데 member 지우려고 하면 에러됨 


ORA-00361: cannot remove last log member /app/oracle/oradata/testdb/redo04_a.log for group 4




Current 상태에서 지우려고 하면 에러


ERROR at line 1:

ORA-01609: log 4 is the current log for thread 1 - cannot drop members

ORA-00312: online log 4 thread 1: '/redo/disk1/redo04_a.log'

ORA-00312: online log 4 thread 1: '/redo/disk2/redo04_b.log'



맴버1개 그룹 2개일때 1개그룹 지우려고 하면


ERROR at line 1:

ORA-01567: dropping log 2 would leave less than 2 log files for instance testdb (thread 1)

ORA-00312: online log 2 thread 1: '/app/oracle/oradata/testdb/redo02.log'


Check Point

 그룹 만들기

 그룹에 멤버 추가하기

 멤버 삭제하기

 그룹 삭제하기 

 파일삭제하기