ORACLE/ADMIN2012. 10. 12. 15:13
반응형

 

Sizing Redo Log Files

Sizing Redo Log Files

The size of the redo log files can influence performance, because the behavior of the database writer and archiver processes depend on the redo log sizes. Generally, larger redo log files provide better performance. Undersized log files increase checkpoint activity and reduce performance.
리두로그 파일 사이즈는 성능에 영향을 끼칠 수 있다, 왜냐하면 DBWR ARCn프로세스가 리두로그 사이즈에 영향을 받기 때문이다.
일반적으로, 큰 리두로그파일은 보다 나은 성능을 보장한다. 크기가 작은 로그파일은 chekcpint를 증가시키고 성능을 저하시킨다.

Although the size of the redo log files does not affect LGWR performance, it can affect DBWR and checkpoint behavior. Checkpoint frequency is affected by several factors, including log file size and the setting of the FAST_START_MTTR_TARGET initialization parameter. If the FAST_START_MTTR_TARGET parameter is set to limit the instance recovery time, Oracle Database automatically tries to checkpoint as frequently as necessary. Under this condition, the size of the log files should be large enough to avoid additional checkpointing due to under sized log files. The optimal size can be obtained by querying the OPTIMAL_LOGFILE_SIZE column from the V$INSTANCE_RECOVERY view. You can also obtain sizing advice on the Redo Log Groups page of Oracle Enterprise Manager.
비록 리두로그 파일 크기가 LGWR 프로세스의 성능에 영향을 주지는 않지만, DBWR 프로세스와 checkpoint에는 영향을 준다.
checkpoint 빈도는 리두로그파일 크기를 포함하여 FAST_START_MTTR_TARGET 파라미터등에 영향을 받는다.
만약 FAST_START_MTTR_TARGET 파라미터가 인스턴스 복구시간의 제한값으로 설정되면, 오라클 데이터베이스가
자동적으로 필요한 만큼의 checkpoint 빈도를 조절한다. 이 상황 하에서는, 리두로그 파일 사이즈는 작은 크기때문에
추가적인 checkpoint가 일어나는걸 방지하기 위해 충분히 크게 설정되어야 한다. 가장 최적의 사이즈에 대한 값은
V$INSTANCE_RECOVERY 뷰의 OPTIMAL_LOGFILE_SIZE 컬럼에서 확인이 가능하다. 또한 OEM의 Redo Log Group으로
부터도 확인 가능하다.

It may not always be possible to provide a specific size recommendation for redo log files, but redo log files in the range of 100 MB to a few gigabytes are considered reasonable. Size online redo log files according to the amount of redo your system generates. A rough guide is to switch log files at most once every 20 minutes.
리두로그 파일의 크기를 정확히 정하기는 힘들지만, 100MB에서 몇GB 까지가 합당하다. 리두로그 파일의 크기는 시스템이
생성하는 리두의 양에 따라 조절해야 한다. 대략 20분에 1번정도로 설정하면 된다.


[[리두로그 리사이징]]
*. REDO LOG group은 3개 이상 권장, member는 2개 권장
(member는 물리적으로 서로 다른 위치에 분산 권장)
*. 평상시 REDO LOG 스위치가 약 20분 이상 유지할 수 있는 Size 권장
(alert_TESTDB.log에서 지속적으로 모니터링해서 필요시 REDO LOG 크기를 증가시킬 것)
*. 체크포인트 간격 조절(initTESTDB.ora파라미터에서) fast_start_mttr_target = 600

*. DB Startup 상태에서 작업 가능

1. sqlplus 접속(Internal로 접속)
$> sqlplus '/ as sysdba'
OR
$> sqlplus system/manager

2. currunt REDO LOG 조회
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------
1 1 43 104857600 2 YES INACTIVE 8485439 01-SEP-03
2 1 44 104857600 2 YES INACTIVE 8585874 02-SEP-03
3 1 45 104857600 2 NO CURRENT 8756665 03-SEP-03
STATUS가 Inactive인 경우만 작업 가능

