oracle block的深入研究

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]
 其他的确实不知道了,还在学习中。

请使用浏览器的分享功能分享到微信等