Oracle数据块可分为三层 

更细化

Cache layer--20字节,包含DBA、块类型、块格式、SCN;数据块被读取时进行完整性检查,确保没有损坏或fracture,即块更新信息只有部分被写入磁盘; 
Transaction layer
固定事务layer--块类型,最后一次块清除时间csc,ITL数量itc;
可变事务layer--包含ITL,每个24字节;
Data layer
Data header(KDBH):14字节,表目录项个数,行目录项个数,指向free space的开始和结束位置的偏移量,当前块剩余空间
表目录--cluster表记录多于1,记录行目录中与此表相关的个数,以及起始位置
行目录--记录每行的起始位置,即指向行头的偏移量,每个2字节;innodb采用的是entry?

以10205为例
create table t(id number(2));
insert into t values(1);
insert into t values(2);
commit;
SQL> select FILE_ID,BLOCK_ID,EXTENT_ID,BLOCKS from dba_extents where owner='SYS' and SEGMENT_NAME='T';

FILE_ID   BLOCK_ID  EXTENT_ID     BLOCKS
---------- ---------- ---------- ----------
        68    2260129          0          8

SQL> select dbms_rowid.rowid_block_number(rowid),id from t;

DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)         ID
------------------------------------ ----------
                             2260132          1
                             2260132          2
                             2260132          1

alter system dump datafile 68 block 2260132;
select spid from v$process where addr=(select paddr from v$session where sid=(select sid from v$mystat where rownum=1));

Dump block的输出格式与实际顺序可能不一致
****************cache layer******************************
buffer tsn: 115 rdba: 0x11227ca4 (68/2260132)
scn: 0x0860.07f11dad seq: 0x01 flg: 0x02 tail: 0x1dad0601
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data

SCN=2字节base + 4字节wrap
Seq:sequence number
Flag:0x01—new block;0x02—delayed logging change advance SCN/seq;0x04—check value saved-block xor’s to zero;0x08—temporary block;
Frmt:数据块格式,从8i到10205一直为0x02
Chkval:可选项,db_block_checksum=true时启用
Tail:存于块尾footer,SCN base低位2字节 + 块类型 + SCN seq = 12ca + 06 + 01

Kcbh数据结构
typedef struct kcbh_ { 
ub1 type_kcbh; 
ub1 frmt_kcbh; 
ub1 spare1_kcbh; 
ub1 spare2_kcbh; 
krdba rdba_kcbh; 
ub4 bas_kcbh; /* base of SCN */ 
ub2 wrp_kcbh; /* wrap of SCN */ 
ub1 seq_kcbh; /* seq# of changes at same scn, KCBH_NLCSEQ */ 
ub1 flg_kcbh; /* see KCBHFNEW etc below */ 
ub2 chkval_kcbh; 
ub2 spare3_kcbh; 
} kcbh;

****************transaction layer************************
--固定部分
Block header dump:  0x11227ca4
 Object id on Block? Y
 seg/obj: 0x5454c  csc: 0x860.7f11dac  itc: 2  flg: E  typ: 1 - DATA
     brn: 0  bdba: 0x11227ca1 ver: 0x01 opc: 0
     inc: 0  exflg: 0

Csc:最后一次块清除SCN
Typ:1=DATA; 2=INDEX

typedef struct ktbbh_ { /* 10201 struct ktbbh block header */ 
ub1 ktbbhtyp; /* block type */ 
ub4 ktbbhsid; 
kscn ktbbhcsc; /* effective time of last cleanout */ 
b2 ktbbhict; /* number of itl entries mask 0x00ff*/ 
ub1 ktbbhflg; /* flags */ 
ub1 ktbbhfsl; /* free space lock */ 
krdba ktbbhfnx; /* next block in free list */ 
}

--变长部分,每个ITL槽24个字节
Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x000a.01d.00017bc3  0x00800330.7d5f.1e  --U-    3  fsc 0x0000.07f11dad
0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000

Xid:事务ID undoseg + slot + wrap
Uba:undodba + seqno + recordNo
Flags:C=Commited; U=Commited Upper Bound; T=Active at CSC
Lck: 此事务涉及的行数目
Scn:提交TX时的SCN

struct ktbit { 
kxid ktbitxid; /* transaction id */ 
kuba ktbituba; /* undo address for last change */ 
b2 ktbitflg;   /* num of locks in block */ 
ktbitun_t _ktbitun; 
ub4 ktbitbas;  /* sys commit num base */ 
}

