有时候难免涉及到要修改数据字典,这时候如何找到你要修改的数据字典记录的物理存储位置就很关键了,我这里给大家做一个例子。
具体的解释我就不详细说了,因为有完善的备份的话这些旁门左道都是不需要的!
SQL> select ts#,name,owner#,online$ from ts$ where name='TESTSCN';
TS# NAME OWNER# ONLINE$
---------- ------------------------------ ---------- ----------
90 TESTSCN 0 1
现在我要把表空间TESTSCN的online$由1改为2,朋友们知道我这么改的目的是什么吗?不明白我为什么要这么改的朋友可以去看sql.bsq。
首先我找到C_TS#的段头位置,我这个库里C_TS#的段头位置在FILE 1 BLOCK 57。
Dump上述段头,内容如下:
Start dump data blocks tsn: 0 file#: 1 minblk 57 maxblk 57
buffer tsn: 0 rdba: 0x00400039 (1/57)
scn: 0x0008.aa4ab54b seq: 0x01 flg: 0x04 tail: 0xb54b1001
frmt: 0x02 chkval: 0xf4ef type: 0x10=DATA SEGMENT HEADER - UNLIMITED
Extent Control Header
-----------------------------------------------------------------
Extent Header:: spare1: 0 spare2: 0 #extents: 12 #blocks: 95
last map 0x00000000 #maps: 0 offset: 4128
Highwater:: 0x
#blocks in seg. hdr's freelists: 3
#blocks below: 92
mapblk 0x00000000 offset: 11
Unlocked
Map Header:: next 0x00000000 #extents: 12 obj#: 6 flag: 0x40000000
Extent Map
-----------------------------------------------------------------
0x
0x004010e1 length: 8
0x0040b
0x0040b
0x0040b7d1 length: 8
0x0040b7d9 length: 8
0x0040b7e1 length: 8
0x0040b7e9 length: 8
0x0040dd41 length: 8
0x0040dd51 length: 8
0x0040dd59 length: 8
0x
nfl = 1, nfb = 1 typ = 1 nxf = 28 ccnt = 67
SEG LST:: flg: USED lhd: 0x
SQL> select max(ts#) from ts$ where name='TESTSCN';
MAX(TS#)
----------
90
SQL> select dump(1,16) from dual;
DUMP(1,16)
-----------------
Typ=2 Len=2: c1,2
SQL> select dump(90,16) from dual;
DUMP(90,16)
------------------
Typ=2 Len=2: c1,5b
SQL> select dump('TESTSCN',16) from dual;
DUMP('TESTSCN',16)
----------------------------------
Typ=96 Len=7: 54,45,53,54,53,43,4e
从上述查询结果里我们可以知道表空间TESTSCN对应于ts$中的记录必然在起始block为0x0040f579的这个extent中。
Dump上述extent(语法为alter system dump datafile 1 block min 62841 block max 62848),发现dump的内容中有如下内容:
buffer tsn: 0 rdba: 0x
scn: 0x0008.bb
frmt: 0x02 chkval: 0x2147 type: 0x06=trans data
Block header dump: 0x
Object id on Block? Y
seg/obj: 0x6 csc: 0x08.bb
fsl: 0 fnx: 0x
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x
0x02 0x0001.021.000107ec 0x
data_block_dump,data header at 0x
===============
tsiz: 0x1fa0
hsiz: 0x1e
pbl: 0x
bdba: 0x
76543210
flag=--------
ntab=3
nrow=2
frre=-1
fsbo=0x1e
fseo=0x16ae
avsp=0x
tosp=0x
0xe:pti[0] nrow=1 offs=0
0x12:pti[1] nrow=0 offs=1
0x16:pti[2] nrow=1 offs=1
0x
0x
block_row_dump:
tab 0, row 0, @0x
tl: 22 fb: K-H-FL-- lb: 0x0 cc: 1
curc: 1 comc: 1 pk: 0x
col 0: [ 2] c1 5b
tab 2, row 0, @0x16ae
tl: 92 fb: -CH-
col 0: [ 7] 54 45 53 54 53 43 4e
col 1: [ 1] 80
col 2: [ 2] c1 02
col 3: [ 1] 80
col 4: [ 1] 80
col 5: [ 1] 80
col 6: [ 3] c2 52 5d
col 7: [ 2] c1 05
col 8: [ 1] 80
col 9: [ 1] 80
col 10: [ 2] c1 02
col 11: [ 6] c5 16 30 31 25 2e
col 12: [ 3] c2 02 1d
col 13: [ 3] c2 02 1d
col 14: [ 3] c2 02 1d
col 15: [ 1] 80
col 16: [ 2] c1 02
col 17: [ 1] 80
col 18: [ 3] c2 02 1d
col 19: [ 1] 80
col 20: [ 2] c1 02
col 21: [ 2] c1 23
col 22: [ 2] c1 09
col 23: [ 6] c5 20 2b
col 24: *NULL*
col 25: *NULL*
col 26: *NULL*
col 27: [ 1] 80
col 28: [ 1] 80
end_of_block_dump
很明显从上述dump结果中我们可以知道表空间TESTSCN在ts$中的记录的行头的offset是0x16ae。
我们来验证一下:
BBED> set file 1
FILE# 1
BBED> set block 62844
BLOCK# 62844
BBED> set offset 0x16ae
OFFSET 5806
BBED> dump
File: /dras11/oradata/astca/system01.dbf (1)
Block: 62844 Offsets: 5806 to 6317 Dba:0x
------------------------------------------------------------------------
c
ffff0144 01480144 ff024341 04313335
4e
07544553 5453434e
5453434e
5453434e
c52b
c1050180
<32 bytes per line>
上述dump内容中我用红颜色标注的部分就是表空间TESTSCN在ts$中对应的记录的online$的实际物理位置。
Leave a comment