【internal】oracle数据块解析

前端之家收集整理的这篇文章主要介绍了【internal】oracle数据块解析前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

首先区分两组函数

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数据块的获取方式

ALTERSYSTEMDUMPDATAFILE {'filename'}|{filenumber}

|---BLOCK MIN{blockno} BLOCK MAX {blockno}|-->

|----BLOCK{blockno}-----------------------|

例如:

sql>alter system dump datafile 1BLOCK2;

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出该数据块

altersystemdumpdatafile32block595716;

数据库user_dump_dest目录下找到trace文件

----buffer tsn:tablespace number,表空间号,可通过selectTS#namefromv$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”来分割,同一行中不同列使用列长来划分。

猜你在找的Oracle相关文章