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位)唯一标示,则换算成十六进制则为两组两位数。

117ee0ae7eac3a08b956800a40c26da5.png

则王的十六进制编码为cd,f5

通过utl_raw.cast_to_varchar2函数则可以把十六进制编码翻译过去

880e6b412928824383823503d0933d58.png

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表中只有两条数据如下。

78e1b233fba5382fda63115993065d11.png

查看表数据存放的数据文件号和数据块号。

38f28a0d414481130d160145d0a68a2c.png

dump出该数据块

alter system dump datafile 32 block 595716;

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

77c413061c8fd11c71fe5f6f1bbe5b78.png

----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

数据块头

cd1f68c3db68009e7afc991570bb6763.png

----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:

事务槽

cb5e97d2cc774ecb58e4dd05c14a5244.png

----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:

用户数据头

09642c988fa427bf874a48de3aed4b24.png

----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总剩余空间的大小

用户数据

5a6ae9884617143304f7ceb382aa6117.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据题意,我们可以得出以下计算过程和答案: (1)该文件系统允许文件的最大长度: - 直接地址可以表示的盘数为 10 个,每个盘最多存放 170 个盘地址,因此直接地址可以表示的最大文件大小为 10 * 170 * 512B = 870400B。 - 一次间接地址可以表示的盘数为 170 个,每个盘最多存放 170 个盘地址,因此一次间接地址可以表示的最大文件大小为 170 * 170 * 512B = 14745600B。 - 二次间接地址可以表示的盘数为 170 * 170 个,每个盘最多存放 170 个盘地址,因此二次间接地址可以表示的最大文件大小为 170 * 170 * 170 * 512B = 2520476160B。 - 三次间接地址可以表示的盘数为 170 * 170 * 170 个,每个盘最多存放 170 个盘地址,因此三次间接地址可以表示的最大文件大小为 170 * 170 * 170 * 170 * 512B = 429483622400B。 - 因此,文件系统允许文件的最大长度为 429483622400B。 (2)将文件的字节偏移量 5000、15000 转换为物理号和偏移量: - 对于字节偏移量 5000,物理号为 5000 / 512 = 9,偏移量为 5000 % 512 = 232。 - 对于字节偏移量 15000,物理号为 15000 / 512 = 29,偏移量为 15000 % 512 = 208。 (3)为了访问文件某个位置的内容,最少需要访问几次磁盘,最多需要访问几次磁盘? - 当文件的某个位置对应的盘在内存时,最少只需要访问 1 次磁盘;最多需要访问直接地址、一次间接地址、二次间接地址和三次间接地址共 4 次磁盘。如果文件的某个位置对应的盘不在内存,则需要先将相应的盘调入内存,再进访问,此时需要访问的磁盘次数会更多。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值