轉儲資料塊玩玩

passion_of_data發表於2011-09-26

關於快轉儲我們需要注意的區域主要是:塊轉儲ITL,FLAG區域和資料區域

下面我們就這個做個實驗:

SQL> insert into emp values(5236,'weibin',563220,to_date('2009-05-04 12:20:24','yyyy-mm-dd hh24:mi:ss'));

已建立 1 行。

SQL> insert into emp values(236,'weibin',2530,to_date('2012-05-04 12:20:24','yyyy-mm-dd hh24:mi:ss'));

已建立 1 行。

查詢物件在記憶體中儲存的資料塊

SQL> select a.object_name, a.object_type, b.FILE#,b.BLOCK# from v$bh b, all_objects a where a.owner = 'SYS' and a.object_name = 'EMP' and a.object_id = b.OBJD;

OBJECT_NAME                    OBJECT_TYPE              FILE#     BLOCK#
------------------------------ ------------------- ---------- ----------
EMP                            TABLE                        5       1234
EMP                            TABLE                        5       1233

也可以通過dba_extents來查詢

SQL> select header_file,header_block,blocks from dba_segments where wner = 'SYS' and segment_name = 'EMP';

HEADER_FILE HEADER_BLOCK     BLOCKS
----------- ------------ ----------
          5         1233          8

轉儲資料塊資訊

SQL> alter system dump datafile 5 block min 1233 block max 1234;

系統已更改。

SQL> select spid from v$process where addr = (
  2  select paddr from v$session where sid = (
  3  select distinct sid from v$mystat));

SPID
------------
2896

然後檢視跟蹤日誌如下:
alter system dump datafile 5 minblock 1233 maxblock 1234
KGX cleanup...
KGX Atomic Operation Log 2EF16FA0
 Mutex 2EE69554(140, 0) idn 0 oper EXAM
 Cursor Parent uid 140 efd 5 whr 26 slp 0
 oper=DEFAULT pt1=00000000 pt2=00000000 pt3=00000000
 pt4=00000000 u41=0 stt=0

**********************************************************

Block header dump:  0x014004d2
 Object id on Block? Y
 seg/obj: 0xe040  csc: 0x00.75d123  itc: 2  flg: O  typ: 1 - DATA
     fsl: 0  fnx: 0x0 ver: 0x01
 
 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0008.02e.0000169e  0x018003e3.04cc.04  ----    2  fsc 0x0000.00000000
0x02   0x0006.00a.00001620  0x01800103.02fd.2a  --U-    2  fsc 0x0000.007ec96c
 
data_block_dump,data header at 0x8ee225c
===============
tsiz: 0x1fa0
hsiz: 0x1e
pbl: 0x08ee225c
bdba: 0x014004d2
     76543210
flag=--------
ntab=1
nrow=6
frre=-1
fsbo=0x1e
fseo=0x1e75
avsp=0x1f11
tosp=0x1f11
0xe:pti[0] nrow=6 offs=0
0x12:pri[0] offs=0x1f31
0x14:pri[1] offs=0x1f52
0x16:pri[2] offs=0x1f23
0x18:pri[3] offs=0x1f14
0x1a:pri[4] offs=0x1e8f
0x1c:pri[5] offs=0x1e75
block_row_dump:
tab 0, row 0, @0x1f31
tl: 16 fb: --H-FL-- lb: 0x0  cc: 3
col  0: [ 2]  c1 03
col  1: [ 6]  78 7a 78 7a 78 7a
col  2: [ 2]  c2 29
tab 0, row 1, @0x1f52
tl: 15 fb: --H-FL-- lb: 0x0  cc: 3
col  0: [ 2]  c1 04
col  1: [ 5]  64 78 7a 61 61
col  2: [ 2]  c2 15
tab 0, row 2, @0x1f23
tl: 14 fb: --H-FL-- lb: 0x2  cc: 3
col  0: [ 2]  c1 02
col  1: [ 4]  64 61 64 61
col  2: [ 2]  c2 33
tab 0, row 3, @0x1f14
tl: 15 fb: --H-FL-- lb: 0x2  cc: 3
col  0: [ 2]  c1 02
col  1: [ 5]  64 78 78 78 78
col  2: [ 2]  c2 0b
tab 0, row 4, @0x1e8f
tl: 27 fb: --H-FL-- lb: 0x1  cc: 4
col  0: [ 3]  c2 35 25
col  1: [ 6]  77 65 69 62 69 6e
col  2: [ 4]  c3 39 21 15
col  3: [ 7]  78 6d 05 04 0d 15 19
tab 0, row 5, @0x1e75
tl: 26 fb: --H-FL-- lb: 0x1  cc: 4
col  0: [ 3]  c2 03 25
col  1: [ 6]  77 65 69 62 69 6e
col  2: [ 3]  c2 1a 1f
col  3: [ 7]  78 70 05 04 0d 15 19
end_of_block_dump
End dump data blocks tsn: 0 file#: 5 minblk 1233 maxblk 1234

