본문 바로가기

Program/Oracle

[Oracle] Oracle Startup & Shutdown (Redo Log File)

정성 가득한 글을 작성하신 원작자님께 감사드린다.

출처 : http://blog.naver.com/zoshstbt/50131782175



Redo Log File은 LGWR(Log Writer)에 의하여 Redo Log Buffer에 기록된 내용을 기록해 두는 파일로서, Redo Log Buffer에 기록된 데이터베이스의 변경 사항들은 추후 장애 발생 시 데이터를 복구하는데 사용된다.


변경사항이 Data File에 저장되는 과정에서 Redo Log File의 역할을 그림으로 나타내면 다음과 같다.


1. LGWR(Log Writer)에 의한 Redo Log File에 쓰기

 

 DML 쿼리에 의해서 변경된 데이터가 Redo Log Buffer에 변경내용이 저장되고, Database Buffer Cache에 저장되어 있는 상태로 File에는 저장이 안되어 있는 상태라고 가정한다.

 이때 commit 명령이 발생되면 LGWR Process가 Redo Log Buffer에 저장된 변경 내용을 SCN(system commit number)를 붙여서 Redo Log File에 저장한다. 데이터가 Redo Log File에 저장된 후 Redo Log Buffer에 기록된 변경내용은 삭제된다.

 LGWR은 해당 데이터를 Redo Log File에 저장한 후 각각의 commit 데이터에 부여한 SCN의 최종 번호를 Control File내의 commit SCN 부분에 기록한다.



2. Log Switch 발생에 따른 변화

 

 


 LGWR이 Redo Log File에 기록을 하던 중 공간이 부족하여 다음 파일에 Redo Log Buffer의 변경내용을 기록하는 것을

Log Switch가 발생하였다고 한다. 이렇게 log switch가 발생되게 되면 CKPT Process가 이를 감지하여 checkpoint 신호를 발생시키게 된다.

 Redo Log File의 상태

  • Current
    • 현재 LGWR에 의해서 Redo Log Buffer의 내용이 기록되고 있는 파일의 상태를 Current 상태라 한다.
  • Active
    • 파일의 공간이 모두 채워져서 log switch로 인하여 다른 파일로 Current 상태가 넘어간, 하지만 저장된 내용은 Data File에 기록되지 않은 log 파일의 상태를 Active 상태라 한다.
  • InActive
    • Redo Log File에 저장되어 있는 내용이 Data File에도 저장되어 있는 상태의 log 파일
    • 이 상태에서만 해당 redo log file을 삭제할 수 있다.


3. checkpoint 신호 발생에 따른 변화

 

 


 CKPT Process는 log switch를 감지한 후 DBWR에게 Database Buffer Cache에 저장된 내용을 Data File에 저장하도록 checkpoint 신호를 전달한다. 이때 DBWR에 의해서 Disk File에 데이터가 저장될 때 맨 앞부분에는 해당 SCN의 마지막 번호가 써지게 된다.

 CKPT Process는 DBWR Process에게 신호를 전달 한 후 Control File에 직접 checkpoint SCN을 써넣는다.

 Control File에 저장되는 commit SCN과 checkpoint SCN의 차이점

  • commit SCN
    • commit등에 의해서 LGWR이 Redo Log Buffer의 내용을 Redo Log File에 저장할때마다 부여한 SCN과 동기화가 이루어진다.(Redo Log File에 commit된 데이터의 SCN 번호와 commit SCN 번호가 일치한다; commit 시마다 업데이트 된다.)
  • checkpoint SCN
    • commit에 의해 Redo Log File에 데이터가 저장될때 같이 갱신되는 것이 아니라, checkpoint 신호를 통해서 Database Buffer Cache에 저장된 내용이 한번에 Data File로 저장될 때, 이때의 저장되는 데이터 양만큼을 나타낸다.

간략한 Instance Recovery 원리

 

 

①과정을 통하여 Instance Recovery가 진행되게 되는데 이때 control file과 data file의 헤더정보가 사용된다. 위에서 나타난 것처럼 control file에는 현재 Redo Log File에 저장된 데이터의 SCN 번호가 저장되어 있으며, data file에도 현재 저장된 데이터에 대한 SCN 번호가 저장되어 있다.

이 두개의 SCN 번호 중에서 control file에 존재하는 SCN 번호가 더 크다면, commit이 되어 Redo Log File에는 데이터가 저장이 되었으나, Data File에는 정상적으로 데이터가 저장되지 않은 것이기 때문에 모자란 SCN 숫자만큼 Redo Log File에서 해당 데이터를 복구할 수 있게 된다.


*하지만 control file에 저장된 SCN 번호가 더 작은 경우 startup 과정에서 control file version 오류를 일으킨다.


4. Redo Log File의 구조


 


 Oracle에서 Redo Log File의 최소 그룹 수는 2개이며, 그룹당 최소 멤버의 수는 1개이다.