3. REDO LOG file을 switch
SQL> alter system switch logfile;
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------
1 1 46 104857600 2 NO CURRENT 8988801 03-SEP-03
2 1 44 104857600 2 YES INACTIVE 8585874 02-SEP-03
3 1 45 104857600 2 YES ACTIVE 8756665 03-SEP-03
SQL> alter system switch logfile;
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------
1 1 46 104857600 2 YES ACTIVE 8988801 03-SEP-03
2 1 47 104857600 2 NO CURRENT 8990631 03-SEP-03
3 1 45 104857600 2 YES INACTIVE 8756665 03-SEP-03

4. acitive 한 REDO LOG group을 inactive로 변경
SQL> alter system checkpoint;

5. REDO LOG Drop
SQL> alter database drop logfile group 2;
6. REDO LOG logfile 삭제
SQL> !rm /oradata1/redo2a.dbf;
SQL> !rm /oradata2/redo2b.dbf;

7. REDO LOG logfile 추가
1) 멤버가 없는 경우
SQL> alter database add logfile group 2 '/oradata/redo2.dbf' size 100M;
2) 멤버가 있는 경우
SQL> alter database add logfile member '/oradata/redo2b.dbf' to group 2;
SQL> alter database add logfile
group 2 ('/oradata1/redo2a','/oradata2/redo2b') size 100M reuse;
3) 여러개의 REDO LOG 추가할 경우
SQL> alter database add logfile
group 4 ('/oradata1/redo4a','/oradata2/redo4b') size 100M,
group 5 ('/oradata1/redo5a','/oradata2/redo5b') size 100M,
group 6 ('/oradata1/redo6a','/oradata2/redo6b') size 100M;

[출처] DBMS관리 - 리두로그(REDO LOG) Resize 방법|작성자 smileDBA

반응형
Posted by [PineTree]
ORACLE/ADMIN2009. 11. 6. 11:10
반응형

이 문서는 REDO log buffer 캐쉬의 아키텍쳐의 이해, 및 SGA 구조에 관련해 튜닝 해야 할 문제를 찾아내 해결하는 방법에 대해 설명하고 있습니다.

 

1.REDO로그 버퍼란 무엇인가???

 

REDO log buffer는 SGA내에 존재하며 데이타베이스에 대한 변경에 관한 정보를 보관 유지하는 버퍼입니다. 이 정보는 REDO 엔트리에 격납됩니다. REDO 엔트리는 데이타베이스에 대해서 행해진 변경을 재실행하기 위해서 필요한 정보를 포함하고 있습니다. 필요에 따라서 개개의 REDO 엔트리는 데이타베이스의 복구에 사용됩니다.

 

REDO엔트리는 Oracle 서버 프로세스에 의해 유저의 메모리 영역으로부터 SGA에 있어서의 REDO log buffer에 카피됩니다. 이 때 REDO 로그 엔트리는 버퍼내의 영역에 차례로 써집니다. 백그라운드 프로세스의 LGWR는, REDO log buffer의 내용을 디스크상의 액티브한 온라인 REDO 로그 파일 (온라인 REDO 로그 파일 그룹)에 씁니다.

초기화 파라미터 LOG_BUFFER는 REDO log buffer의 사이즈를 바이트 단위로 지정한 것입니다. 1개의 트랜잭션(transaction), 혹은 다중의 트랜잭션(transaction)에서 대량의 REDO log buffer에의 기입이 발생하는 환경에서는 일반적으로는 이 값을 크게 해 로그 파일에 대한 I/O수를 줄일 수가 있습니다. LOG_BUFFER 사이즈의 설정에 관해서는 KROWN#18227을 확인해 주세요.

 

2.REDO 로그 Latch

 

데이터 블록에 대한 변경이 필요할 때 이하의 순서에 의해 REDO log buffer내에 REDO 레코드가 작성됩니다.

다른 프로세스가 해당 프로세스보다 높은 COMMIT SCN(System Change Number)를 생성하고 있지 않는 것을 확인한다.

 

