6장 Redo Log 관리하기
출처: 서진수 강사님 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상태)
※ 특정 시점
- 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
그룹 만들기
그룹에 멤버 추가하기
멤버 삭제하기
그룹 삭제하기
파일삭제하기