博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oracle Study之案例--Oracle 数据块地址(Block Address)
阅读量:6069 次
发布时间:2019-06-20

本文共 4192 字,大约阅读时间需要 13 分钟。

 Oracle访问数据是以block为单位,本文简单介绍了如何通过Block Address在内存中获取所需要的block。

DBA(data block address):

A DBA is the address of an oracle data block for access purposes.

RDBA (Tablespace relative database block address):

RDBA 是相对数据块地址,是数据所在的地址,rdba可就是rowid 中rfile#+block#

ROWID:

      Oracle在通过Index访问时,通过rowid确定row的位置;我们都知道rowid表示一行的物理地址,一行唯一确定一个rowid,并且在使用中一般不会改变,除非rowid之后在行的物理位置发生改变的情况下才会发生变化。需要注意的是rowid并不会真正存在于表的data block中,但是他会存在于index当中,用来通过rowid来寻找表中的行数据。
     Oracle8以前一个rowid占用6个字节大小的存储空间(10bit file#+22bit block#+16bit row#),那么oracle 8以后这个rowid的存储空间扩大到了10个字节(32bit object#+10bit rfile#+22bit block#+16bit row#),所以数据库中数据库文件个数的限制从整个数据库最多只能有的2^10-1个数据文件,变为了每个表空间中可以最多有2^10-1个数据文件。

     (需要注意的是:local index中存储的rowid是6个字节,而global index中存储的rowid是10个字节)
     那么增加的32bit object#这个前缀主要就是用来定位表空间的,同时这个object#其实对应的就是data_object_id,由于一个段对象只能属于一个表空间,同时data_object_id就是标识了一个段的物理存储id.因此object#+rfile#就可以唯一定位当前的rowid是在那个数据文件上了。
我们可以通过dbms_rowid这个包来转换我们的rowid成不同组成部分:

1
2
3
4
dbms_rowid.rowid_object(rowid) ---> 32bit 
object#dbms_rowid.rowid_relative_fno(rowid) ---> 10bit 
rfile#dbms_rowid.rowid_block_number(rowid) ---> 22bit 
block#dbms_rowid.rowid_row_number(rowid) ---> 16bit row#

案例分析:

1、通过dbms_utility转换地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
10
:
33
:
59 
SYS@ test1 >desc dbms_utility
FUNCTION DATA_BLOCK_ADDRESS_BLOCK RETURNS NUMBER
 
Argument Name                  Type                    In/Out Default?
 
------------------------------ ----------------------- ------ --------
 
DBA                            NUMBER                  IN
  
FUNCTION DATA_BLOCK_ADDRESS_FILE RETURNS NUMBER
 
Argument Name                  Type                    In/Out Default?
 
------------------------------ ----------------------- ------ --------
 
DBA                            NUMBER                  IN
  
FUNCTION MAKE_DATA_BLOCK_ADDRESS RETURNS NUMBER
 
Argument Name                  Type                    In/Out Default?
 
------------------------------ ----------------------- ------ --------
 
FILE                           NUMBER                  IN
 
BLOCK                          NUMBER                  IN

2、通过rowid获取RDBA

1
2
3
4
5
6
7
8
9
10
11
12
11
:
14
:
36 
SYS@ test1 >conn scott/tiger
Connected.
11
:
14
:
39 
SCOTT@ test1 >select rowid,ename 
from 
emp 
where 
rownum=
1
;
ROWID              ENAME
------------------ ----------
AAAESjAAEAAAACVAAA SMITH
 
11
:
15
:
05 
SCOTT@ test1 >select dbms_rowid.ROWID_RELATIVE_FNO(rowid) ,dbms_rowid.ROWID_BLOCK_NUMBER(rowid) 
from 
emp 
where 
rownum=
1
;
 
DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
------------------------------------ ------------------------------------
                                   
4                                  
149

3、通过Dump获取block信息

11:42:16 SYS@ test1 >alter system dump datafile 4 block 149;

System altered.

Block dump 
from 
cache:
Dump of buffer cache 
at 
level 
4 
for 
tsn=
4
, rdba=
16777365
Block dump 
from 
disk:
buffer tsn: 
4 
rdba: 
0x01000095 
(
4
/
149
)
scn: 
0x0000.
009722f6 seq: 
0x01 
flg: 
0x04 
tail: 
0x22f60601
frmt: 
0x02 
chkval: 
0x52a5 
type: 
0x06
=trans data
Hex dump of block: st=
0
, typ_found=
1
Dump of memory 
from 
0x008E8200 
to 
0x008EA200
8E8200 
0000A206 
01000095 
009722F6 
04010000  
[........."......]
......
Block header dump:  
0x01000095
 
Object id 
on 
Block? Y
 
seg/obj: 
0x44a3  
csc: 
0x00.
9722f6  itc: 
2  
flg: E  typ: 
1 
- DATA
     
brn: 
0  
bdba: 
0x1000090 
ver: 
0x01 
opc: 
0
     
inc: 
0  
exflg: 
0
 
Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   
0x001b.
01f.0000007a  
0x01c01c55.
0121.23  
C-U-    
0  
scn 
0x0000.
00971d50
0x02   
0x0000.
000.00000000  
0x00000000.
0000.00  
----    
0  
fsc 
0x0000.
00000000
bdba: 
0x01000095
data_block_dump,data header 
at 
0x8e8264
......
block_row_dump:
tab 
0
, row 
0
, @
0x1f72
tl: 
38 
fb: --H-FL-- lb: 
0x0  
cc: 
8
col  
0
: [ 
3
]  c2 4a 
46
col  
1
: [ 
5
]  
53 
4d 
49 
54 
48
col  
2
: [ 
5
]  
43 
4c 
45 
52 
4b
col  
3
: [ 
3
]  c2 
50 
03
col  
4
: [ 
7
]  
77 
b4 0c 
11 
01 
01 
01
col  
5
: [ 
2
]  c2 
09
col  
6
: *NULL*
col  
7
: [ 
2
]  c1 
15
tab 
0
, row 
1
, @
0x1f47
......

4、通过RDBA获取rowid中的rfile#和block_id

1
2
3
4
11
:
21
:
20 
SCOTT@ test1 >select dbms_utility.data_block_address_file(
16777365
"file"
,dbms_utility.data_block_address_block(
16777365
"block" 
from 
dual;
      
file      block
---------- ----------
         
4        
149

5、16进制转换

1
2
3
4
11
:
43
:
11 
SYS@ test1 >select to_number(
'01000095'
,
'xxxxxxxx'
from 
dual;
TO_NUMBER(
'01000095'
,
'XXXXXXXX'
)
--------------------------------
                        
16777365

6、手工方式转换

1
2
3
4
5
rdba: 
0x01000095 
(
4
/
149
)
二进制:
0000 
0001 
0000 
0000 
0000 
0000  
1001 
0101
10
位:(rfile#) 
0000 
0001 
00  
=
4
22
位: (block#) 
00 
0000 
0000 
0000  
1001 
0101
                  
128
16
+
5
=
149
本文转自 客居天涯 51CTO博客,原文链接:http://blog.51cto.com/tiany/1590972,如需转载请自行联系原作者
你可能感兴趣的文章
Perl快捷删除数组重复元素
查看>>
java设计模式4--建造者模式(Builder)
查看>>
[Domino]“java.lang.ClassCastException:lotus.domino.cso.Item”异常解决办法
查看>>
java String转Date问题
查看>>
[华为机试练习题]26.铁路栈问题
查看>>
Android popupWindow打造一个扩展性强的的抽象BasePopup类
查看>>
一分钟了解阿里云产品:数据集成概述
查看>>
HTML5贪吃蛇源码
查看>>
容器环境下的持续集成最佳实践:构建基于 Drone + GitFlow + K8s 的云原生语义化 CI 工作流...
查看>>
[架构基本功]Parcelable序列化
查看>>
kotlin 协程
查看>>
CentOS 搭建 Socks5 Proxy 代理服务器
查看>>
小程序开发-mpvue构建小程序项目-1-踩坑
查看>>
[知识图谱] 3.3-Cypher语言及语法使用
查看>>
CSS重构
查看>>
iOS开发小知识之正则表达式的简单用法
查看>>
【毕设进行时-工业大数据,数据挖掘】Java Batch数据库写入百万条记录!时间减半...
查看>>
From BIO to NIO —— NIO source code interpretation 2
查看>>
[译] 为什么你的应用需要对各种尺寸屏幕做适配优化?
查看>>
React学习手册-React运行机制笔记(二)
查看>>