by-nc-sa     개발자, DBA가 함께 만들어가는 구루비 지식창고!

3.7 Block Cleanout과 Undo




Bloc Cleanout과 Undo

  • 오라클은 클린아웃 시에 필요한 정보(Scn Base#, Wrap#)를 획득하기 위해서 Itl의 Xid를 이용하여 언두 헤더와 트랜잭션 슬롯 정보를 참조해야 한다.
  • fast block cleanout 및 delayed block cleanout 모두 해당
  • 클린아웃을 하려는 시점에 해당 언두가 존재하지 않거나(언두 테이블스페이스 변경 또는 언두 세그먼트 offline/drop 등)
    언두는 존재하지만 언두 헤드의 트랜잭션 슬롯이 재사용되어 기존 정보가 사라졌다면 ?? (delayed block cleanout 시에만 해당)

언두 세그먼트가 존재하지 않는 경우의 cleanout 방식

  • 이전에 존재하였던 어두가 없어진 경우에 DBA_ROLLBACK_SEGS와 같은 뷰에서는 해당 언두를 확인할 수 없으나,
    sys.UNDO$에는 모든 언두의 내용을 확인 할 수 있다.
  • 오라클에서는 현재 VALID한 언두뿐 아니라 INVALID 한 언두까지 sys.UNDO$에 내용을 보관하고 있다.
    kjwon:ora10g:KJWON >
      l  select us#, name, scnbas, scnwrp, status$ from sys.undo$;
    
           US# NAME                               SCNBAS     SCNWRP    STATUS$
    ---------- ------------------------------ ---------- ---------- ----------
             0 SYSTEM                                  0          0          3
             1 _SYSSMU1$                          688649          0          3
             2 _SYSSMU2$                          688673          0          3
             3 _SYSSMU3$                          688651          0          3
             4 _SYSSMU4$                          688675          0          3
             5 _SYSSMU5$                          688677          0          3
             6 _SYSSMU6$                          688632          0          3
             7 _SYSSMU7$                          688641          0          3
             8 _SYSSMU8$                          688616          0          3
             9 _SYSSMU9$                          688647          0          3
            10 _SYSSMU10$                         688618          0          3
            11 _SYSSMU11$                         532410          0          1
            12 _SYSSMU12$                         532384          0          1
            13 _SYSSMU13$                         532415          0          1
            14 _SYSSMU14$                         532422          0          1
            15 _SYSSMU15$                         532403          0          1
            16 _SYSSMU16$                         532402          0          1
            17 _SYSSMU17$                         532378          0          1
            18 _SYSSMU18$                         532414          0          1
            19 _SYSSMU19$                         532390          0          1
            20 _SYSSMU20$                         532408          0          1
    
  • sys.UNDO$의 STATUS$ 컬럼은 언두의 상태를 나타낸다. (1이면 Invalid, 3이면 Valid)
  • 각 언두의 최종 Scn Base#와 Wrap#는 각각 SCNBAS와 SCNWRP 컬럼에서 확인.
  • delayed block cleanout을 하려고 데이터 블록의 Xid 정보를 확인해 본 결과 Usn#=11이였다면,
    현재 11번 언두는 Invalid 상태이므로, 정확한 Scn 정보를 확인할 수 없다.
    -> 이때는 해당 언두에서 사용된 최종 Scn Base#=532410, Scn Wrap#=0을 이용하여 블록 클린아웃 수행.,

언두 헤더의 트랜잭션 슬롯이 재사용된 경우의 cleanout 방식

  • 언두 헤더의 트랜잭션 테이블에는 일정한 개수의 트랜잭션 슬롯을 관리.
  • 해당 언두를 사용하는 트랜잭션의 수가 트랜잭션 슬롯의 수를 넘어서면, 트랜잭션 슬롯은 재사용.
  • 트랜잭션 슬롯이 재사용 되면 슬롯의 wrap#가 1 증가.
  • 이 시점(트랜잭션 슬롯이 재사용되는)에 해당 트랜잭션 슬롯에서 관리되던 scn 정보를 언두 헤더의 트랜잭션 컨트롤(TRN CTL) 부분에 저장.
  • 기존의 슬롯정보를 참조하려던 세션이 슬롯이 재사용되어(wrap#가 일지하지 않아서) 기존 scn 정보를 획득하지 못할 경우에는
    TRN CTL에서 관리되는 scn 정보를 이용하여 클린아웃 수행.

문서에 대하여

문서정보

Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.