Tablespace와 Datafile 관리하기


1. Data File  이동

- 특정 디스크에 있는 데이터 파일들의 용량이 점점 증가하여 다른 더 큰 용량의 디스크를 설치 한 후 Data file을 이동시 사용.

- 절대 Datafile을 사용중일 때는 절대로 이동시키거나 복사하면 안된다.

* Tablespace를 Offline 하거나, Shutdown 한 후 작업.


1-1 Tablespace Offline 후 경로변경.


- 기존 경로 : /u01/app/oracle/oradata/PROD/

- 변경 경로 : /home/oracle/datamovedest1

                  /home/oracle/datamovedest2


1. 디렉토리 생성


[oracle@edydr1p0-PROD ~]$ pwd

/home/oracle

[oracle@edydr1p0-PROD ~]$ mkdir datamovedest1

[oracle@edydr1p0-PROD ~]$ mkdir datamovedest2



2. DB 접속 후 테이블 스페이스 Off Line 변경.

 

SYS@PROD>@tbs_auto_status

 

TABLESPACE   MB FILE_NAME  AUT ONLINE_

---------- ---------- -------------------------------------------------- --- -------

SYSTEM   400 /u01/app/oracle/oradata/PROD/system01.dbf  NO  SYSTEM

SYSAUX   200 /u01/app/oracle/oradata/PROD/sysaux01.dbf  NO  ONLINE

UNDOTBS1   200 /u01/app/oracle/oradata/PROD/undotbs01.dbf NO  ONLINE

USERS   50 /u01/app/oracle/oradata/PROD/users01.dbf NO  ONLINE

EXAMPLE   100 /u01/app/oracle/oradata/PROD/example01.dbf NO  ONLINE

HAKSA   20 /u01/app/oracle/oradata/PROD/haksa01.dbf YES ONLINE

HAKSA   20 /u01/app/oracle/oradata/PROD/haksa02.dbf NO  ONLINE

 

7 rows selected.

 

SYS@PROD>alter tablespace haksa offline;

 

Tablespace altered.

 

SYS@PROD>@tbs_auto_status

 

TABLESPACE   MB FILE_NAME  AUT ONLINE_

---------- ---------- -------------------------------------------------- --- -------

SYSTEM   400 /u01/app/oracle/oradata/PROD/system01.dbf  NO  SYSTEM

SYSAUX   200 /u01/app/oracle/oradata/PROD/sysaux01.dbf  NO  ONLINE

UNDOTBS1   200 /u01/app/oracle/oradata/PROD/undotbs01.dbf NO  ONLINE

USERS   50 /u01/app/oracle/oradata/PROD/users01.dbf NO  ONLINE

EXAMPLE   100 /u01/app/oracle/oradata/PROD/example01.dbf NO  ONLINE

HAKSA       /u01/app/oracle/oradata/PROD/haksa01.dbf     OFFLINE

HAKSA       /u01/app/oracle/oradata/PROD/haksa02.dbf     OFFLINE

 

7 rows selected.

 


3. Off Line 이후 해당 옮기는 경로로 데이터파일 복사

 

[oracle@edydr1p0-PROD script]$ cp /u01/app/oracle/oradata/PROD/haksa01.dbf /home/oracle/datamovedest1  

[oracle@edydr1p0-PROD script]$ cp /u01/app/oracle/oradata/PROD/haksa02.dbf /home/oracle/datamovedest2



4. DB에서 테이블스페이스 설정경로 확인 및 변경.


 

SYS@PROD>select name from v$datafile;

 

NAME

---------------------------------------------------------------

/u01/app/oracle/oradata/PROD/system01.dbf

/u01/app/oracle/oradata/PROD/sysaux01.dbf

/u01/app/oracle/oradata/PROD/undotbs01.dbf

/u01/app/oracle/oradata/PROD/users01.dbf

/u01/app/oracle/oradata/PROD/example01.dbf

/u01/app/oracle/oradata/PROD/haksa01.dbf

