简单分析dump出来的oracle数据块

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

简单分析dump出来的oracle数据块

一.dump数据块

oracle的rowid中包含着这条数据对象号,数据文件号,数据文件中的块号以及块中的行号,并且这些都可以通过dbms_rowid这个包转成具体的数字出来

SQL>select dbms_rowid.ROWID_RELATIVE_FNO(rowid)as file#,dbms_rowid.ROWID_BLOCK_NUMBER(rowid)as block#,dbms_rowid.ROWID_ROW_NUMBER(rowid)as row#,a.*from paololiu.test1a;

FILE#BLOCK#ROW#AAA BBB

-------------------------------------------------------------------------------------

61310abc abc

61311111111

61312ab12ab12

可以看tset1表中的三条记录都在第6号文件的131号块上,并分别在这个块的第0,1,2行上。通过dump命令就可以把这整个块都dump出来的:

SQL>alter system dump datafile6block131;

System altered.

dump出来的文件在user_dump_dest参数设定的目录内,以_ora_.trc为格式的名字。其中spid指当前sid所对应的操作系统的进程号,可以通过以下语句获得:

SQL>select p.spid from v$session s,v$process p where s.paddr=p.addr and s.sid in(select userenv('sid')from dual);

SPID

------------------------

2413

通过vi就可以打开刚才dump出来的trc文件了,在最下面就可以看到那三条记录了

block_row_dump:

tab0,row0,@0x1f8b

tl:13fb:--H-FL--lb:0x1cc:2

col0:[5]6162632020

col1:[3]616263

tab0,row1,@0x1f7e

tl:13fb:--H-FL--lb:0x1cc:2

col0:[5]3131312020

col1:[3]313131

tab0,row2,@0x1f70

tl:14fb:--H-FL--lb:0x1cc:2

col0:[5]6162313220

col1:[4]61623132

end_of_block_dump

另外同样也可以通过dump函数来获得这些二进制文件的值(前面trc文件显示的是16进制的,这里显示的是10进制的):

SQL>select a.*,dump(aaa)as dump1,dump(bbb)as dump2from test1a;

AAA BBB DUMP1DUMP2

-------------------------------------------------------------------------------

abc abc Typ=96Len=5:97,98,99,32,32Typ=1Len=3:97,98,99

111111Typ=96Len=5:49,49,49,32,32Typ=1Len=3:49,49,49

ab12ab12Typ=96Len=5:97,98,49,50,32Typ=1Len=4:97,98,49,50

二.分析dump出来的数值

刚才那张表的数据结构如下:

SQL>desc test1;

Name Null?Type

-----------------------------------------------------------------------------

AAA CHAR(5)

BBB VARCHAR2(50)

这里可以看到typ=96代表char类型,而typ=1代表varchar2类型。后面的数值则对应的是ascii表的值,其中97是a,98是b,99是c,49是1,50是2。还有可以看到char类型后面还有一些32则对应的是空格,填充剩余字符串长度。

这里显示的是字符串,而数值型就相对比较复杂了

1.数值:123456

SQL>select dump(123456)as dump1from dual;

DUMP1

--------------------------------

Typ=2Len=4:195,13,35,57

195-193=2

193是个常数值,第一位的数字195去减193得到一个指数值2

13-1=12,12*100^2=120000

35-1=34,34*100^1=3400

57-1=56,56*100^0=56

这里-1前面的就是dump出来的后面几位的值,依次分别是13,35,57,用他们减掉一个常数值1以后再依次乘以100的递减指数倍

sum=120000+3400+56=123456

再将它们相加就可以得到原来的值了

2.数值:123456.789

SQL>select dump(123456.789)as dump1from dual;

DUMP1

--------------------------------

Typ=2Len=6:195,13,35,57,79,91

其实小数的算法和前面的整数一样的:

a.用第一位195减掉193得到指数值

195-194=2

b.后面几位分别乘以相对应的100的递减的指数倍

13-1=12;12*100^2=120000

35-1=34;34*100^1=3400

57-1=56;56*100^0=56

79-1=78;78*100^-1=0.78

91-1=90;90*100^-2=0.09

c.最后相加

120000+3400+56+0.78+0.9=123456.789

3.数值:-98765.4321

SQL>select dump(-98765.4321)as dump1from dual;

DUMP1

------------------------------------------------------------

Typ=2Len=7:60,92,14,36,58,80,102

负数的算法和前面的正数差不多,只是几个常数需要换一下

a.指数算法稍有区别:用常数62减去第一位等到指数值

62-60=2

相关文档
最新文档