oracle block的深入研究

jinqibingl發表於2012-10-04

oracle block的深入研究  

為了深入的研究oracle block,頭都整大了。

1、建立環境。

connect system/******

create table test (name varchar(10),age number(3));

insert into test values('lee',30);

insert into test values('jhon',57);

2、為了先避免一些實在看不懂的東西出現,所以這時候重啟資料庫。清乾淨BUFFER中的資料。

3、DUMP檔案的資料塊。

SQL> select segment_name,block_id,blocks from dba_extents where segment_name='TE
ST';

SEGMENT_NAME    BLOCK_ID     BLOCKS
--------------------------------------------------------------------------------
TEST                        11721            8

SQL> alter system dump datafile 1 block min 11721 block max 11728;

System altered.

4、看跟蹤檔案:

這裡省略了部分塊,這顯示一個帶資料的塊的內容,請注意,這個塊號是11725,也就是說之前的4個塊,11721到11724是全部沒有資料的,加入的資料也會存在這個塊或者之後的塊了,這是因為這個空間,我配置的是segment space management auto,段空間自動管理,前4個塊是用來放置段空間管理用的。

Start dump data blocks tsn: 9 file#: 8 minblk 11721 maxblk 11728
buffer tsn: 9 rdba: 0x02002dcd (8/11725)
scn: 0x0000.0018d626 seq: 0x01 flg: 0x06 tail: 0xd6260601
frmt: 0x02 chkval: 0xb1d4 type: 0x06=trans data
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x00000000079C6000 to 0x00000000079C8000
0079C6000 0000A206 02002DCD 0018D626 06010000  [.....-..&.......]
0079C6010 0000B1D4 00000001 0000DCA2 0018BFA1  [................]
0079C6020 00000000 00320002 02002DC9 001E0004  [......2..-......]
0079C6030 000002B3 00800015 00230237 00002001  [........7.#.. ..]
0079C6040 0018D626 002B0008 00000333 0080073E  [&.....+.3...>...]
0079C6050 001D028E 00008000 0018B465 00000000  [........e.......]
0079C6060 00000000 00060100 001EFFFF 1F391F57  [............W.9.]
0079C6070 00001F39 1F8E0006 1F781F83 1F621F6D  [9.........x.m.b.]
0079C6080 00001F57 00000000 00000000 00000000  [W...............]
0079C6090 00000000 00000000 00000000 00000000  [................]
        Repeat 497 times
0079C7FB0 00000000 00000000 2C000000 6A040201  [...........,...j]
0079C7FC0 026B6361 002C3DC1 686A0402 C1026E6F  [ack..=,...jhon..]
0079C7FD0 02002C3A 6F686A04 3AC1026E 0402002C  [:,...jhon..:,...]
0079C7FE0 6E6F686A 2C3AC102 6A040200 026E6F68  [jhon..:,...jhon.]
0079C7FF0 002C3AC1 656C0302 29C10265 D6260601  [.:,...lee..)..&.]
Block header dump:  0x02002dcd
 Object id on Block? Y
 seg/obj: 0xdca2  csc: 0x00.18bfa1  itc: 2  flg: E  typ: 1 - DATA
     brn: 0  bdba: 0x2002dc9 ver: 0x01 opc: 0
     inc: 0  exflg: 0
 
 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0004.01e.000002b3  0x00800015.0237.23  --U-    1  fsc 0x0000.0018d626
0x02   0x0008.02b.00000333  0x0080073e.028e.1d  C---    0  scn 0x0000.0018b465
 
data_block_dump,data header at 0x79c6064
===============
tsiz: 0x1f98
hsiz: 0x1e
pbl: 0x079c6064
bdba: 0x02002dcd
     76543210
flag=--------
ntab=1
nrow=6
frre=-1
fsbo=0x1e
fseo=0x1f57
avsp=0x1f39
tosp=0x1f39
0xe:pti[0] nrow=6 offs=0
0x12:pri[0] offs=0x1f8e
0x14:pri[1] offs=0x1f83
0x16:pri[2] offs=0x1f78
0x18:pri[3] offs=0x1f6d
0x1a:pri[4] offs=0x1f62
0x1c:pri[5] offs=0x1f57
block_row_dump:
tab 0, row 0, @0x1f8e
tl: 10 fb: --H-FL-- lb: 0x0  cc: 2
col  0: [ 3]  6c 65 65
col  1: [ 2]  c1 29
tab 0, row 1, @0x1f83
tl: 11 fb: --H-FL-- lb: 0x0  cc: 2
col  0: [ 4]  6a 68 6f 6e
col  1: [ 2]  c1 3a
tab 0, row 2, @0x1f78
tl: 11 fb: --H-FL-- lb: 0x0  cc: 2
col  0: [ 4]  6a 68 6f 6e
col  1: [ 2]  c1 3a
tab 0, row 3, @0x1f6d
tl: 11 fb: --H-FL-- lb: 0x0  cc: 2
col  0: [ 4]  6a 68 6f 6e
col  1: [ 2]  c1 3a
tab 0, row 4, @0x1f62
tl: 11 fb: --H-FL-- lb: 0x0  cc: 2
col  0: [ 4]  6a 68 6f 6e
col  1: [ 2]  c1 3a
tab 0, row 5, @0x1f57
tl: 11 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [ 4]  6a 61 63 6b
col  1: [ 2]  c1 3d
end_of_block_dump
5、然後,查詢下這個表,確保這個表被儲存到BUFFER中。

6、DUMP出快取記憶體中的BLOCK。

SQL> connect / as sysdba
Connected.
SQL> alter session set events 'immediate trace name set_tsn_p1 level TS#+1';這裡的TS#+1,其實就是上面的tsn: 9+1,就是10.

Session altered.

SQL> alter session set events 'immediate trace name buffer level 0x02002dcd';這裡的0x02002dcd是上面看出來的,就是RDBA,也就是BDBA。

Session altered.

7、兩份跟蹤檔案內容比對,後面的資料部分是一樣的,所以這裡只列舉了頭部分。

從BUFFER中DUMP出來的:

Dump of buffer cache at level 10 for tsn=9, rdba=33566157
BH (000007FF15BE8F48) file#: 8 rdba: 0x02002dcd (8/11725) class: 1 ba: 000007FF15986000
  set: 3 blksize: 8192 bsi: 0 set-flg: 2 pwbcnt: 20
  dbwrid: 0 obj: 56482 objn: 56482 tsn: 9 afn: 8
  hash: [22fc4e70,22fc4e70] lru: [15be90d8,15be8eb8]
  ckptq: [NULL] fileq: [NULL] objq: [15be9148,15be8f28]
  st: XCURRENT md: NULL tch: 3
  flags: only_sequential_access
  LRBA: [0x0.0.0] HSCN: [0xffff.ffffffff] HSUB: [65535]
  buffer tsn: 9 rdba: 0x02002dcd (8/11725)
  scn: 0x0000.0018d626 seq: 0x01 flg: 0x06 tail: 0xd6260601
  frmt: 0x02 chkval: 0xb1d4 type: 0x06=trans data
從檔案中DUMP出來的:

Start dump data blocks tsn: 9 file#: 8 minblk 11721 maxblk 11728
buffer tsn: 9 rdba: 0x02002dcd (8/11725)
scn: 0x0000.0018d626 seq: 0x01 flg: 0x06 tail: 0xd6260601
frmt: 0x02 chkval: 0xb1d4 type: 0x06=trans data
請仔細比對,BUFFER中,塊頭增加了很多內容,這裡還是分別列舉,具體含義還不清楚:

set: 3

blksize: 8192

bsi: 0

set-flg: 2

pwbcnt: 20
  dbwrid: 0   這個似乎是DBWR的程式號。

obj: 56482  這是object_id

objn: 56482   這是object_id

tsn: 9   tablespace的TS號

afn: 8   datafile的檔案號
  hash: [22fc4e70,22fc4e70] 資料塊的HASH值 

lru: [15be90d8,15be8eb8]  
  ckptq: [NULL]

fileq: [NULL]

objq: [15be9148,15be8f28]
  st: XCURRENT 這個和查詢有關,好像是為了解決查詢和DML併發處理用的,還有一個是CR和READING。

md: NULL

tch: 3
  flags: only_sequential_access
  LRBA: [0x0.0.0]

HSCN: [0xffff.ffffffff]

HSUB: [65535]
 其他的確實不知道了,還在學習中。

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

相關文章