/u01/app/oracle/oradata/PROD/haksa02.dbf

 

7 rows selected.

 => Haksa data file기존경로


 

 

SYS@PROD>alter tablespace haksa rename

    datafile '/u01/app/oracle/oradata/PROD/haksa01.dbf'

    to '/home/oracle/datamovedest1/haksa01.dbf';

 

Tablespace altered.

 

SYS@PROD>alter tablespace haksa rename

   datafile '/u01/app/oracle/oradata/PROD/haksa02.dbf'

    to '/home/oracle/datamovedest2/haksa02.dbf';

 

Tablespace altered.

 

SYS@PROD>select name from v$datafile;

 

NAME

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

/u01/app/oracle/oradata/PROD/system01.dbf

/u01/app/oracle/oradata/PROD/sysaux01.dbf

/u01/app/oracle/oradata/PROD/undotbs01.dbf

/u01/app/oracle/oradata/PROD/users01.dbf

/u01/app/oracle/oradata/PROD/example01.dbf

/home/oracle/datamovedest1/haksa01.dbf

/home/oracle/datamovedest2/haksa02.dbf

 

7 rows selected.

=> 경로 설정 변경된것 확인

 

4. 해당 Tablespace 다시 Online으로 변경.


SYS@PROD>@tbs_auto_status

 

TABLESPACE   MB FILE_NAME  AUT ONLINE_

---------- ---------- -------------------------------------------------- --- -------

SYSTEM   400 /u01/app/oracle/oradata/PROD/system01.dbf  NO  SYSTEM

SYSAUX   200 /u01/app/oracle/oradata/PROD/sysaux01.dbf  NO  ONLINE

UNDOTBS1   200 /u01/app/oracle/oradata/PROD/undotbs01.dbf NO  ONLINE

USERS   50 /u01/app/oracle/oradata/PROD/users01.dbf NO  ONLINE

EXAMPLE   100 /u01/app/oracle/oradata/PROD/example01.dbf NO  ONLINE

HAKSA       /home/oracle/datamovedest1/haksa01.dbf     OFFLINE

HAKSA       /home/oracle/datamovedest2/haksa02.dbf     OFFLINE

 

7 rows selected.

 

SYS@PROD>alter tablespace haksa online;

 

Tablespace altered.

 

SYS@PROD>@tbs_auto_status

 

TABLESPACE   MB FILE_NAME  AUT ONLINE_

---------- ---------- -------------------------------------------------- --- -------

SYSTEM   400 /u01/app/oracle/oradata/PROD/system01.dbf  NO  SYSTEM

SYSAUX   200 /u01/app/oracle/oradata/PROD/sysaux01.dbf  NO  ONLINE

UNDOTBS1   200 /u01/app/oracle/oradata/PROD/undotbs01.dbf NO  ONLINE

USERS   50 /u01/app/oracle/oradata/PROD/users01.dbf NO  ONLINE

EXAMPLE   100 /u01/app/oracle/oradata/PROD/example01.dbf NO  ONLINE

HAKSA   20 /home/oracle/datamovedest1/haksa01.dbf YES ONLINE

HAKSA   20 /home/oracle/datamovedest2/haksa02.dbf NO  ONLINE

 

7 rows selected.

 

5. 정보조회가 가능한지 확인.


SYS@PROD>select count(*) from scott.iphak;

 

  COUNT(*)

----------

    650000


 


1-2 Offline 안되는 테이블스페이스의 Datafile이동

- System Tablespace, 사용중인 Undo Tablespace, default temporary tablespace 해당 테이블스페이스는 Offline이 불가능 하므로, DB 종료 후 진행해야한다.


- Off Line  불가능 확인

 SYS@PROD>alter tablespace system offline;

alter tablespace system offline

*

ERROR at line 1:

ORA-01541: system tablespace cannot be brought offline; shut down if necessary

 

 

SYS@PROD>alter tablespace undotbs1 offline;

alter tablespace undotbs1 offline

*

ERROR at line 1:

ORA-30042: Cannot offline the undo tablespace

 


