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