■ REDO를 쓸 수 있는 스페이스가 있는지를 확인한다. 충분한 스페이스가 없는 경우는 LGWR가

   REDO log buffer의 내용을 디스크상의 REDO 로그 파일에 쓰거나 로그 스윗치를 실시한다.
■ REDO log buffer내에 필요한 스페이스를 할당한다.
■ REDO log buffer에 REDO 레코드를 카피하고, 리커버리 시에 사용 가능하도록 관련성 실시

데이타베이스에는 이 처리를 실행하기 위해 3개의 REDO Latch가 있습니다.

・redo copy latch


redo copy latch는 상기 순서를 실행하는 동안 보관 유지되고 있습니다. 빈 공간을작성하기 위해서 로그 스윗치가 실행되었을 때에 해방되어 로그 스윗치가 종료하면 다시 취득합니다.

 

・redo allocation latch


SGA내의 REDO log buffer에 대한 REDO 엔트리의 기입을 직렬화하기 위해서 사용됩니다. 트랜잭션(transaction)량이 적은 혹은 1 CPU의 서버인 경우에는 redo allocation latch는 redo copy latch를 획득하지 않고  REDO를 REDO log buffer에 씁니다.빈 스페이스를 획득하기 위해서 로그 스윗치가 필요하게 되는 경우는 이 Latch는 redo copy latch와 함께 해방됩니다. 이 Latch는 데이타베이스에 1개 밖에 없습니다.

 

・redo writing latch


LGWR 프로세스에 대해서 동시에 복수 프로세스에 의한 로그 스윗치의 요구가 발생하는 일을 막습니다.

빈 공간이 필요한 프로세스는 LGWR에 REDO 로그 버퍼로부터 REDO 로그 파일에의 쓰거나  혹은 로그 스윗치의 실행을 요구 하거나 단지 대기할까를 판단하기 이전에 이 latch을 취득해야 합니다.  

 

3.REDO Latch에 관한 인스턴스 파라메터

 

REDO log buffer에 있어서의 Latch 할당의 동작에 관련하는 2개의 파라미터가 있습니다.

 

・LOG_SIMULTANEOUS_COPIES

  시스템이 복수CPU를 가질 때 redo copy latch의 수를 제어

 

・LOG_SMALL_ENTRY_MAX_SIZE

  REDO log buffer에 REDO를 쓸 때 redo allocation latch를 취득할지 아닐지를 결정하는 기준

 

4.REDO로그 버퍼의 퍼포먼스 튜닝

 

REDO log buffer에 있어서의 경합은 모든 DML 및 DDL문은 실행전에 REDO 엔트리를 작성 할 필요가 있기 때문에 퍼포먼스상 중요합니다. 경합은 Latch 경합 혹은 REDO 로그 버퍼에 대한 빈 공간의 과도의 요구가 있는 것으로 확인할 수 있습니다. 이하에 열거한 2 종류의 경합이 발생하고 있는 일을 검출하는 것이 가능합니다.

 

・Latch 경합


다음의 SQL는 REDO 로그에 있어서의 Latch의 사용율을 표시하는 것입니다.

   

    SELECT  substr(ln.name, 1, 20) "latch type",
                  100*(misses + immediate_misses)/(gets +
                  immediate_gets + immediate_misses) "latch utilization(%)"
       FROM v$latch l, v$latchname ln
     WHERE  ln.name in ('redo allocation', 'redo copy')
      and ln.latch# = l.latch#;

 

이 결과 latch utilization가 1%를 넘는 경우 Latch 경합이 발생하고 있다란것을 의미합니다. redo copy latch의 전에 redo allocation latch의 튜닝을 실시하는 일을 추천합니다.redo allocation latch는 인스턴스에 1개 밖에 없기 때문에 redo allocation latch의 경합은 퍼포먼스상 영향도가 높기 때문입니다.

 

