首先区分两组函数
dump('字符',1016)
utl_raw.cast_to_raw('字符')
utl_raw.cast_to_varchar2('十六进制编码')
dump字符后为格式,分为8,10,16,分别表示其进制,如果加上1000,如1010,1016,1008则要显示字符集信息。
这组函数翻译raw类型和字符类型数据,默认是读取定长分割的十六进制数据。
对于GBK编码集,每个汉字字符用2字节(16位)唯一标示,则换算成十六进制则为两组两位数。
如
则王的十六进制编码为cd,f5
通过utl_raw.cast_to_varchar2函数则可以把十六进制编码翻译过去
GBK编码是兼容ascii码的,ascii码是用一个字节(8位)标示一个字符,所以,在GBK编码集下,首先判断第一个字节(前8位)是否大于128,若大于128,则需要读取之后的一个字节组合后进行解读,若不大于128,则直接进行解读。
对于utl_raw.cast_to_varchar2函数,他是根据以上规则进行翻译的。
之后就是这组函数
ascii('a')
chr('')
to_char('205','XXX')
to_number('cd','XX')
这组函数是完成十六进制和十进制转化的函数,to_char()是十进制转十六进制,to_number()是十六进制转十进制。
ascii()函数是获得字符对应的ascii编码的。chr()是讲ascii编码转化为对应字符的,两者的输出输入都是十进制数。
oracle数据块的获取方式
ALTER SYSTEM DUMP DATAFILE {'filename'}|{filenumber}
|---BLOCK MIN{blockno} BLOCK MAX {blockno}|-->
|----BLOCK{blockno}-----------------------|
例如:
SQL>alter system dump datafile 1 BLOCK 2;
SQL>alter system dump datafile 'D:\003ZIXUEXI\PRODUCT\ORADATA\WJFDB\NNC_INDEX01.DBF' block 294;
SQL> alter system dump datafile 'D:\003ZIXUEXI\PRODUCT\ORADATA\WJFDB\NNC_INDEX01.DBF' block MIN 3 block max 5;
这个语法需要注意的是,如果使用filenumber方式,则数据库必须处于open且文件需为online状态。
若使用filename方式,则数据库至少处于nomount状态,及在离线状态下需要使用filename方式。
解析块文件
拿以下表作为例子,wjf_tables表中只有两条数据如下。
查看表数据存放的数据文件号和数据块号。
dump出该数据块
alter system dump datafile 32 block 595716;
从数据库的user_dump_dest目录下找到trace文件。
----buffer tsn:tablespace number,表空间号,可通过select TS#,name from v$tablespace;验证。
----rdba:数据块号和文件号,其中十六进制换成二进制后,前十位标示文件号,后面的标示块号。
----scn:
----seq:
----flg:
----tail:块的最后4个字节,可以直接看dump出的十六进制内容最后4字节。
----frmt:oracle8之后一直都是0x02
----chkval:
----type:块类型,比如06是表索引等的数据块,具体可参考http://www.ixora.com.au/notes/cache_block_types.htm
数据块头
----object id on block:object_id是否保存在块中,oracle 6之后一直都是Y
----seg/obj:object_id,对应user_objects中的object_id.
----csc:
----itc:itl事务槽的个数。
----flag:该块是否在freelist上的标志位,若为0标示在freelist上,-表示不再freelist上,E标示使用的ASSM。
----typ: 1 为 table ; 2 为 index.
oracle进行查询的时候是根据 obj$表中的情况来判断对象的类型的,不是根据这个typ。
也就是说如果有一个表但改变表中block的这个标志
位,一样可以查询出数据来,但dump block 时会出错,
----brn:
----bdba:
----ver:
----opc:
----inc:
----exflg:
事务槽
----itl:ITL事务槽编号。
----xid:transac[X]tion identified
----uba:undo block address
----flag:---- 表示transaction is active, or committed pending cleanout,
C---表示事务已经提交并且持有的锁已经清除;-
-B--表示this undo record contains the undo for this ITL entry;
--U-表示transaction committed (maybe long ago); SCN is an upper bound;
---T = transaction was still active at block cleanout SCN
----lck:事务锁住了几行数据
----scn/fsc:
用户数据头
----bdba:
----tsiz:top of size 数据块区的总大小即8064个字节
----hsiz:Data header size 数据头大小即22个字节
----pbl:
----flag:
----ntab:表示这个块的数据在一个表(如果是聚簇表就有可能是2或2以上)
----nrow:块中存储了几行数据
----frre:
----fsbo:Free space begin offset可以存放数据空间的起始位置
----fseo:Free space end offset可以存放数据空间的结束位置
----avsp:Available space for new entries可用空间的大小
----toap:Total space总剩余空间的大小
用户数据
----tl:行长,该行占18个字节,两行的偏移量相减就是行长。
----fb:
fb是一个标志位:
K = Cluster Key (Flags may change meaning if this is set to show HASH cluster)
C = Cluster table member
H = Head piece of row
D = Deleted row
F = First data piece
L = Last data piece
P = First column continues from previous piece
N = Last column continues in next piece
----lb:和上面的ITL那里的LCK对应的,表示这行数据是否被加锁
----cc:column count,表示这行数据有几列
-----[ 3]:标示该列占的字节数
对比十六进制数据可以发现,数据存储不同行之间使用","即十六进制的“2c”来分割,同一行中不同列使用列长来划分。