`

如何分解rdba地址

阅读更多
puber晶晶的一篇文章http://space.itpub.net/13095417/viewspace-171150
介绍了ASSM寻找free block的过程其中在转储L3块的时候,在文件中有这样一项
L2 Hint for inserts:  0x010002e2
这是寻找L2块的线索,但是这是一个rdba地址,我们如何从这个块地址中知道file_id和block_id呢?进而进一步转储研究呢?

还得先复习一下rowid的知识:
------------------------------------------
我们都知道rowid表示一行的物理地址,一行唯一确定一个rowid,并且在使用中一般不会改变,除非rowid之后在行的物理位置发生改变的情况下才会发生变化。需要注意的是rowid并不会真正存在于表的data block中,但是他会存在于index当中,用来通过rowid来寻找表中的行数据。
oracle8以前一个rowid占用6个字节大小的存储空间(10bit file#+22bit block#+16bit row#),那么oracle 8以后这个rowid的存储空间扩大到了10个字节(32bit object#+10bit rfile#+22bit block#+16bit row#),所以数据库中数据库文件个数的限制从整个数据库最多只能有的2^10-1个数据文件,变为了每个表空间中可以最多有2^10-1个数据文件。(需要注意的是:local index中存储的rowid是6个字节,而global index中存储的rowid是10个字节)
那么增加的32bit object#这个前缀主要就是用来定位表空间的,同时这个object#其实对应的就是data_object_id,由于一个段对象只能属于一个表空间,同时data_object_id就是标识了一个段的物理存储id.因此object#+rfile#就可以唯一定位当前的rowid是在那个数据文件上了。
我们可以通过dbms_rowid这个包来转换我们的rowid成不同组成部分

dbms_rowid.rowid_object(rowid)---> 32bit object#
dbms_rowid.rowid_relative_fno(rowid)---> 10bit rfile#
dbms_rowid.rowid_block_number(rowid)---> 22bit block#
dbms_rowid.rowid_row_number(rowid)---> 16bit row#

那么理解了rowid的组成,我们就很容易的理解rdba的计算了
其实rdba就是rowid中的rfile#+block#

对于0x010002e2这个地址,由于他是一个16进制的数字串,转换为10进制就是16777954

这个时候我们就可以通过dbms_utility这个包来进而分解我们的rdba地址
SQL>select dbms_utility.data_block_address_file(16777954) "file",dbms_utility.data_block_address_block(16777954) "block"
  2  from dual;

      file      block
---------- ----------
         4        738

这样我们在根据这条记录的内容来转储L2块信息:

alter system dump datafile 4 block 738

基本上就是这样。


附:
rdba: 0x004062ba (1/25274)
我们通过这个例子介绍一下.
rdba从Oracle6->Oracle7->Oracle8发生了三次改变:
在Oracle6中,rdba由6位2进制数表示,也就是说数据块最多只能有2^6=64个数据文件(去掉全0和全1, 实际上最多只能代表62个文件),在Oracle7中,rdba中的文件号增加为10位,为了向后兼容,从Block号的高位拿出4位作为文件号的高位.这样从6->7的Rowid无需发生变化.
而数据文件的个数理论上则扩展到了1022个(去掉全0和全1),在Oracle7中,rowid格式为:BBBBBBBB.RRRR.FFFF  在Oracle8中,文件号仍然用10位表示,只是不再需要置换,为了向后兼容,同时引入了相对文件号(rfile#),所以从Oracle7到Oracle8,Rowid仍然无需发生变化.
在Oracle8i中,Oracle引入了dataobj#,rowid的格式为:OOOOOOFFFBBBBBBSSS,Oracle通过dataobj#进一步向上定为表空间等,从而使每个表空间的数据文件数量理论上可以达到1022个

举例说明如下:
在Oracle6中:
比如: file 8, block 56892
  26位block号==56892
      vv  vvvvvvvv  vvvvvvvv  vvvvvvvv
00100000  00000000  11011110  00111100
^^^^^^
6位文件号==8
在Oracle7中:
比如:File 255, block 56892
11111100 11000000  11011110  00111100
F   C    C   0     D   E     3  C
\_____/\___/\_______________________/
   |     |      |  
   |     | Block = 0xDE3C = 56892    
   \_____________      
         |  \  
         V   V           
        0011   111111 = 0xFF = 255 --注意这里高位和低位要置换才能得出正确的file#
在Oracle8中:
比如:File 255, block 56892
11111100 11000000  11011110  00111100
F   C    C   0     D   E     3  C
\_____/\___/\_______________________/
   |     |      |  
   |     | Block = 0xDE3C = 56892    
   \_____________      
         |  \  
         V   V           
      0011 1111 0011 = 03F3 = 1011 --这就是相对文件号
对于我们测试中的例子:
rdba: 0x004062ba (1/25274)
也就是:0000 0000 0100 0000 0110 0010 1011 1010
前10位为rfile#: 0000 0000 01 = 1
后22位为Block#:00 0000 0110 0010 1011 1010 = 25274
分享到:
评论

相关推荐

    BLOG_Oracle_lhr_【BBED】BBED模拟并修复ORA-08102错误

    通过本文的学习,读者将掌握使用BBED修复ORA-08102错误的方法,了解BBED的基本使用,能够解释数据块格式的dump文件,解读ORA-08102错误的trace文件,以及从rdba获取ROWID信息等实用技能。这些知识对于Oracle数据库...

    bbed_used_to_change_sys_password

    2. **确定RDBA**:每个Oracle数据文件块都包含一个固定的头部,其中包含有关该块的信息,如RDBA。通过分析转储文件中的块信息,可以找到包含SYS用户密码哈希值的块的RDBA。 3. **确定OFFSET**:OFFSET是指相对于已...

    多队列(queues)网卡DMA收包方式.pdf

    其中,RDBA寄存器用于存储队列的descriptor ring的物理地址,RDLEN寄存器用于存储队列的描述符长度,RXDCTL寄存器用于控制队列的使能状态。 程序分析 在驱动程序中,需要为每个队列分配一个Ring结构体数组。Ring...

    oracle数据块结构分析说明

    4. 相对数据库地址(RDBA):表示数据块在数据文件中的相对地址,包括文件 ID 和块 ID。文件 ID 是一个 10 位二进制数,块 ID 是一个 22 位二进制数。 5. 系统更改号(SCN):表示数据块的系统更改号,用于记录数据...

    浅谈Oracle常见错误处理

    Data Block Address(DBA)是数据块的地址,而Root DBA(RDBA)通常指的是系统表空间中段的DBA。XID代表事务标识符,用于在感兴趣事务列表(ITL)中标记事务。ITL则是数据块中记录事务状态的列表。Oracle的ROWID格式...

    oracle索引说明

    - **rdba**:表示分支块的相对数据库块地址。 - **scn**:表示块最后改变的SCN号。 - **type**:表示块类型。 - **seg/obj**:表示16进制对象ID。 - **typ**:表示段类型。 - **Itl**:表示相关的事务槽,包括槽ID、...

    关于ORACLE通过file_id与block_id定位数据库对象遇到的问题引发的思考

    在ORACLE中,我们可以通过file_id(file#)与block_id(block#)去定位一个数据库对象(object)。例如,我们在10046生成的trace文件中file#=4 block#=266 blocks=8,那么我可以通过下面两个SQL去定位对象 ...

    Oracle中数据文件坏块的验证与处理.pdf

    Oracle在读取或写入数据块前会进行一致性检查,检查内容包括数据块的类型、地址信息、SCN(System Change Number)以及数据块的头部和尾部的校验值。如果发现任何不一致,该块将被标记为坏块。这种机制有助于确保...

    Oracle常用dump命令介绍

    其中 `n` 是指定Block的RDBA,该命令可以转储某个Block在Buffer中的所有版本。 ##### 6\. Heap Heap Dump 用于获取堆内存区域的信息: - **`ALTER SESSION SET EVENTS 'immediate trace name heapdumplevel ...

    MVCC-(Oracle-Innodb-Postgres)PPT课件.pptx

    Fixed部分包括rdba、scn和seq,variable部分包括ITLs(Interested Transaction List)和CSC(cleanout scn)。 5. 行格式:Oracle的行格式包括tl(total length)、fb(flag byte)、lb(lock byte)和cc(column ...

    Oracle常用dump命令,记录一下备查。

    该命令可以dump出某个指定block在buffer中的所有版本,n为该block的RDBA。 6. Heap Dump ALTER SESSION SET EVENTS ‘immediate trace name heapdump level level'; 该命令可以dump出Heap的信息,包括PGA摘要、...

    OUD恢复表被TRUNCATEOFFLINE表所在的表空间生成数据字典[文].pdf

    在`dump datafile`的输出中,可以看到数据段头的详细信息,包括块类型、格式、RDBA(Relative Database Address)、SCN(System Change Number)等。此外,还有高水位标记、低水位标记以及BMB(Block Management ...

    Oracle数据块损坏知识.pdf

    KCBH中包括用于确认数据块内容一致性的chkval_kcbh值,以及存放数据类型的type_kcbh、RDBA和格式版本、数据块更新情况的信息。几乎所有的数据块都有Cache层。 事务层记录了在数据块上执行或执行过的事务信息,如...

    一种基于OSGi的动态演化方法

    1. **3RDBA 方法:**Postma 提出的一种用于替换长期运行组件的方法,包括探测、联合和迁移三个阶段。 2. **在线演化方法:**王晓鹏等人提出的一种基于JAVA平台类装载机制的扩展,允许以构件为单位进行在线演化。 3. ...

    oracle恢复工具-FY_Recover_Data

    RDBA=0x01001474(4/5236)=16782452,type=0x06,fmt=0xa2,seq=0x02,flag=0x04 seg/obj=0x000026f8=9976,csc=0x0000.0006caf5,itc=3,typ=1 - DATA FLG=0x32, fls=0, nxt=0x01001471(4/5233)=16782449 ...... 可以...

Global site tag (gtag.js) - Google Analytics