Oracle7,8i에서는 redo alocation latch의 경합이 발생하는 경우 LOG_SMALL_ENTRY_MAX_SIZE의 값을 낮추고 redo copy latch가 획득되기 쉽게 조정하는 것이 좋다. 추천치는 평균의 REDO 사이즈이며 이하의 SQL의 결과의 'redo size'를 'redo entries'의 값으로 나눈 값이 됩니다.

 

    SELECT value
       FROM v$sysstat
    WHERE name in ('redo size','redo entries');

 

다만 이 SQL를 실행할 때는 실전 환경과 같은 조건이 아니면 적절한 결과를 얻을수 없습니다. redo copy latch 경합이 발생하고 있는 경우는 LOG_SIMULTANEOUS_COPIES 파라미터를 증가시키는 것으로 새로운 redo copy latch를 추가시킬 수가 있습니다.이 파라미터의 추천치는 CPU수*2 가 됩니다.

 

Oracle8i에서는 redo allocation latch 경합이 발생하고 있는 경우, 특정의 처리에 대해서는  NOLOGGING 옵션을 사용하면 생성되는 REDO를 감소시킬수  있습니다

혹은 LOG_BUFFER 파라미터를 증가시키는 것으로 latch의 부하를 낮추는 것이 가능합니다. LOG_BUFFER 파라미터의 튜닝에 관해서는 KROWN#18227 로 소개있습니다.redo copy latch 경합이 발생하고 있는 경우 Oracle8 이전과 같이 LOG_SIMULTANEOUS_COPIES를 증가 시킨다.


・영역 할당의 리퀘스트의 경합


REDO log buffer의 영역 할당을 대기한 회수는 "redo buffer allocation retries"라는 통계로 카운트 됩니다. 다음의 SQL를 사용하고, 어플리케이션이 동작중의 통계치를 감시해야 합니다. 

   

    SELECT name,valus
     FROM v$sysstat
  WHERE name = 'redo buffer allocation retries';

 

"redo buffer allocation retries"의 값은 0인 것이 이상적입니다.
이 값이 증가 경향에 있는 경우에는 LOG_BUFFER 파라미터의 값이 너무 작을 가능성이 있습니다.
LOG_BUFFER의 튜닝 방법에 대해서는 Krown:18227을 참조하십시오.

반응형

'ORACLE > ADMIN' 카테고리의 다른 글

logminer + 불완전 복구  (0) 2009.11.19
Index Coalesce VS. Shrink  (0) 2009.11.06
DDL - 오라클 Create table as select(CTAS)  (0) 2009.11.06
CTAS 를 통한 테이블 복제시 제약 조건  (0) 2009.11.05
[Oracle] Primary Key 수정  (0) 2009.10.30
Posted by [PineTree]
ORACLE/ADMIN2009. 10. 7. 14:16
반응형
1. REDO
 - 모든 변경사항을 REDO로그에 기록한다.
 - REDO로그는 Online REDO와 Archuved REDO로그로 구성된다.
    Online REDO 로그는 2개 이상의 파일로 구성되어 있어,
    현재 사용중인 로그 파일이 꽉 차면 다음 로그 파일로 스위칭
    이때 꽉 차여진 로그 파일을 다른 위치로 백업래 준 파일을 Archived REDO로그 이다.
 - 목적 3가지
  - 데이타 복구 : Archived REDO이용
  - 버퍼캐시복구 : 인스턴스가 비정상적종료시 그떄까지 작업내용이 잃어버리게 됨.
                          재기동 되면 Online REDO로그에 저장된 기록사항을 읽어와 마지막
                          채크포인트와 사고발생직전까지 수행한 트랜젹션을 재현
  - Fast Commit(IO속도 차 극복) : 데이타 버퍼 블록을 디스크에 기록하는 작업은 Random엑세스 방식,
                                              Append방식 Append방식이 상대적으로 빠르게 때문에 우선 변경사항을
                                              Append방식으로 기록하고 동기화는 후에 배치방식으로 일괄수행.
 - REDO로그 버퍼를 REDO로그에 기록하는 시점
  - 3초마다 DBWR프로세스부터 신호흫 받을때
  - 로그 버퍼의 1/3이 차거나 기록된 REDO레코드량이 1MB를 넘을떄
  - 사용자 커킷 또는 롤백 명령이 날릴때
  
