写入和从Oracle kernel (KCB)缓存层度取得数据文件块通常通过数据库缓冲缓存。缓存层在每个数据块上读取和维护20个字节的头和4个字节的尾。缓存头在V$TYPE_SIZE中称为common block header,控制文件块也有这样的结构,虽然并不是全部的字段使用。
DUMP出来的缓存头和尾如下:
buffer tsn: 0 rdba: 0x00400002 (1/2)
scn: 0x0000.00e9ffb4 seq: 0x01 flg: 0x04 tail: 0xffb40e01
frmt: 0x02 chkval: 0xb31e type: 0x0e=KTU UNDO HEADER W/UNLIMITED EXTENTS
头的组成如下:
数据库块地址:4个字节,表空间相对数据库块地址(RDBA),由表空间相对文件号和数据块的块号构造;
SCN:6个字节,块最后改变的SCN,低四个字节是SCN基础,前两个字节是SCN WRAP;
sequence:1个字节,在同一个SCN期间每次改变块都会增加1,如果序列号WRAP,必须产生新的SCN。如果出现为0xff,则指示块中断。
flag:1个字节,1代表:原始块;2代表:到块的最后改变是一个清除操作;4代表设置了checksum值,8代表临时数据;
format:1个字节,通常为2。
checksum:块内容的checksum,依赖于参数 db_block_checksum的设置,checksum被清除或设置。读取的时候,如果设置了该参数并且checksum在,则验证checksum。
block type:1个字节,大多数为6,适用于表,索引,聚簇。
unused:为使用空间,用于兼容性。
尾由scn基础的低两个字节和快类型以及序列号组成。在块被读取时将计算头和尾的一致性,用来检测块中断,特别是热备份期间的块拆分。
阅读(669) | 评论(0) | 转发(0) |