如何找到你要修改的数据字典的物理存储位置

| No Comments

有时候难免涉及到要修改数据字典,这时候如何找到你要修改的数据字典记录的物理存储位置就很关键了,我这里给大家做一个例子。

 

具体的解释我就不详细说了,因为有完善的备份的话这些旁门左道都是不需要的!

 

SQL> select ts#,name,owner#,online$ from ts$ where name='TESTSCN';

 

       TS# NAME                               OWNER#    ONLINE$

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

        90 TESTSCN                                 0          1

 

现在我要把表空间TESTSCNonline$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::  0x0040f57e  ext#: 11     blk#: 5      ext size: 8    

  #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

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

   0x0040003a  length: 7    

   0x004010e1  length: 8    

   0x0040b7c1  length: 8    

   0x0040b7c9  length: 8    

   0x0040b7d1  length: 8    

   0x0040b7d9  length: 8    

   0x0040b7e1  length: 8    

   0x0040b7e9  length: 8    

   0x0040dd41  length: 8    

   0x0040dd51  length: 8    

   0x0040dd59  length: 8    

   0x0040f579  length: 8    

 

  nfl = 1, nfb = 1 typ = 1 nxf = 28 ccnt = 67

  SEG LST:: flg: USED   lhd: 0x0040f57c ltl: 0x0040f57d

 

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$中的记录必然在起始block0x0040f579的这个extent中。

 

Dump上述extent(语法为alter system dump datafile 1 block min 62841 block max 62848),发现dump的内容中有如下内容:

buffer tsn: 0 rdba: 0x0040f57c (1/62844)

scn: 0x0008.bb52f812 seq: 0x01 flg: 0x06 tail: 0xf8120601

frmt: 0x02 chkval: 0x2147 type: 0x06=trans data

Block header dump:  0x0040f57c

 Object id on Block? Y

 seg/obj: 0x6  csc: 0x08.bb52f80d  itc: 2  flg: O  typ: 1 - DATA

     fsl: 0  fnx: 0x40f57d ver: 0x01

 

 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc

0x01   0x0006.00f.000162b4  0x13000053.3fb8.22  C---    0  scn 0x0008.aa4ab54d

0x02   0x0001.021.000107ec  0x12c00012.38c1.20  --U-    1  fsc 0x000c.bb52f812

 

data_block_dump,data header at 0x11027405c

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

tsiz: 0x1fa0

hsiz: 0x1e

pbl: 0x11027405c

bdba: 0x0040f57c

     76543210

flag=--------

ntab=3

nrow=2

frre=-1

fsbo=0x1e

fseo=0x16ae

avsp=0x1f04

tosp=0x1f10

0xe:pti[0] nrow=1    offs=0

0x12:pti[1]      nrow=0    offs=1

0x16:pti[2]      nrow=1    offs=1

0x1a:pri[0]      offs=0x1f8a

0x1c:pri[1]      offs=0x16ae

block_row_dump:

tab 0, row 0, @0x1f8a

tl: 22 fb: K-H-FL-- lb: 0x0  cc: 1

curc: 1 comc: 1 pk: 0x0040f57c.0 nk: 0x0040f57c.0

col  0: [ 2]  c1 5b

tab 2, row 0, @0x16ae

tl: 92 fb: -CH-FL-- lb: 0x2  cc: 29 cki: 0

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 4c 2e 34

col 24: *NULL*

col 25: *NULL*

col 26: *NULL*

col 27: [ 1]  80

col 28: [ 1]  80

end_of_block_dump

很明显从上述dump结果中我们可以知道表空间TESTSCNts$中的记录的行头的offset0x16ae

 

我们来验证一下:

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

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

 c415070a 0e08c715 070a0e0a 341dffff ff05c415 070a0eff ffffffff 03434e59

 ffff0144 01480144 ff024341 04313335 3504c315 070a014e 0144ffff ffffff01

 4e018004 c315070a 0159ffff 014eff04 c315070b ffffffff ffffffff 6c021d00

 07544553 5453434e 018002c1 02018001 80018003 c2525d02 c1050180 018002c1

 0206c516 3031252e 03c2021d 03c2021d 03c2021d 018002c1 02018003 c2021d01

 8002c102 02c12302 c10906c5 202b4c2e 34ffffff 01800180 6c021d00 07544553

 5453434e 018002c1 02018003 c2021a03 c20f1a03 c2525d02 c1050180 018002c1

 0206c516 3031252e 03c2021d 03c2021d 03c2021d 018002c1 02018003 c2021d01

 8002c102 02c12302 c10906c5 202b4c2e 34ffffff 01800180 6c001d00 07544553

 5453434e 018002c1 03018003 c2021a03 c20f1a03 c2525d02 c10504c3 07382406

 c52b5f61 496002c1 0206c516 3031252e 03c2021d 03c2021d 03c2021d 018002c1

 02018003 c2021d01 8002c102 02c12302 c10906c5 202b4c2e 34ffffff 01800180

 6c001d00 07544553 5453434e 018002c1 03018003 c2021a03 c20f1a03 c2525d02

 c1050180 018002c1 0206c516 3031252e 03c2021d 03c2021d 03c2021d 018002c1

 02018003 c2021d01 8002c102 02c12302 c10906c5 202b4c2e 34ffffff 01800180

 6c021d00 07544553 5453434e 018002c1 03018003 c2021a03 c20f1a03 c2525d02

 

 <32 bytes per line>

上述dump内容中我用红颜色标注的部分就是表空间TESTSCNts$中对应的记录的online$的实际物理位置。

 

剩下的该怎么改就不用我说了吧:)

Leave a comment