- 이 문서는 구루비에서 작성하였습니다.
- 이 문서를 다른 블로그나 홈페이지에 게재하실 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 출처 : http://wiki.gurubee.net/display/CORE/Log+buffer+space?
- 구루비 지식창고의 모든 문서는 크리에이티브 커먼즈의 저작자표시-비영리-동일조건변경허락(BY-NC-SA) 라이선스에 따라 자유롭게 사용할 수 있습니다.
1. Event 정의
1) 정의
- DML 수행 시 변경 내용을 Redo Buffer에 저장하기 위해 공간이 확보되기를 대기하는 Event
p1 N/A p2 N/A p3 N/A
2) 대기발생 사유
- Redo Buffer의 크기가 너무 작은 경우
- 느린 I/O Subsystem으로 인해 LGWR 프로세스가 Redo 데이터 발생 정도를 수용하지 못할 경우
2. log buffer space 대기
1) log buffer space 프로세스
- 리두 버퍼에 리두 레코드를 기록하려는 프로세스는 리두 버퍼 내에 필요한 공간을 확보하기 위해 redo allocation 래치를 획득해야 한다.
- redo allocation 래치를 획득한 상태에서 리두 버퍼에 공간을 확보하려는 순간에 적절한 여유공간이 없는 경우, 공간이 확보되기를 기다려야 한다.
- 이 때, 경우에 따라 두 가지 종류의 이벤트를 대기하게 된다.
- 만일 현재 사용중인 리두 로그 파일이 꽉 차서 더 이상 여유공간을 확보할 수 없다면, LGWR은 로그 파일 스위치(log file switch)를 수행하고, 서버 프로세스는 log file switch completion 이벤트를 대기한다.
- 그 외의 경우에는 log buffer space 이벤트를 대기하게 된다. 전자의 경우, 로그 파일 스위치가 끝난 직후 log buffer space 대기가 한꺼번에 증가하는 현상이 생길 수 있다.
- 이는 리두 버퍼에 기록을 하려는 다수의 세션들이 로그 파일 스위치가 끝나기를 기다렸다가 한꺼번에 리두 버퍼에 기록을 하기 위해 경쟁하기 때문이다.
2) 테스트 시나리오
☞ 13만건 정도의 로우를 지닌 TEST 테이블에 대해 Update를 수행한다. ☞ Case1에서는 리두 버퍼의 크기를 256 K로 지정한다. ☞ Case2에서는 리두 버퍼의 크기를 5 M로 지정한다. ☞ 두 Case에서 log buffer space 대기가 어떻게 발생하는지 확인한다.
3) 리두 버퍼의 크기가 256 K로 매우 작게 설정된 경우
-- 1. SGA 확인 SHOW SGA Total System Global Area 314,572,800 bytes Fixed Size 788,692 bytes Variable Size 263,190,316 bytes Database Buffers 50,331,648 bytes Redo Buffers 262,144 bytes -- 2. UPDATE 수행 UPDATE TEST SET ID = ID, NAME = NAME; 131079 rows updated. -- 3. 대기이벤트 확인 SELECT EVENT, TOTAL_WAITS, TIME_WAITED FROM V$SESSION_EVENT WHERE SID = (SELECT SID FROM V$MYSTAT WHERE ROWNUM = 1) ORDER BY 3 DESC; EVENT TOTAL_WAITS TIME_WAITED ------------------------------------------- ----------- ----------- SQL*Net message from client 19 24819 log buffer space 1582 6234 -- 많은 대기 소요 db file scattered read 616 4297 log file switch completion 89 1210 -- 많은 대기 소요 db file sequential read 1073 1202 log file switch (checkpoint in complete) 4 137
4) 리두 버퍼의 크기를 5 M로 크게 설정한 경우
-- 1. LOG_BUFFER 늘림 ALTER SYSTEM SET LOG_BUFFER=5242880 SCOPE=SPFILE; -- 2. SGA 확인 SHOW SGA Total System Global Area 314,572,800 bytes Fixed Size 788,692 bytes Variable Size 258,209,580 bytes Database Buffers 50,331,648 bytes Redo Buffers 5,242,880 bytes -- 사이즈 증가 -- 3. UPDATE 수행 UPDATE TEST SET ID = ID, NAME = NAME; 131079 rows updated. -- 4. 대기이벤트 확인 SELECT EVENT, TOTAL_WAITS, TIME_WAITED FROM V$SESSION_EVENT WHERE SID = (SELECT SID FROM V$MYSTAT WHERE ROWNUM = 1) ORDER BY 3 DESC; EVENT TOTAL_WAITS TIME_WAITED ---------------------------------- ----------- ----------- db file scattered read 817 4783 SQL*Net message from client 18 3718 log buffer space 66 3455 -- 기존에 1,582에서 66으로 줄어든 것 확인 log file switch completion 115 2651 db file sequential read 1208 2103 free buffer waits 1160 944 log file sync 2 10 latch: cache buffers lru chain 2 1 latch: cache buffers chains 2 1 latch: redo allocation 1 1 latch: shared pool 1 1
3. 해결방안
1) Redo Buffer의 크기 증가
- log Buffer Space 대기는 트랜잭션에 의해 생성되는 redo의 양에 비해 리두 버퍼의 크기가 작을 때 발생
- 그러므로, log Buffer Space 대기가 광범위하게 나타날때는 리두 버퍼의 크기가 너무 작지 않은가를 조사해 보아야 함
2) NOLOGGING 옵션 사용
- log Buffer SPACE 대기를 줄이는 또 하나의 방법은 리두 데이터를 적게 생성하는 것임
- Direct load 기능을 적당히 사용하고 NOLOGGING 옵션을 부여하는 것이 이 방법임
문서에 대하여
- 최초작성자 : 강정식
- 최초작성일 : 2010년 10월 23일
- 이 문서는 오라클클럽 코어 오라클 데이터베이스 스터디 모임에서 작성하였습니다.
- 이 문서의 내용은 (주)엑셈에서 출간한 'PRACTICAL OWI IN ORACLE 10G'와 엑셈위키를 참고하였습니다.
문서정보
- 이 문서는 구루비에서 작성하였습니다.
- 이 문서를 다른 블로그나 홈페이지에 게재하실 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 출처 : http://wiki.gurubee.net/display/CORE/Log+buffer+space?
- 구루비 지식창고의 모든 문서는 크리에이티브 커먼즈의 저작자표시-비영리-동일조건변경허락(BY-NC-SA) 라이선스에 따라 자유롭게 사용할 수 있습니다.