- 실습

1. DB종료 및 Mount 단계까지 기동.

 

SYS@PROD>shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SYS@PROD>startup mount

 

ORACLE instance started.

 

Total System Global Area  417546240 bytes

Fixed Size     2213936 bytes

Variable Size   327157712 bytes

Database Buffers   83886080 bytes

Redo Buffers     4288512 bytes

Database mounted.



2. 변경할 디렉토리 생성 및 System datafile 복사


SYS@PROD>!mkdir /home/oracle/systemdest

  

SYS@PROD>!cp /u01/app/oracle/oradata/PROD/system01.dbf /home/oracle/systemdest

 


SYS@PROD>select instance_name from v$intance;

select instance_name from v$intance

                          *

ERROR at line 1:

ORA-01219: database not open: queries allowed on fixed tables/views only

* MOUNT 상태기 때문에 조회불가능. 

 

3. 기존 Data file 경로 확인 및 Data file 경로변경.

SYS@PROD>select name from v$datafile;

 

NAME

---------------------------------------------------------------

/u01/app/oracle/oradata/PROD/system01.dbf

/u01/app/oracle/oradata/PROD/sysaux01.dbf

/u01/app/oracle/oradata/PROD/undotbs01.dbf

/u01/app/oracle/oradata/PROD/users01.dbf

/u01/app/oracle/oradata/PROD/example01.dbf

/home/oracle/datamovedest1/haksa01.dbf

/home/oracle/datamovedest2/haksa02.dbf

 

7 rows selected.

 

SYS@PROD>alter database rename  

  2  file '/u01/app/oracle/oradata/PROD/system01.dbf'

  3  to '/home/oracle/systemdest/system01.dbf';

 

Database altered.

 


4. 경로변경 확인  및 데이터베이스 OPEN


SYS@PROD>select name from v$datafile;

 

NAME

--------------------------------------------------------------

/home/oracle/systemdest/system01.dbf

/u01/app/oracle/oradata/PROD/sysaux01.dbf

/u01/app/oracle/oradata/PROD/undotbs01.dbf

/u01/app/oracle/oradata/PROD/users01.dbf

/u01/app/oracle/oradata/PROD/example01.dbf

/home/oracle/datamovedest1/haksa01.dbf

/home/oracle/datamovedest2/haksa02.dbf

 

7 rows selected.

 

SYS@PROD>alter database open;

 

Database altered.

 


1-3 Redo Log File  이동

- Redo Log File 또한 Offline 불가능 하므로 Database를 Mount 상태로 변경 후 작업해야함.


1. Redo log file 경로 확인 및 DB MOUNT 상태로 변경


 SYS@PROD>@log       

 

GROUP# MEMBER       MB SEQ# STATUS       ARC

------ --------------------------------------------- ---- ---------- ---------------- -----

     1 /u01/app/oracle/oradata/PROD/redo01a.log       100   27 CURRENT       NO

     2 /u01/app/oracle/oradata/PROD/redo02a.log       100   25 INACTIVE       YES

     3 /u01/app/oracle/oradata/PROD/redo03a.log       100   26 INACTIVE       NO

 


SYS@PROD>select status from v$instance;

 

STATUS

------------

OPEN

 

SYS@PROD>shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SYS@PROD>startup mount

ORACLE instance started.

 

Total System Global Area  417546240 bytes

Fixed Size     2213936 bytes

Variable Size   327157712 bytes

Database Buffers   83886080 bytes

Redo Buffers     4288512 bytes

!Database mounted.


2. 경로 이동할 디렉토리 생성 및 Redo log file  복사


SYS@PROD>! mkdir /home/oracle/redodest

 

SYS@PROD>! rmdir /home/oracle/redodest

 

SYS@PROD>! mkdir /home/oracle/redodest1

 

SYS@PROD>! mkdir /home/oracle/redodest2


SYS@PROD>!cp /u01/app/oracle/oradata/PROD/redo01a.log

