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

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”来分割,同一行中不同列使用列长来划分。

 

 

 

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值