h2.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 정보를 이용하여 클린아웃 수행.

문서에 대하여