cp: missing destination file operand after `/u01/app/oracle/oradata/PROD/redo01a.log'

Try `cp --help' for more information.

 

SYS@PROD>!cp /u01/app/oracle/oradata/PROD/redo01a.log /home/oracle/redodest1/redolog01_a.log

 

SYS@PROD>!cp /u01/app/oracle/oradata/PROD/redo02a.log /home/oracle/redodest1/redolog02_b.log

 

SYS@PROD>!cp /u01/app/oracle/oradata/PROD/redo03a.log /home/oracle/redodest1/redolog03_c.log


3. Redolog file 경로 변경.


SYS@PROD>alter database rename

  2  file '/u01/app/oracle/oradata/PROD/redo01a.log'

  3  to '/home/oracle/redodest1/redolog01_a.log';

 

Database altered.

 

SYS@PROD>alter database rename

  2  file '/u01/app/oracle/oradata/PROD/redo02a.log'  

  3  to '/home/oracle/redodest1/redolog02_b.log'

  4  ;

 

Database altered.


SYS@PROD>alter database rename

  2  file '/u01/app/oracle/oradata/PROD/redo03a.log'

  3  to '/home/oracle/redodest1/redolog03_c.log';

 

Database altered.


4. Redo log 경로 변경 확인

 

SYS@PROD>select member from v$logfile;

 

MEMBER

---------------------------------------------

/home/oracle/redodest1/redolog01_a.log

/home/oracle/redodest1/redolog02_b.log

/home/oracle/redodest1/redolog03_c.log

 

SYS@PROD>@log

 

GROUP# MEMBER       MB SEQ# STATUS       ARC

------ --------------------------------------------- ---- ---------- ---------------- -----

     1 /home/oracle/redodest1/redolog01_a.log       100   27 CURRENT       NO

     2 /home/oracle/redodest1/redolog02_b.log       100   25 INACTIVE       YES

     3 /home/oracle/redodest1/redolog03_c.log       100   26 INACTIVE       NO

 

 



1-4 Tablespace 삭제하기.

- 테이블스페이스에 테이블이 하나라도 있으면 그냥 안지워진다.

 - including contents and datafiles 옵션을 통해 삭제.


 SYS@PROD>drop tablespace haksa;

drop tablespace haksa

*

ERROR at line 1:

ORA-01549: tablespace not empty, use INCLUDING CONTENTS option

 

 

SYS@PROD>drop tablespace haksa including contents and datafiles;

 

Tablespace dropped.

 

SYS@PROD>@tbs_auto_status

 

TABLESPACE   MB FILE_NAME   AUT ONLINE_

---------- ---- -------------------------------------------------- --- -------

SYSTEM     400 /home/oracle/systemdest/system01.dbf   NO  SYSTEM

SYSAUX     200 /u01/app/oracle/oradata/PROD/sysaux01.dbf   NO  ONLINE

UNDOTBS1    200 /u01/app/oracle/oradata/PROD/undotbs01.dbf   NO  ONLINE

USERS     50 /u01/app/oracle/oradata/PROD/users01.dbf   NO  ONLINE

EXAMPLE     100 /u01/app/oracle/oradata/PROD/example01.dbf   NO  ONLINE


=> 학사 테이블스페이스 제거 확인.

 



6-2. Redo Log File 구성 및 관리하기. 



Redo Log File 구성 및 관리하기


1) Redo Log Buffer와 Redo Log File

 



- Redo Log File은 그룹과 멤버라는 개념으로 관리됨.

- Oracle 7 버전 이후부터 같은 내용을 여러곳에 중복으로 저장하는 그룹이란 개념이 등장

- 위 그림은 Redo Log Group 3개가 있고, Member 로 2개씩 존재하는 구성

- 같은 그룹의 Member 들은 같은 내용을 담고있다.

- Member를 많이 추가하면 안정적일 수는 있지만, 기록시간이 커서 부하를 줄 수 있으므로 구성을 잘 해야한다.

- 같은 그룹의 멤버는 서로 다른 디스크에 저장되는것을 권장한다.


