对data block物理结构的认识
1.Data Block 物理结构图:
2.一次对block的dump过程:
PHP code:
SQL> create table t9 (a varchar(10)); Table created. SQL> insert into t9 values('a'); 1 row created. SQL> commit; Commit complete.
SQL> set serveroutput on PL/SQL procedure successfully completed. SQL> alter system dump datafile 3 block 122; System altered. SQL> select * from v$tablespace;
TS# NAME INC |
Trace 文件:
*** 2004-07-25 15:48:01.000Start dump data blocks tsn: 8 file#: 3 minblk 122 maxblk 122buffer tsn: 8 rdba: 0x00c0007a (3/122)scn: 0x0000.0068d716 seq: 0x01 flg: 0x02 tail: 0xd7160601frmt: 0x02 chkval: 0x0000 type: 0x06=trans dataBlock header dump: 0x00c0007aObject id on Block? Yseg/obj: 0x806d csc: 0x00.68d714 itc: 2 flg: O typ: 1 - DATAfsl: 0 fnx: 0x0 ver: 0x01Itl Xid Uba Flag Lck Scn/Fsc0x01 0x0004.00b.00000fac 0x00801885.008c.56 --U- 1 fsc 0x0000.0068d7160x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000data_block_dump,data header at 0x552105c===============tsiz: 0x1fa0hsiz: 0x14pbl: 0x0552105cbdba: 0x00c0007a76543210flag=--------ntab=1nrow=1frre=-1fsbo=0x14fseo=0x1f9bavsp=0x1f83tosp=0x1f830xe:pti[0] nrow=1 offs=00x12:pri[0] offs=0x1f9bblock_row_dump:tab 0, row 0, @0x1f9btl: 5 fb: --H-FL-- lb: 0x1 cc: 1col 0: [ 1] 61end_of_block_dumpEnd dump data blocks tsn: 8 file#: 3 minblk 122 maxblk 122
3.先介绍数据块中包括的3种头信息:
首先,数据块是通过data block buffer cache完成读和写操作的,所以它提供了20bytes的Cache Header和4bytes的 Tail给Cache,用来读取和管理 。
第2部分是为Transaction层提供的Header信息。它一共占据了48bytes,包括24bytes的控制信息,和一系列的Interested Transaction Slot (ITS)。
剩下的部分都叫Data Area,用来存储用户数据。Data Area也包括data header,和row data及剩余空间。但是Cluster blocks, table blocks, index block的data header,row data结构是不相同的,这里主要介绍table blocks.
4. 结合trace文件中的信息,详细介绍:
1) The Cache Header and Tail:
buffer tsn: 8 rdba: 0x00c0007a (3/122)
scn: 0x0000.0068d716 seq: 0x01 flg: 0x02 tail: 0xd7160601
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Database block address: 占用4 bytes,表示Tablespace relative database block address(RDBA)。包括tns=8,即Tablespace number (User 表空间),file#=3, block_id=122
SCN: 占用6bytes,表示最后变化的scn.包括2bytes的高位字节(SCN wrap),和4bytes的低位字节(SCN base)
Sequence: 占用1byte,用途不明确,可能是辅助SCN的变化
Flag: 占用1byte
Format: 占用1byte,应该是用来区分版本。Oracle 8之前值为1,之后为2.
Checksum: 占用2byte,跟db_block_checksum 参数有关系。
引用oracle document 的解释:“DB_BLOCK_CHECKSUM determines whether DBWn and the direct loader will calculate a checksum (a number calculated from all the bytes stored in the block) and store it in the cache header of every data block when writing it to disk. Checksums are verified when a block is read-only if this parameter is true and the last write of the block stored a checksum. In addition, Oracle gives every log block a checksum before writing it to the current log.