본문 바로가기

카테고리 없음

Oracle 10g log file sync v1.0

log file sync

 

from Practical OWI | exem | exem

 

log file sync 정의

 

Server Process Commit , Rollback 수행 후 LGWR process가 관련 Redo RecordRedo Buffer에서 Redo Log 파일로 기록할 때까지 대기하는 event

 

log file sync 발생의 요인

 

잦은 Commit 횟수

I/O 시스템의 성능

REDO BUFFER의 지나친 크기

리두데이터의 양

 

log file sync 는 위의 요인을 보면 결과적으로 REDO LOG BUFFER 의 내용 (DIRTY BUFFER) REDO LOG FILE 로 내려쓰는데 사용되는 시간과 관련있다.

DIRTY BUFFER DML 작업으로 생겨나기 때문에 DML의 양이 많아지면 내려쓰는데 필요한 시간 역시 늘어난다. 이와 같은 차원의 이야기로 REDO BUFFER의 크기도 연관되어있다.

LGWR가 데이터를 기록하는데 크게 좌우되는 부분으로 I/O 시스템의 성능 역시 무시할 수 없다.

 

로컬환경에서 LOG FILE SYNC 이벤트를 보기 위해서는 대량의 DML을 만든 후 한꺼번에 내려쓰기 ( COMMIT ) 를 해야된다.

 

 log file sync 예제 /*+ 만들어 볼 것… */

 

방법 1 : 대량의 DML 생성 후 COMMIT

SQL> begin

  2     for i in 1..10 loop

  3             insert into test2 select * from test;

  4     end loop;

  5  end;

6  /

 

방법 2 : 잦은 COMMIT

 

방법 1은 중간에 ROLLBACK을 시행해 제대로 확인하지 못하였다. 진행중에도 REDO LOG BUFFER 의 내용이 1M 에 달했을 때 3초에 한번씩 REDO BUFFER 1/3을 차지할 때 등 다양한 조건이 있어 상황만들기가 어렵지 않았나 싶다.

 

방법2의 경우엔 EVENT를 확인하기는 하였다. EVENT를 보기 위해 아래와 같은 스크립트를 사용하였다.

 

select event, p1, p1text, wait_time

from v$session_wait

where event like '%log file sync%'

/

log file sync event를 만들어내기 위해 아래와 같은 스크립트를 세개의 세션에서 동시수행하였다.

다만 update 위치 empno 을 제각각 다르게 하였다. ( 이 과정을 수행하지 않으면 서로 락을 걸고 대기상태에 빠질 수 있다. )

 

begin

        for i in 1..100000 loop

                update emp set sal = 1111 where empno=7788;

                execute immediate 'commit';

                update emp set sal = 9999 where empno=7788;

        end loop;

end;

/

 

위 스크립트를 돌리면서 원하는 event를 잡아냈지만 정말 순간이라고 할 만큼 짧은 wait 타임이다. 로컬에서 긴 wait 를 만들기 위해서는 좀 더 생각할 필요가 있는 듯 하다.