* 오라클에서 최소 그룹의 개수는 2개이며, 그룹별로 필요한 최소 Member 갯수는 1개다.

* *  장애를 대비하여 그룹은 최소 3개와 각 그룹별 최소 2개이상의 Member 구성을 권장함.

- LGWR이 Redo Log Buffer의 내용을 Redo Log File에 내려쓰다가 해당 파일이 가득 차게되면 Log Switch가 발생하여 자동으로 다음 그룹으로 넘어가게된다.

 * Log Switch가 발생하게 되면 Checkpoint 신호가 발생하게된다.

=> Check point 신호 발생 시 DBWR은 해당 로그파일에 있는 내용 중 DB Buffer Cache에서 데이터파일로 저장되지 못한 변경사항을 내려쓰게 되며, 이 정보들을 Data file과 Control file에 반영된다.

- 다음 그룹역시 가득 찰 경우 다음 Redo Log 그룹으로 넘어간다.

* Log Switch가 일어나는 그룹의 순서는 Oracle이 라운드 로빈 방식으로 결정하게된다.

(1번 그룹 다음 2번그룹이 아니라 3번일 수 있다는 뜻.)

- 같은 그룹 안의 Member들 끼리는 서로 저장하고 있는 내용과 크기가 동일하다.

- LGWR은 Redo Log File의 그룹의 멤버가 여러 개일 경우 병렬로 동시에 같은 내용을 기록한다.

(같은 디스크에 있을 경우 하나 기록후 끝나고 하나 기록하는 식의 직렬로 기록) 

* 병렬쓰기 도중 Redo Log File이 삭제되었다든지 Block에 문제가 생겼다든지 문제가 생길 경우 LGWR은 각 오픈 로그 멤버의 상태를 조사해서 어떤 파일이 에러가 발생되는지 알아낸다.

 장애가 난 멤버는 Control File의 STALE이라는 상태로 기록하고, LGW은 Trace file에 ORA-00346에러를 기록한다.

- LGWR이 하나의 로그파일에서 4개이상의 에러를 만나게 되면 로그파일을 닫고 더이상 그 파일에 내용을 기록하지 않는다. 만약 LGWR이 어떤 로그 파일에도 내용을 기록할 수 없다면 ORA-00340 에러를 발새시키고Shutdown abort로 강제종료되고 Startup되지 않는다.


** Redo Log file 크기는 각 서버에 맞게 사용해야하며, Redo Log File크기가 너무 작을 경우 LOG SWITCH가 자주 발생하게되어 성능저하가 될 수 있고, 너무 크면 데이터의 손상 가능성이 커지므로 설정을 잘해야한다.

 보통  1시간에 Log Switch가 2~3회 발생하게 설정하는 것을 추천하지만, 서버실정에 맞게 설정해야한다.

** Alert Log File에 checkpoint not completed 메세지가 나오면 Redo Log File 크기나 그룹의 개수가 작다는 의미로 멤버 크기를 크게 만들거나, 그룹을 더 만들어주어야한다.

** checkpoint not completed 메세지는 Log Switch가 너무 빈번하게 일어날 경우 DBWR이 이전에 발생한 Check point 내용을 Data file에 다 기록을 못한 상태에서 다시 Log Switch가 발생하여 checkpoint 신호가 들어올 경우 발생한다.

 






Redo Log 관리하기.


- 오라클에서는 데이터가 변경될 경우 장애를 대비해 변경되기 전의 내용과 변경된 후의 내용을 기록해둔다.

- 기록되는 장소 중 메모리는 Redo Log Buffer

- 기록되는 장소 중 파일은 Redo Log File


- Write Log Ahead: 

데이터를 변경하기전에 Redo Log에 먼저 기록 후 데이터를 변경한다.( LGWR 작동 후 DBWR 작동.)