****************data layer****************************** 
tsiz: 0x1f98 
hsiz: 0x18
pbl: 0x0d0e8664
bdba: 0x11227ca4
     76543210
flag=--------
ntab=1
nrow=3
frre=-1
fsbo=0x18  --空闲空间的起始偏移量
fseo=0x1f86 –空闲空间的结束偏移量
avsp=0x1f65 –空闲空间总量
tosp=0x1f65

数据块头结构
struct kdbh { 
ub1 kdbhflag;  /* FLAGs */ 
ktno kdbhntab; /* Number of TABles in the table index */ 
ub2 kdbhnrow;  /* Number of ROWs in the row index */ 
sb2 kdbhfrre;  /* first FRee Row index Entry */ 
sb2 kdbhfsbo;  /* Free Space Beginning Offset */ 
sb2 kdbhfseo;  /* Free Space Ending Offset */ 
b2 kdbhavsp;   /* AVailable SPace in the block */ 
b2 kdbhtosp;   /* TOtal Space that will be available */ 
}

0xe:pti[0]      nrow=3  offs=0
表目录: 
struct kdbt { 
b2 kdbtoffs; /* OFFSet in the block from kdbpri */ 
b2 kdbtnrow; /* Number of Rows in the table */ 
}

0x12:pri[0]     offs=0x1f92
0x14:pri[1]     offs=0x1f8c
0x16:pri[2]     offs=0x1f86
行目录:sb2 kdbr[3]
每行对应一条记录,每个2字节,kdbr为sb2类型数组,指向每一行的头;

block_row_dump:
tab 0, row 0, @0x1f92
tl: 6 fb: --H-FL-- lb: 0x1  cc: 1
col  0: [ 2]  c1 02
tab 0, row 1, @0x1f8c
tl: 6 fb: --H-FL-- lb: 0x1  cc: 1
col  0: [ 2]  c1 03
tab 0, row 2, @0x1f86
tl: 6 fb: --H-FL-- lb: 0x1  cc: 1
col  0: [ 2]  c1 02
行由行头和数据两部分,
行头--行标志 + 锁标志 + 列数,一般占3字节;T1-行大小; cc-本行的列数; lb-锁标志位,指向ITL; fb-标志位;
数据—列长度 + 列数据

1 如何定位每1行?
由行目录kdbr存储每行的偏移量,每项2字节;
BBED> p kdbr 
sb2 kdbr[0]                                 @118      8078  
sb2 kdbr[1]                                 @120      8068    
BBED> p *kdbr[0] 
 rowdata[10] ----------- ub1 rowdata[10]                             
@8178     0x2c
由于块头包含可变长的ITL和行目录,故空闲空间从块尾开始分配;

2 row flag的取值范围
删除数据时仅将行标记为deleted,行头row flag的位掩码如下

对于普通行(没有行链接/行迁移/被删除/簇表),其基本标志位为HFL,即32+8+4=44=0x2c;
若行被删除,则row flag=44+16=60=0x3c;
恢复尚未被覆盖的删除行,只需将其row flag从3c改为2c,row flag位于行头首字节;
详细可参照http://orafaq.com/papers/dissassembling_the_data_block.pdf

3 行锁原理?
Oracle没有为行锁提供数据结构,而是通过 事务表 + ITL + lb(row header)实现;
一个事务分配一个TX lock和若干TM lock,涉及的数据块各需1个ITL,通过其XID关联事务表slot,而数据行则通过lb指向本块的ITL;

4 数据块验证?
数据块读入内存或写入磁盘时,会做一致性检查:
1 块版本,块头的SCNBase/块类型/seq同footer比较;
2 cache层的DBA同block buffer的DBA比较;
3 block-checksum, 如果开启checksum则做验证;

Dbv只检查数据块的header/footer,做逻辑验证;
Db_block_checking:替代10210/10211/10212事件,进行块完整性检查,如free slot list/行位置/锁数量;检查时会复制块,如有错误将块标志为soft corruption;
Db_block_checksum:dbwr和direct loader写数据块时计算checksum并存于cache层chkval,再次读取时重新计算并与已有checksum比较;
Dbms_repair修复cache/transaction层的错误,将块标示为soft corruption;

event
10231全表扫描时跳过坏块
10233跳过索引坏块

