信息参考: www.ixora.com.au 特别感谢 overtime 大哥对我的无私的帮助和对我一直鼓励支持我的网友 这些资料是没得到oracle 支持的 所以不能保证信息的正确性 请谨慎使用 科技无限 随便转载
oracle 8.1.7 8k block windows xp create table t(n number); insert into t values(1); --- 从 dbms_rowid 中看出table t 的数据在datafile 4 的第3个 block 上 alter system dump datafile 4 block 3; 下面是 dump 的文件的信息 还可以用下面的语句然后再用上面的 dump 语句看内存中 block 的2进制存储格式 但这内存中的2进制格式和datafile中block数据表示的顺序会略有不同可能是内存寻址的缘故吧 ALTER SESSION SET EVENTS ''''10289 trace name context forever, level 1''''; ALTER SESSION SET EVENTS ''''10289 trace name context off''''; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 下面的是 udump 目录下面 dump 文件的信息
----------------------- 第一部分
buffer tsn: 7 rdba: 0x01000003 (4/3) scn: 0x0000.000802a5 seq: 0x01 flg: 0x02 tail: 0x02a50601 frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
--- buffer tsn: 数据文件对应的 tablespace 的 number 这只是dump文件中记录的数据而已 --- block 中是没有记录 tablespace 的 number 的 --- rdba: 4 bytes datafile 中 block 的地址 标示的第几个 block --- scn: 6 bytes system change number --- seq: 1 byte A sequence number incremented for each change to a block at the same SCN --- A new SCN is allocated if the sequence number wraps. --- 同一个SCN影响这个block中的行数大于 254 行就会为这个事务分配一个新的SCN --- 如下面的操作就可能引起同一个SCN但影响的同一个block 中的行超过254行 --- "delete from table_name" --- 影响的行数(最大254) 是用从 0x01 到 0xfe 表示的 --- 当这个byte 的数据为 0xff 的时候标志这个 block 坏调了---> ora-01578 --- flg: 1 byte 1 = virgin block --- 2 = last change to the block was for a cleanout operation --- 4 = checksum value is set --- 8 = temporary data --- 这是一个可以组合的值 也就是说有为 6 的时候是 2,4 两种情况的组合 --- tail: 4 bytes 这是记录在 block 的最后面的 4 bytes 的数据 --- dump文件中只是把他写在了前面而已 --- frmt: 1 byte oracle 8 以后看见的都是 0x02 --- chkval: 2 bytes 在 init 文件中设置了 db_block_checksum=true 才有值 --- type: 1 byte 这个 block 的类型 这里主要看 0x06 这种 因为这种是用来存用户数据的 --- 其他的类型可以参考http://www.ixora.com.au/notes/cache_block_types.htm
----------------------- 第二部分 Block header dump: 0x01000003 Object id on Block? Y seg/obj: 0x614a csc: 0x00.802a3 itc: 1 flg: O typ: 1 - DATA fsl: 0 fnx: 0x0 ver: 0x01 --- seg/obj: 4 bytes 这里是16进制的 对应 sys.obj$.obj# 数据字典的数据 --- csc: 6 bytes The SCN at which the last full cleanout was performed on the block --- itc: 1 byte 下面的Itl事务条的个数 8.1.7的文档上面说可以使用 INITRANS 在建表的时候 --- 限制这个值的大小(max 255超过会报ORA-02207) 但要考虑block 的空间是否够 --- 表在8i中 INITRANS default为1 , 9.2.0中 INITRANS default为2 --- Yong Huang 说有些时候发生ORA-00060可以把表的 INITRANS 设置大点 --- ixora 上说当block的空间不够创建一个ITL的时候一样可能引起ORA-00054 --- flg: 2 bytes 0 indicates that the block is on a freelist. Otherwise the flag is - --- 9i 的ASSM 的情况下这个值为 E --- ixora 上说他占用 2 bytes 但我下面的试验和他的结果有一定的出入 --- 我观察到的情况是 : --- Object id on Block? Y --- flg: O --- ver: 0x01 --- 上面的3项是用同一个 byte 来表示的 --- typ: 1 byte 1 为 table ; 2 为 index. oracle进行查询的时候是根据 obj$表中的情况来 --- 判断对象的类型的,不是根据这个typ。也就是说如果有一个表但改变表中block --- 的这个标志位,一样可以查询出数据来,但dump block 时会出错,如下面的ora --- ORA-00600: 内部错误代码,自变量: [4555], [0], [], [], [], [], [], [] --- 错误中的 [0] 就是typ对应的数据 --- fsl: 1 byte Index to the first slot on the ITL freelist. ITL TX freelist slot --- fnx: 4 bytes 自由列表中下一块的地址 Null if this block is not on a freelist --- 有数据例如: fnx: 0x1000029 --- ver: 1 byte format (version) 这个数据没有看到相关的文档介绍 从ixora上说是占用1byte --- 但我从下面的2进制文件中看到的有不同 下面有介绍 --- unused: 4 bytes 在这里还有4 bytes 的空闲的空间 但在上面的 dump 文件上是没显示出来的 --- 这个unused 的4 bytes是 ixora 上面的说法 --- 9i 的 ASSM 的 " fsl: 0 fnx: 0x0 ver: 0x01 "这一段数据的情况已经改变了
----------------------- 第三部分 Itl Xid Uba Flag Lck Scn/Fsc 0x01 xid: 0x0003.045.000000b4 uba: 0x0080170a.00c7.36 --U- 1 fsc 0x0000.000802a5
--- 这是 oracle 用来记录事务信息的部分 这里显示的只有一个ITL条 有多少个ITL条是可以动态增加的 --- 只要 block 中的空间足够 可以定义初始化的 ITL 条的个数 用 INITRANS 这storage 参数 --- 这里有多少个 ITL 可以从上面 "第二部分" 的 "itc:" 看出来 --- 这部分牵扯 roll [1] [2] [3] [4] 下一页 [系统软件]EXP-00008: ORACLE error 904 encountered的解决方… [常用软件]PB7 连接 Oracle 的配置方法 [Web开发]oracle Export and Import 简介 [Web开发]ADO访问Oracle结果集的心得 [JAVA开发]JDBC+Hibernate将Blob数据写入Oracle [JAVA开发]J2EE应用中与Oracle数据库的连接 [JAVA开发]Oracle Application Serve_ [其他]HP-UXrx2600B.11.22Uia64安装oracle9i9.2foria64手… [其他]在RedhatEnterpriseserver3上安装oracle9iR2的注意… [其他]PROC++批量导入导出ORACLE数据库表
|