- Log Forace at commit:

 * 사용자로부터 Commit요청이 들어오면 관련된 모든 Redo Recode들을 redo Log file에 저장한 후 Commit을 완료한다.

 * 대량의 데이터 변경 후 Commit이 한꺼번에 수행되면 악영향을 미칠 수 있기 때문에, Delayed commit 이나 

Commit을 아주 짧은 시간 동안 모아서 한꺼번에 수행하는 Group commit이란 기술이 등장함.

 * LGWR이 Redo Log를 다 기록한 후 DBWR이 데이터를 기록하는 동기식 커밋에서 성능문제 때문에 비동기식 커밋 기술도 등장함(11gR2)


 Redo Log 생성원리.

- 데이터에 변경이 생기는 SQL(DML, DDL, DCL 등)을 실행했을 때 Redo Log에 기록된다.


 1)사용자가 특정 데이터 변경을 요청하는 쿼리를 수행하면, 해당 SQL을 받은 서버프로세스는 원하는 Block이 DB Buffer cache에 있는지 확인한다. (없는 경우 파일에서 BLOCK을 복사해서 DB Buffer Cache로 가져온다.)

해당 Block을 다른사람이바꿀 수 없도록 Lock을 설정한 후 PGA에 Redo Change Vector 생성.


* Redo Change Vector: 변경된 데이터를 나중에 복구할 목적으로 redo log에 기록할 변경된 데이터에 대한 모든 정보의 세트를 의미.

* Redo Log는 트랜잭션의 변경을 복구할 용도로 기록됨.

(COMMIT된 데이터를 복구할 때도 사용되지만, Rollback데이터를 복구할 경우에도 사용됨)

* DB가 강제 종료되었을 경우 rollback되지 못한 데이터 모두 rollback 해야하므로, Change Vector내에 Undo관련 내용까지 함께 저장됨.

* PGA상에 만들어지는 Redo Change Vector는 Redo Record Format으로 Row단위로 Redo Log Buffer에 복사된다.


2)서버프로세스는 PGA에서 Change Vector를 생성한 후 Redo Log Buffer에서 필요한 용량을 계산한다. PGA에 생성된 Change Vector를 redo log buffer에 복사하기 위해 필요한 Latch를 획득해야한다.

 * 첫 번째로 Redo Log Buffer에 내용을 쓰기위해서는 Redo Copy Latch를 획득해야함. 여러개의 서버프로세스가 동시에 데이터를 변경하려 한다면, Redo copy Latch를 획득하는 과정에서 경합이 발생할 수 있다.

* Redo copy latch는 Change Vector가 모두 Redo Log buffer에 기록될 때까지 계속 가지고 있어야한다.

* Redo Copy Latch를 획득하기 위해 대기하는경우 Latch: Redo Copy 대기이벤트가 발생한다.


redo copy latch 갯수 확인. (기본적으로 CPU * 2의 redo copy latch가 조회됨)

 

SQL> select name, gets, misses, immediate_gets, wait_time

from v$latch_children

where name='redo copy';

  2    3  

NAME     GETS     MISSES IMMEDIATE_GETS  WAIT_TIME

------------- ---------- ---------- -------------- ----------

redo copy       6   0 0     0

redo copy       6   0     27648     0


=> 2개. 


3) Redo Copy Latch를 확보한 서버 프로세스는 Redo Log buffer에 내용을 기록하기위해 Redo Allocation Latch를 확보해야한다.

*  8i버전까지는 Redo Allocation Latch는 1개 밖에 없어서 데이터 변경이 많이 되는 서버일 경우 Redo Allocation Latch를 확보하기위해 경합이 발생할 수 있었다.

*  9i 버전부터 Redo Log Buffer를 여러개의 공간으로 나누어서 각 공간별로 Redo Allocation latch를 할당해주는 Shared Redo strand라는 기능이 도입됨. 10g 버전부터  LOG_PARALLELISM파라미터가 _LOG_PARALLELISM으로 변경되고 이 파라미터의 값을 Oracle이 동적으로 관리하도록_LOG_PARALLELISM_DYNAMIC 파라미터가 추가됨.