檢視跟蹤日誌詳細介紹下塊轉儲的3個重點區域

1、ITL區域

塊轉儲的一個關鍵區域是事務列表(ITL),以下顯示2個ITL槽,XID是事務ID,UBA是撤銷塊地址,LOCK表示鎖定的記錄數(這個示例中兩個事務槽都鎖定了2條記錄),Scn/Fsc指的是提交資訊的SCN或SFC(Free Space Credit),FSC指的是事務提交之後在塊中恢復的位元組總數,是用16進製表示的。

 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0008.02e.0000169e  0x018003e3.04cc.04  ----    2  fsc 0x0000.00000000
0x02   0x0006.00a.00001620  0x01800103.02fd.2a  --U-    2  fsc 0x0000.007ec96c

2、FLAG區域

FLAG區域是一個資料位,說明了事務的狀態(CBUT)

---- 事務是活動的,或者在塊清除前提交了事務。

C--- 事務已經被提交併且清除了行鎖定。

B--- 撤銷塊地址(UBA)包含塊的撤消。

--U- 事務已經提交(SCN是最大值),但是沒有發生塊清除(快速提交)。

---T 當塊清除的SCN被記錄時,該事務仍然是活動的。

C-U- 塊被延遲清除,回滾段的資訊已經被改寫。SCN將顯示為最小的SCN,由回滾段重新生成。

3、資料區域

資料區域的第一個部分(頭區域)

tab 0, row 4, @0x1e8f
tl: 27 fb: --H-FL-- lb: 0x1  cc: 4

資料部分如下:

col  0: [ 3]  c2 35 25
col  1: [ 6]  77 65 69 62 69 6e
col  2: [ 4]  c3 39 21 15
col  3: [ 7]  78 6d 05 04 0d 15 19

快轉儲區域EMP.ID輸出

col  0: [ 3]  c2 35 25
前面我們插入的ID是5236,資料部分均是16進製表示

35轉換成十進位制為53 - 1 = 52

25轉換成十進位制為37 - 1 = 36

C2:number in the thousands(c2 is exponent)

col  1: [ 6]  77 65 69 62 69 6e表示的是emp.name值,通過以下查詢我們就可以知道。

SQL> select dump(name,16), id, name from emp
  2  where dump(name,16) like '%77,65,69,62,69,6e';

DUMP(NAME,16)
------------------------------------------------------------
        ID NAME
---------- --------------------
Typ=1 Len=6: 77,65,69,62,69,6e
      5236 weibin

Typ=1 Len=6: 77,65,69,62,69,6e
       236 weibin

COL2也是number型,和COL一樣,不再重複解釋。

col  3: [ 7]  78 6d 05 04 0d 15 19
這裡表示的是我們插入ID為5236行的hr_date,下面就date型別的欄位做個詳解:

我們插入的hr_date值為2009-05-04 12:20:24

78轉換成十進位制為120 - 100 = 20

6d轉換成十進位制為109 -  100 = 09

05轉換成十進位制為5 (month)

04轉換成十進位制為4 (day)

0d 15 19這是時 分 秒,轉換成十進位制在減去1即得到的時間

0d轉換成十進位制為13 - 1 = 12

15轉換成十進位制為21 - 1 = 20

19轉換成十進位制為25 - 1 = 24

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25964700/viewspace-708297/,如需轉載,請註明出處,否則將追究法律責任。

相關文章