2. UNDO
 - 각 트랜지션별로 UNDO세그먼트를 할당해주고 그 트랜지션이 발생시킨 테이블과 인댁스에
    대한 변경사항을 UNDO레코드 단위로 UNDO세그먼트 블록에 기록.
 - 목적 3가지
  - 트랜지션 롤백
  - 트랜지션 리커버리(인스턴스 리커버리시 롤백단계)
  - READ Consistency(읽기 일관성)
  타 DBMS는 Lock를 통해 일기 일관성을 구현하지만,
  오라클에서는 UNDO데이타를 이용해서 읽기 일관성을 구현한다.  
             읽기 일관성이란 Transaction이 진행되는 동안 Database의 다른 사용자는 이 Consistent Read에 의해
             Commit되지 않은 변경 사항을 볼 수 없는 기능 입니다.  
 - UNDO레코드에 기록되는 내용
  - Insert : 추가된 레코드의 rowid
  - Update : 변경되는 컬럼에 대한 before image
  - Delete : 지워지는 로우의 모든 컬럼의 대한 before image
------------------------------------------------------------------------------------
REDO 와 UNDO를 차이점에서 바라본 관점.
------------------------------------------------------------------------------------
REDO 는 UNDO를 포함 합니다.
REDO 는 시스템 장애시 복구를 위해 사용 합니다.
복구시에 UNDO 데이터도 같이 복구하구요. Commit 되지 않은 데이터를 Rollback 하게 됩니다.
UNDO 는 Rollback 시에도 사용 되지만 Read Consistency(읽기 일관성) 을 위해서 도 사용 됩니다.
REDO 는 모든 변경사항(UNDO 포함)을 기록 합니다.
복구는 UNDO 를 통해서 복구를 하게 됩니다. 즉, ROLLBACK을 한다는 말이죠.
시스템 장애가 발생하게 되면 UNDO 데이터도 모두 날아가게 되겠죠.
결국 시스템 장애시 REDO 데이터를 이용해서 마지막 CHECK POINT 부터 장애까지의 DB BUFFER CACHE 를 복구하게 됩니다.
이게 완료가 되면 UNDO DATA 를 이용하여 COMMIT 되지 않은 데이터를 모두 ROLLBACK 함으로써 복구를 완료하게 됩니다.
결국 REDO 가 UNDO 를 복구하고 최종적으로 UNDO가 복구를 하게 됩니다.
UNDO(안한것 처럼)는 되돌리는 것 이라고 보시면 될거에요.
어떤 세션에서 DML을 발생시키면 commit이나 rollback을 날리기 전까지 이전 정보를 저장하기 위해서
UNDO 블럭에 해당 정보를 기록하죠.. 해당 세션이 트렌젝션 중에 비정상적으로 종료가 되었다면,
안한것 처럼(UNDO) 다시 원복해야 되니까요.
REDO(다시 함)는 위에 설명에도 있듯이 인스턴스 실패시(DB가 내려감) 데이터 파일에 쓰여지지 않은 커밋된 데이터를 복구한다고 되어 있습니다.
좀 더 설명을 해드리자면 커밋을 날릴 경우 LGWR가 로그 파일에 변경된 정보를 기록하게 되고
그 다음에 DBWR이 버퍼캐쉬에 있는 변경 사항에 대해서 데이터 파일에 내려 쓰게 됩니다.
이는 복구 정보가 더 중요해서 그런 것이라고 이해하시면 됩니다(복구 정보가 있으면 재적용이나 되돌릴 수 있으므로).
DB가 비정상적으로 내려가면, 데이터 파일에 쓰여지지 않은 정보들이 리두로그에 기록되어 있으므로
리두로그에서 정보를 가져와 다시 적용(REDO)하는 것입니다.
반응형
Posted by [PineTree]