(True로 설정할 경우 Oracle이 Strand 개수를 자동으로 제어하도록 설정할 수 있다.)

*  10g 버전부터 자동으로 여러 개의 Redo Allocation Latch의 값이 생성되어 있음을 확인할 수 있다.


 SELECT count(*)

from v$latch_children

where name='redo allocation';


 COUNT(*)

----------

 

19


   

*  10g 버전부터 Private Redo Strand기능이 도입됨. 각 서버프로세스는 Shared Pool에 자신만의 독립적인 private strand 공간을 마들어서 그곳에 Change Vector를 생성한 후 필요할 경우 LGWR이 Redo log file에 바로 기록하게된다.

* private redo strand 기능은 latch를 확보해서 redo log buffer에 기록해야하는 과정을 줄이으로써 성능을 더 향상시킬 수 있다.(Zero copy redo 라고함) => 히든파라미터인 _LOG_PRIVATE_PARALLELISM=TRUE로 설정하면 활성화 할 수 있다.


4) Redo Log Buffer에 기록된 내용들(Redo Log Buffer에 기록된 Change Vector를 Redo Entry라고도함)은 특정 상황이되면 LGWR이 일부를 Redo Log File에 기록한 후 기록된 Redo Entries들은 Redo Log Buffer에서 삭제함.

 * Server Process는 Redo Writing Latch를 확보한 후 Redo Log Buffer에 있는 내용을 Redo Log File 에 기록하라고 요청함.

 - Redo Log Buffer의 내용을 Redo Log File에 기록되는 경우

   1) 3초마다.

 LGWR프로세스는 할일이 없을경우 sleep 상태로 있다가 rdbms ipc message라는 대기 이벤트의 time out이 되는 시점인 3초마다 한번씩 wake up 하여 Redo log buffer에서 redo log file로 기록할 내용이 있을 경우 내려쓰고, 해당 내용을 redo log buffer에서 삭제한다.

   2) Redo Log Buffer 크기가 1/3 찼거나 1M 가 넘을 경우

 서버프로세스는 redo Log Buffer를 할당 받을 때마다 현재 사용된 Log Buffer의 Block수를 계산한다.

현재 사용된 Log buffer의 Block 수가 _LOG_IO_SIZE의 값보다 많을 경우 LGWR에게 Redo Log Buffer의 내용을 Redo Log file에 기록하도록 요청한다.

   3) 사용자가 COMMIT 또는 ROLLBACK을 수행할 때.

 사용자가 COMMIT  또는 ROLLBACK을 수행할 경우 내부적인 관리번호인 SCN이 생성되어 해당 트랜잭션에 할당되고 관리된다.

   4) DBWR이 LGWR에게 쓰기를 요청할 때.

 ORACLE 8i 부터 DBWR이 LGWR의 on-disk RBA값보다 큰 high-RBA 값을 가진 Block을 데이터파일로 기록해야할 때 해당 Block을 Differed Write Queue에 먼저 기록 후 LGWR프로세스를 먼저 수행시켜 Redo Log를 먼저 내려쓰게 만든 후 Data block을 기록하는 방식으로 sync를 맞추게된다.


=> 위의 조건일 때 LGWR은 Redo Log Buffer의 내용을 Redo Log file에 기록하고, 기록된 내용을 Redo Log Buffer상에서 Flush 한다.

 * LGWR이 Redo Log Buffer의 내용을 Redo log file에 기록할 때 Block 단위로 쓴다. ( OS Block Size로 OS 종류에따라 다를 수 있다.)


Redo Log Block Size 조회.


 SQL>  select max(lebsz) from sys.x$kccle;

 

MAX(LEBSZ)

----------

       512


** 모든 데이터의 변경사항이 전부 Redo Log에 기록되는것은 아님.

** Direct Load, Table 혹은 Index 생성 시 NOLOGGING 옵션을 주는 경우 기록되지않는다.

단, NOLOGGING 옵션으로 테이블을 생성하더라도 Insert, Update, Delete 같은 작업은 기록된다.