天天看點

oracle延遲塊清除,Oracle Study之案例--延遲塊清除(deferred block cleanout)

場景一:會話一更新一小表,更新的block數小于db_block_buffers*10%,當會話一進行commit時,更新的block還存在于buffer cache中。由于更新的塊數較少,Oracle采用SO(state block)清單來管理更新塊。SO主要包括了更新塊的事物狀态資訊。當會話一進行送出時,會從SO清單中擷取更新塊的事物資訊,進而進行更新塊的事物資訊清理。清理主要包括塊頭itl狀态列的更新(Flag,Lck ,Scn/Fsc)和行鎖标記的清理。Oracle對于這種塊清理稱之為快速塊清理。(Fast Block Cleanout)。發生延遲塊清除後,塊頭的Flag往往顯示如下:Itl              Xid                             Uba                              Flag Lck Scn/Fsc0x01 0x0009.01f.0000bed8 0x04c00016.13bf.28 --U- 3 fsc 0x0000.063f1a51其中U表示upper bound(上界),意味着快速塊清除。場景二:會話一更新一大表,更新的blocks數大于db_block_buffers*10%,當會話一進行commit前,部分更新的block由于種種原因已經重新整理至至資料檔案。當會話進行commit時,Oracle對存在于SO清單的更新塊進行快速塊清理,同時更新undo segment head中的事物槽(将事物槽state标記從10置回9,表示該事務已經送出)。但需要注意的是,Oracle在commit時,并不會處理已重新整理在資料檔案中的block(此時資料塊頭還flag标記仍然顯示未送出狀态,Lck依然顯示該塊中行鎖的行數,Scn/Fsc為空,行鎖标記依然為lb: 0x2)。Oracle采用此方進行送出時,并不需要再次将該事務涉及到的block從實體檔案中讀取,而隻需要進行快速塊清理和更新undo segment head中的事物槽即可。進而保證送出的性能最優化。當有另一會話再次讀取已重新整理至資料檔案的block時,如果發現此block itl清單有未送出事物時,那麼Oralce将進行延遲塊清除(defered block cleanout)。當進行延遲塊清除時,Oracle将擷取資料塊中未送出事物的xid中的seq和undo segment head中事物槽的seq進行比較。如例子所示,資料塊的ITL顯示如下:ITL Xid Uba Flag Lck Scn/Fsc0x01 0x0009.018.0000bdd4 0x04c00016.13a5.32 C-U- 0 scn 0x0a00.063f08380x02 0x0009.01f.0000bed8 0x04c00016.13bf.28 ---- 3 fsc 0x0000.00000000undo segment head的和此事物相關的事物槽顯示如下:index state cflags wrap# uel scn dba---------------------------------------------------------------0x1f 9 0x00 0xbed8 0xffff 0x0a00.063f1a51 0x04c00016undo segment head的事物控制清單如下:TRN CTL:: seq: 0x13c0 chd: 0x002d ctl: 0x001f inc: 0x00000000 nfb: 0x0000mgc: 0x8201 xts: 0x0068 flg: 0x0001 opt: 2147483646 (0x7ffffffe)uba: 0x04c0000d.13c0.04 scn: 0x0a00.063f17f1事物控制清單中scn主要表示事物槽被覆寫前的scn。如上所示ITL 0x02中有未送出事物,那麼首先會擷取0x02事物中xid(復原段為0x0009,事物槽為0x01f,seq為 0000bed8)和undo segment head對應事物槽比較(主要比較xid.seq和事物槽的wrap#)。如果兩者相等,那麼進行延遲塊清除時,Oracle将擷取事物槽中的scn寫往ITL清單中的Scn/Fsc列。如果兩者不相等,這裡分為兩種情況:1、undo的事物槽被其他事物覆寫,那麼進行延遲塊清除時,Oracle将擷取undo segment head的事物控制清單的scn寫往ITL清單中的Scn/Fsc列。這裡需要注意的是,此時的scn并不是事物送出時的真正scn,而且肯定比事物送出時的scn大,那這樣會不會影響事物一緻性呢,接下來例子會進行說明。2、undo表空間被删除,此時undo$并不會将此表空間删除,隻會将STATUS$從2改為1,而且每個undo segment依然保留着最近一次送出的scn。如下所示SQL> select SCNBAS,SCNWRP,STATUS$,file#,name from undo$;SCNBAS SCNWRP STATUS$ FILE# NAME---------- ---------- ---------- ---------- ------------------------------258954408 2560 1 13 _SYSSMU127$258954399 2560 1 13 _SYSSMU128$258954395 2560 1 13 _SYSSMU129$258954404 2560 1 13 _SYSSMU130$那麼進行延遲塊清除時,Oracle會去undo$中對擷取對應的undo segment中的scn寫往ITL清單中的Scn/Fsc列。同樣需要注意的是,此時的scn并不一定事物送出時的真正scn,可能會比送出的scn大。發生延遲塊清除後,塊頭的Flag往往顯示如下:ITL Xid Uba Flag Lck Scn/Fsc0x01 0x0009.018.0000bdd4 0x04c00016.13a5.32 C-U- 0 scn 0x0a00.063f0838其中C表示該事物已結束,U表示Upper bound(上界),C-U-往往表示延遲塊清除。