oracle和dba,oracle db、dba和rdba

本文详细介绍了Oracle数据库中的数据块概念,包括DataBlock (DB)、DataBlockAddress (DBA) 和 Relative Database Block Address (RDBA)。通过示例展示了如何获取和转换行的文件号、块号,以及如何利用这些信息进行数据块的dump和地址转换。内容涵盖了rowid的结构以及其在数据存储和定位中的作用。
摘要由CSDN通过智能技术生成

一、DB(Data Block)

1、dumping data blocks

SYS@ tsid > select

2dbms_rowid.rowid_relative_fno(rowid) REL_FNO,

3dbms_rowid.rowid_block_number(rowid) BLOCKNO,

4dbms_rowid.rowid_row_number(rowid) ROWNO,

5id,name

6from t

7where id=1;

REL_FNOBLOCKNOROWNOID NAME

---------- ---------- ---------- ----------

------------------------------

41501 a

SYS@ tsid > alter system dump datafile 4

block 15;

System altered.

dump文件部分:

block_row_dump:

tab 0, row 0, @0x1f90

tl: 8 fb: --H-FL-- lb: 0x1cc: 2

col0: [ 2]c1 02

col1: [ 1]61

end_of_block_dump

End dump data blocks tsn: 4 file#: 4 minblk

15 maxblk 15

2、由dump出来的值转换为表中的值

SYS@ tsid > select

utl_raw.cast_to_number(replace('c1,02',',')) value from dual;

VALUE

----------

1

SYS@ tsid > select

utl_raw.cast_to_varchar2('61') value from dual;

VALUE

------------------------------------------------------------------

a

二、DBA(Data Block

Address)

A(DBA) is the

address of an Oracle data block for access

purposes.

DBA一般指绝对数据块地址用来表示一行的物理地址,一行唯一确定一个rowid,并且在使用中一般不会改变,除非rowid之后在行的物理位置发生改变的情况下才会发生变化。在rowid中,就有一段是来表示DBA的。

1、获得一行的file number和block number

SYS@ tsid > select

2dbms_rowid.rowid_relative_fno(rowid) REL_FNO,

3dbms_rowid.rowid_block_number(rowid) BLOCKNO,

4id,name

5from t where id=2;

REL_FNOBLOCKNOID NAME

---------- ---------- ---------- --------

----------- ------------

4122b

2、将file number和block number转换成DBA

SYS@ tsid > variable dba varchar2(30)

SYS@ tsid > exec :dba

:=dbms_utility.make_data_block_address(4,12);

PL/SQL procedure successfully completed.

SYS@ tsid > print dba

DBA

--------------------------------

16777228

3、将DBA转换成file number和block number

SYS@ tsid > select

2dbms_utility.data_block_address_block(16777228) "BLOCK",

3dbms_utility.data_block_address_file(16777228) "FILE"

4from dual;

BLOCKFILE

---------- ----------

124

三、RDBA(Tablespace

relative database block address)

是相对数据块地址,是数据字典(表空间及一些对象定义)所在块的地址。

oracle 8以后,rowid的存储空间扩大到了10个字节(32bit object#+10bit rfile#+22bit block#+16bit row#)。rdba就是rowid中的rfile#+block#。

SYS@ tsid > select rowid,

2dbms_rowid.rowid_relative_fno(rowid) REL_FNO,

3dbms_rowid.rowid_block_number(rowid) BLOCKNO,

4dbms_rowid.rowid_row_number(rowid) ROWNO,

5id,name

6from t

7where id=3;

ROWIDREL_FNOBLOCKNOROWNOID NAME

------------------ ----------------------------- ---------- ---------- --------

AAADJrAAEAAAAAMAAB41213c

把这个block dump到trace:

SYS@ tsid > alter system dump datafile 4

block 12;

System altered.

查看dump内容:

=============================================================================

*** 2012-05-15 21:48:40.987

Start dump data blocks tsn: 4 file#: 4

minblk 12 maxblk 12

buffer tsn: 4 rdba:

0x0100000c (4/12)--rdba的值

scn: 0x0000.002f1254 seq: 0x01 flg: 0x06

tail: 0x12540601

frmt: 0x02 chkval: 0xe59f type: 0x06=trans

data

Hex dump of block: st=0, typ_found=1

Dump of memory from 0x07357800 to

0x07359800

7357800 0000A206 0100000C 002F1254 06010000[........T./.....]

7357810 0000E59F 00000001 0000326B

002EA961[........k2..a...]

7357820 00000000 00320002 01000009

00220002[......2.......".]

7357830 0000034D 00800A91 002800F2

00002002[M.........(.. ..]

7357840 002F1254 00000000 00000000 00000000[T./.............]

7357850 00000000 00000000 00000000

00000000[................]

7357860 00000000 00020100 0016FFFF

1F701F88[..............p.]

7357870 00001F70 1F900002 00001F88

00000000[p...............]

7357880 00000000 00000000 00000000 00000000[................]

Repeat 501 times

73597E0 00000000 00000000 00000000

0202012C[............,...]

73597F0 630104C1 0202012C 620103C1

12540601[...c,......b..T.]

Block header dump:0x0100000c

Object id on Block? Y

seg/obj: 0x326bcsc: 0x00.2ea961itc: 2flg: Etyp: 1 - DATA

brn: 0bdba: 0x1000009 ver: 0x01

opc: 0

inc: 0exflg: 0

ItlXidUbaFlagLckScn/Fsc

0x010x0002.022.0000034d0x00800a91.00f2.28--U-2fsc 0x0000.002f1254

0x020x0000.000.000000000x00000000.0000.00----0fsc 0x0000.00000000

data_block_dump,data

header at 0x7357864

===============

tsiz: 0x1f98

hsiz: 0x16

pbl: 0x07357864

bdba: 0x0100000c

76543210

flag=--------

ntab=1

nrow=2

frre=-1

fsbo=0x16

fseo=0x1f88

avsp=0x1f70

tosp=0x1f70

0xe:pti[0]nrow=2offs=0--该块中保存了2条记录。从row0到row1

0x12:pri[0]offs=0x1f90

0x14:pri[1]offs=0x1f88

block_row_dump:

tab 0, row 0, @0x1f90

tl: 8 fb: --H-FL-- lb: 0x1cc: 2

col0: [ 2]c1 03

col1: [ 1]62

tab 0, row 1, @0x1f88

tl: 8 fb: --H-FL-- lb: 0x1cc: 2

col0: [ 2]c1 04

col1: [ 1]63

end_of_block_dump

End dump data blocks tsn: 4 file#: 4 minblk

12 maxblk 12

SYS@tsid>select

dbms_utility.data_block_address_file(to_number(ltrim('0x0100000c','0x'),'xxxxxxxx'))

as file_no,

2dbms_utility.data_block_address_block(to_number(ltrim('0x0100000c','0x'),'xxxxxxxx'))

as block_no

3from dual;

FILE_NOBLOCK_NO

---------- ----------

412

这和之前在rowid里看到的一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值