oracle数据块格式小结相关推荐

  1. Oracle的逻辑结构(表空间、段、区间、块)——Oracle数据块(一)

    Oracle 的逻辑结构 ( 表空间.段.区间.块 ) --块 Oracle 存储数据的最小单位是数据块.Oracle 管理 数据库 数据文件的存储空间被称为数据块,一个数据块是数据库使用的最小数据单 ...

  2. Oracle数据块原理深入剖析

    数据块(Oracle Data Blocks),本文简称为"块",是Oracle最小的存储单位,Oracle数据存放在"块"中.一个块占用一定的磁盘空间.特别注 ...

  3. oracle itl解析,oracle数据块dump文件中ITL详解

    oracle数据块dump文件中ITL详解 dump出Oracle block后,可以看到事物槽,包含有事物槽号(ITL),XID,UBA,FLAG,LCK,SCN. 本文主要讨论FLAG标记的规则, ...

  4. Oracle数据块损坏的恢复实例

    测试环境:11.2.0.4 1.构建数据块损坏的测试环境 2.有备份:常规恢复坏块 3.无备份:跳过坏块 1.构建数据块损坏的测试环境 1.1 创建测试表 --Create Table t_test ...

  5. oracle数据块坏,Oracle数据块损坏解决办法

    背景: 1.PDM(Windchill)系统 2.exp数据错误,没有rman备份数据 3.数据库trc文件报错 Dump file d:\oracle\admin\wind\udump\wind_o ...

  6. ORA-01578: ORACLE 数据块损坏 之奇妙处理 DBV

    下午接到研发人员报告: ORA-01578: ORACLE 数据块损坏 根据网上诸多仁兄的处理方案,具体采用下面检查: ORA-01578: ORACLE 数据块损坏 (文件号 6, 块号 20) O ...

  7. oracle数据块损坏后的修复方法

    关于oracle数据块损坏的解决方法,相关链接网址在: http://blog.csdn.net/dlinger/archive/2004/08/24/83911.aspx http://www.it ...

  8. Oracle 数据块损坏与恢复具体解释

    1.什么是块损坏: 所谓损坏的数据块,是指块没有採用可识别的 Oracle 格式,或者其内容在内部不一致. 通常情况下,损坏是由硬件故障或操作系统问题引起的.Oracle 数据库将损坏的块标识为&qu ...

  9. oracle去掉0x00,ORACLE数据块转储及RDBA的转换

    本文打包下载地址:下载地址一:下载地址二 很多时候我们在进行进一步研究时需要转储(dump)Oracle的数据块,以研究其内容,Oracle提供了很好的方式,我们通过以下例子简单说明一下: [orac ...

最新文章

  1. 强化学习与3D视觉结合新突破:高效能在线码垛机器人
  2. java 集合快速排序_搞定Java快速排序
  3. 成功解决ValueError: Input contains NaN, infinity or a value too large for dtype('float64').
  4. 2022-03-22
  5. 为什么一定要好好睡觉?
  6. QGraphicsScene 的简单理解--关于手册的简要翻译
  7. 完数c++语言程序_C语言经典100题(19)
  8. 取模运算性质_求余、取模运算在RTOS中计算优先级的理解
  9. 智能会议系统(6)---高效视频会议系统
  10. OpenGL简介+一个简单的程序
  11. flutter 发布release版的流程(android)
  12. Tomcat配置阿里云免费的SLL证书
  13. OpenCV-Python教程8-图像混合
  14. 基于BP神经网络的PID控制器
  15. Python中round函数
  16. 从技术走向管理——李元芳履职记
  17. IT人才外包服务的好处?
  18. word 方框打勾_复制拿走即用
  19. html5轮播怎么自动换图,如何使用JavaScript实现“无缝滚动 自动播放”轮播图效果...
  20. Vue的MVVM(model、view、viewmodel)

热门文章

  1. 尚硅谷-SpringMVC篇
  2. 进存销管理系统(仓库管理系统)
  3. 读书笔记_006 《查令十字街84号》
  4. 近期研究方向 (内部参考)
  5. 企业在项目中采用工时管理系统的好处
  6. 20-《电子入门趣谈》第四章_自己制作电路板-4.1面包板的介绍和经典案例使用教程
  7. c++游戏之城市守卫战
  8. youtube批量采集-低成本解决方案-2
  9. Youtube 评论数
  10. 推荐计算机 在线使用方法,在线记笔记平台推荐:如何优雅地用电脑记笔记