* 실제 운영상에서는 최소 3개의 그룹과 그룹당 2개 이상의 멤버가 있어야 안정적으로 Oracle을 운영할 수 있다.

 checkpoint를 발생시키는 log switch는 그룹 순환적으로 발생한다.(라운드 로빈 방식)

 같은 그룹안의 멤버 log 파일의 크기와 내용은 동일하다.

 Database 복구에 중요한 역할을 하기 때문에 그룹의 각 멤버를 다른 위치에 분산시켜서 관리하는 것이 안전하다.

 그룹의 각 멤버가 여러개일 경우 병렬로 동시에 같은 내용을 기록하지만, 멤버가 동일한 디스크에 있을 경우 직렬로 기록한다.


5. Redo Log File 관리(명령어)

현재 Redo Log File을 구성하는 그룹과 멤버 파일 확인


select a.group#, a.member, b.sequence#, b.bytes/1024/1024 MB, b.archived, b.status

from v$logfile a, v$log b

where a.group# = b.group#

order by 1,2;


 


 

Redo Log File 그룹 추가


alter database add logfile group 4

('/home/oracle/oradata/redo04_a.log',

'/home/oracle/oradata/redo04_b.log') size 5M;



그룹을 추가하면서 멤버로 하나 이상의 파일을 생성하는 경우 해당 파일들을 () 괄호로 묶어 줘야 한다.

...size 5M -> 그룹의 각 멤버 파일의 크기를 5MB로 설정하겠다는 의미이다.(생략할 수 없다)



Redo Log File 멤버 추가


alter database add logfile member

'/home/oracle/disk5/redo03_d.log' to group 3;



alter database 문 마지막에 추가되고자 하는 그룹의 번호를 명시해줘야 한다.



Redo Log File 그룹 삭제


alter database drop logfile group 3;



그룹 3번이 삭제된 것을 확인할 수 있다. 하지만 alter database 문으로 Redo Log File을 제거하는 것은 control file에 기록되어있는 Redo Log File의 정보를 제거하는 것으로 실제 파일은 삭제되지 않은채로 남아있다.

때문에 다음과 같이 직접 파일을 삭제해야 한다.


SQL> !rm /home/oracle/disk5/redo03_d.log

SQL> !rm /home/oracle/disk5/redo03_c.log

SQL> !rm /home/oracle/disk4/redo03_b.log

SQL> !rm /home/oracle/disk3/redo03_a.log


위에서 Redo Log File의 최소 그룹의 수는 2개라고 했었다. 그룹이 2개 남아있는 상태에서 하나를 지우려고 할 경우 다음과 같은 오류와 함께 제거 되지 않는다.


SQL> alter database drop logfile group 1;

alter database drop logfile group 1

*

ERROR at line 1:

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

ORA-00312: online log 1 thread 1: '/home/oracle/disk3/redo01_a.log'

ORA-00312: online log 1 thread 1: '/home/oracle/disk4/redo01_b.log'

ORA-00312: online log 1 thread 1: '/home/oracle/disk5/redo01_c.log'



Redo Log File 멤버 삭제



위의 목록에서 그룹 3의 redo03_a.log 멤버 파일을 제거 하겠다.


alter database drop logfile member

'/home/oracle/oradata/redo03_a.log';



위에서 Redo Log File의 각 그룹은 최소 한개 이상의 멤버를 가져야 한다고 했었다.

그룹 3의 redo03.log 파일을 제거하면 다음과 같은 오류가 발생한다.


SQL> alter database drop logfile member

2 '/home/oracle/oradata/redo03.log';

alter database drop logfile member

*

ERROR at line 1:

ORA-00361: cannot remove last log member /home/oracle/oradata/redo03.log for group 3



Redo Log File의 멤버 상태의 강제 변경


위에서 언급했던 것과 같이 log 파일에는 상태가 존재하며, 삭제가 가능한 상태는 모든 데이터가 Data File에 저장되었음을 나타내는 InActive 상태이다. (Active 상태도 삭제가 되기는 하지만 현재 commit 되어있는 상태로 Data File에 저장이 되어 있지 않기 때문에 절대로 삭제해서는 안된다)

log 파일의 상태가 Current 일때 멤버 파일을 삭제하면 다음과 같은 오류가 발생한다.



SQL> alter database drop logfile member

2 '/home/oracle/disk5/redo01_c.log';

alter database drop logfile member

*

ERROR at line 1:

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

ORA-00312: online log 1 thread 1: '/home/oracle/disk3/redo01_a.log'

ORA-00312: online log 1 thread 1: '/home/oracle/disk4/redo01_b.log'

ORA-00312: online log 1 thread 1: '/home/oracle/disk5/redo01_c.log'


때문에 log 파일의 상태를 변경해 주어야 하는데 강제로 log switch를 발생시키는 방법을 사용한다.


현재 Redo Log File의 상태는 위에 나타난 그림과 같을 경우 다음과 같이 명령을 실행하면 상태가 변경된다.


alter system switch logfile;



log 파일의 상태가 log switch 가 발생하여 Active 상태로 변경되었다. 이제 Active상태(commit 완료되고, Data File에만 저장되지 않은 상태)이므로 다음과 같이 checkpoint 를 강제로 발생 시켜서 InActive 상태로 변경할 수 있다.


alter system checkpoint;


 


출처 : http://blog.naver.com/zoshstbt/50131782175