很多時候我們在進行進一步研究時需要轉儲(dump)Oracle的數據塊
以研究其內容
Oracle提供了很好的方式
我們通過以下例子簡單說明一下:
[oracle@jumper udump]$ sqlplus
/ as sysdba
SQL*Plus: Release
Production on Tue Aug
:
:
Copyright (c)
Oracle Corporation
All rights reserved
Connected to:
Oracle
i Enterprise Edition Release
Production
With the Partitioning
OLAP and Oracle Data Mining options
JServer Release
Production
SQL> select rowid
deptno
dname
loc from scott
dept;
ROWID DEPTNO DNAME LOC
AAADZ
AABAAAGK
AAA
ACCOUNTING NEW YORK
AAADZ
AABAAAGK
AAB
RESEARCH DALLAS
AAADZ
AABAAAGK
AAC
SALES CHICAGO
AAADZ
AABAAAGK
AAD
OPERATIONS BOSTON
SQL> select file_id
block_id
blocks from dba_extents where segment_name=
DEPT
;
FILE_ID BLOCK_ID BLOCKS
SQL> alter system dump datafile
block min
block max
;
System altered
SQL> !
[oracle@jumper udump]$ ls
l
total
rw
r
oracle dba
Aug
:
hsjf_ora_
trc
[oracle@jumper udump]$ more hsjf_ora_
trc
/opt/oracle/admin/hsjf/udump/hsjf_ora_
trc
Oracle
i Enterprise Edition Release
Production
With the Partitioning
OLAP and Oracle Data Mining options
JServer Release
Production
ORACLE_HOME = /opt/oracle/product/
System name: Linux
Node name:
cn
Release:
Version: #
Wed Sep
:
:
EDT
Machine: i
Instance name: hsjf
Redo thread mounted by this instance:
Oracle process number:
Unix process pid:
image: orac
cn (TNS V
V
)
***
:
:
*** SESSION ID:(
)
:
:
Start dump data blocks tsn:
file#:
minblk
maxblk
buffer tsn:
rdba:
x
b
(
/
)
scn:
x
c
d seq:
x
flg:
x
tail:
xc
d
frmt:
x
chkval:
x
e
type:
x
=DATA SEGMENT HEADER
UNLIMITED
Extent Control Header
Extent Header:: spare
:
spare
:
#extents:
#blocks:
last map
x
#maps:
offset:
Highwater::
x
bb ext#:
blk#:
ext size:
#blocks in seg
hdr
s freelists:
#blocks below:
mapblk
x
offset:
Unlocked
Map Header:: next
x
#extents:
obj#:
flag:
x
Extent Map
x
ba length:
nfl =
nfb =
typ =
nxf =
ccnt =
SEG LST:: flg: USED lhd:
x
ba ltl:
x
ba
buffer tsn:
rdba:
x
ba (
/
)
scn:
x
b seq:
x
flg:
x
tail:
x
b
frmt:
x
chkval:
xa
e
type:
x
=trans data
Block header dump:
x
ba
Object id on Block? Y
seg/obj:
x
b csc:
x
a itc:
flg: O typ:
DATA
fsl:
fnx:
x
ver:
x
Itl Xid Uba Flag Lck Scn/Fsc
x
x
a
f
x
b
C
scn
x
c
e
x
x
x
fsc
x
data_block_dump
data header at
xadb
c
===============
tsiz:
x
fa
hsiz:
x
a
pbl:
x
adb
c
bdba:
x
ba
flag=
ntab=
nrow=
frre=
fsbo=
x
a
fseo=
x
f
avsp=
x
f
a
tosp=
x
f
a
xe:pti[
] nrow=
offs=
x
:pri[
] offs=
x
f
x
:pri[
] offs=
x
f
x
:pri[
] offs=
x
f
c
x
:pri[
] offs=
x
f
block_row_dump:
tab
row
@
x
f
tl:
fb:
H
FL
lb:
x
cc:
col
: [
] c
b
col
: [
]
f
e
e
col
: [
]
e
f
b
tab
row
@
x
f
tl:
fb:
H
FL
lb:
x
cc:
col
: [
] c
col
: [
]
col
: [
]
c
c
tab
row
@
x
f
c
tl:
fb:
H
FL
lb:
x
cc:
col
: [
] c
f
col
: [
]
c
col
: [
]
f
tab
row
@
x
f
tl:
fb:
H
FL
lb:
x
cc:
col
: [
] c
col
: [
]
f
f
e
col
: [
]
f
f
e
end_of_block_dump
End dump data blocks tsn:
file#:
minblk
maxblk
很多人經常提出的一個問題是
rdba是如何轉換的?
rdba:
x
ba (
/
)
我們通過這個例子介紹一下
rdba從Oracle
>Oracle
>Oracle
發生了三次改變:
在Oracle
中
rdba由
位
進制數表示
也就是說數據塊最多只能有
^
=
個數據文件(去掉全
和全
實際上最多只能代表
個文件)
在Oracle
中
rdba中的文件號增加為
位
為了向後兼容
從Block號的高位拿出
位作為文件號的高位
這樣從
>
的Rowid無需發生變化
在Oracle
中
文件號仍然用
位表示
只是不再需要置換
為了向後兼容
同時引入了相對文件號(rfile#)
所以從Oracle
到Oracle
Rowid仍然無需發生變化
舉例說明如下:
在Oracle
中:
比如: file
block
位block號==
vv vvvvvvvv vvvvvvvv vvvvvvvv
^^^^^^
位文件號==
在Oracle
中:
比如:File
block
F C C
D E
C
\_____/\___/\_______________________/
| | |
| | Block =
xDE
C =
\_____________
| V V
=
xFF =
注意這裡高位和低位要置換才能得出正確的file#
在Oracle
中:
比如:File
block
F C C
D E
C
\_____/\___/\_______________________/
| | |
| | Block =
xDE
C =
\_____________
| V V
=
F
=
這就是相對文件號
對於我們測試中的例子:
rdba:
x
ba (
/
)
也就是:
前
位為rfile#:
=
後
位為Block#:
=
From:http://tw.wingwit.com/Article/program/Oracle/201311/18068.html