從ASM磁碟中還原出檔案(一)

westzq1984發表於2010-08-20
只是研究用,參考了dbsnake大師的帖子

在KFBTYP_FILEDIR Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE還完好的情況下,找到FILE和AU的對映關係,從ASM磁碟中恢復資料檔案。如果KFBTYP_FILEDIR也沒了,也可以一個塊一個塊的分析ASM磁碟,也能將資料檔案恢復出來。

Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE1.   找到File Directory

for((i=1;i<=4;i++))

do

  for ((j=0;j<=100;j++))

  do

    COUNT=`kfed p=find aun=$j dev=/dev/oracleasm/disks/VOL$i|grep "type 4"|wc -l`

    echo "[DISK]VOL"$i"[AUN]"$j"  "$COUNT

  done

done

 

[DISK]VOL1[AUN]0  0

[DISK]VOL1[AUN]1  0

[DISK]VOL1[AUN]2  255

[DISK]VOL1[AUN]3  0

[DISK]VOL1[AUN]4  0

[DISK]VOL1[AUN]5  0

[DISK]VOL1[AUN]6  0

[DISK]VOL1[AUN]7  0

[DISK]VOL1[AUN]8  0

[DISK]VOL1[AUN]9  0

[DISK]VOL1[AUN]10  0

[DISK]VOL1[AUN]11  0

[DISK]VOL1[AUN]12  0

[DISK]VOL1[AUN]13  0

[DISK]VOL1[AUN]14  0

[DISK]VOL1[AUN]15  0

[DISK]VOL1[AUN]16  0

[DISK]VOL1[AUN]17  0

[DISK]VOL1[AUN]18  0

[DISK]VOL1[AUN]19  0

[DISK]VOL1[AUN]20  0

[DISK]VOL1[AUN]21  0

[DISK]VOL1[AUN]22  256

 

2.   第一個AUAUN最小的)才是後設資料AU,是記錄DISKGROUP中還有那些FILEDIR AUAU

相當於ASSM3級點陣圖

 

DISK[0]AU[2]BLOCK[0]KFBTYP_LISTHEAD

DISK[0]AU[2]BLOCK[0]KFBTYP_FILEDIR

 

[oracle10@zhangqiaoc ~]$ kfed p=read aun=2 blkn=1 dev=/dev/oracleasm/disks/VOL1 |more

kfbh.endian:                          1 ; 0x000: 0x01

kfbh.hard:                          130 ; 0x001: 0x82

kfbh.type:                            4 ; 0x002: KFBTYP_FILEDIR

kfbh.datfmt:                          1 ; 0x003: 0x01

kfbh.block.blk:                       1 ; 0x004: T=0 NUMB=0x1

kfbh.block.obj:                       1 ; 0x008: TYPE=0x0 NUMB=0x1

kfbh.check:                  4227228654 ; 0x00c: 0xfbf663ee

kfbh.fcn.base:                      262 ; 0x010: 0x00000106

kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000

kfbh.spare1:                          0 ; 0x018: 0x00000000

kfbh.spare2:                          0 ; 0x01c: 0x00000000

kfffdb.node.incarn:                   1 ; 0x000: A=1 NUMM=0x0

kfffdb.node.frlist.number:   4294967295 ; 0x004: 0xffffffff

kfffdb.node.frlist.incarn:            0 ; 0x008: A=0 NUMM=0x0

kfffdb.hibytes:                       0 ; 0x00c: 0x00000000

kfffdb.lobytes:                 2097152 ; 0x010: 0x00200000

kfffdb.xtntcnt:                       2 ; 0x014: 0x00000002

kfffdb.xtnteof:                       2 ; 0x018: 0x00000002

kfffdb.blkSize:                    4096 ; 0x01c: 0x00001000

kfffdb.flags:                         1 ; 0x020: O=1 S=0 S=0 D=0 C=0 I=0 R=0 A=0

kfffdb.fileType:                     15 ; 0x021: 0x0f

kfffdb.dXrs:                         17 ; 0x022: SCHE=0x1 NUMB=0x1

kfffdb.iXrs:                         17 ; 0x023: SCHE=0x1 NUMB=0x1

kfffdb.dXsiz[0]:             4294967295 ; 0x024: 0xffffffff

kfffdb.dXsiz[1]:                      0 ; 0x028: 0x00000000

kfffdb.dXsiz[2]:                      0 ; 0x02c: 0x00000000

kfffdb.iXsiz[0]:             4294967295 ; 0x030: 0xffffffff

kfffdb.iXsiz[1]:                      0 ; 0x034: 0x00000000

kfffdb.iXsiz[2]:                      0 ; 0x038: 0x00000000

kfffdb.xtntblk:                       2 ; 0x03c: 0x0002

kfffdb.break:                        60 ; 0x03e: 0x003c

kfffdb.priZn:                         0 ; 0x040: 0x00

kfffdb.secZn:                         0 ; 0x041: 0x00

kfffdb.ub2spare:                      0 ; 0x042: 0x0000

kfffdb.alias[0]:             4294967295 ; 0x044: 0xffffffff

kfffdb.alias[1]:             4294967295 ; 0x048: 0xffffffff

kfffdb.strpwdth:                      0 ; 0x04c: 0x00

kfffdb.strpsz:                        0 ; 0x04d: 0x00

kfffdb.usmsz:                         0 ; 0x04e: 0x0000

kfffdb.crets.hi:               32940650 ; 0x050: HOUR=0xa DAYS=0x13 MNTH=0x8 YEAR=0x7da

kfffdb.crets.lo:             3670807552 ; 0x054: USEC=0x0 MSEC=0x305 SECS=0x2c MINS=0x36

kfffdb.modts.hi:               32940650 ; 0x058: HOUR=0xa DAYS=0x13 MNTH=0x8 YEAR=0x7da

kfffdb.modts.lo:             3670807552 ; 0x05c: USEC=0x0 MSEC=0x305 SECS=0x2c MINS=0x36

kfffdb.spare[0]:                      0 ; 0x060: 0x00000000

kfffdb.spare[1]:                      0 ; 0x064: 0x00000000

kfffdb.spare[2]:                      0 ; 0x068: 0x00000000

kfffdb.spare[3]:                      0 ; 0x06c: 0x00000000

kfffdb.spare[4]:                      0 ; 0x070: 0x00000000

kfffdb.spare[5]:                      0 ; 0x074: 0x00000000

kfffdb.spare[6]:                      0 ; 0x078: 0x00000000

kfffdb.spare[7]:                      0 ; 0x07c: 0x00000000

kfffdb.spare[8]:                      0 ; 0x080: 0x00000000

kfffdb.spare[9]:                      0 ; 0x084: 0x00000000

kfffdb.spare[10]:                     0 ; 0x088: 0x00000000

kfffdb.spare[11]:                     0 ; 0x08c: 0x00000000

kfffdb.spare[12]:                     0 ; 0x090: 0x00000000

kfffdb.spare[13]:                     0 ; 0x094: 0x00000000

kfffdb.spare[14]:                     0 ; 0x098: 0x00000000

kfffdb.spare[15]:                     0 ; 0x09c: 0x00000000

kfffdb.usm:                             ; 0x0a0: length=0

kfffde[0].xptr.au:                    2 ; 0x4a0: 0x00000002

kfffde[0].xptr.disk:                  0 ; 0x4a4: 0x0000

kfffde[0].xptr.flags:                 0 ; 0x4a6: L=0 E=0 D=0 C=0 S=0

kfffde[0].xptr.chk:                  40 ; 0x4a7: 0x28

kfffde[1].xptr.au:                   22 ; 0x4a8: 0x00000016

kfffde[1].xptr.disk:                  0 ; 0x4ac: 0x0000

kfffde[1].xptr.flags:                 0 ; 0x4ae: L=0 E=0 D=0 C=0 S=0

kfffde[1].xptr.chk:                  60 ; 0x4af: 0x3c

kfffde[2].xptr.au:           4294967295 ; 0x4b0: 0xffffffff

kfffde[2].xptr.disk:              65535 ; 0x4b4: 0xffff

kfffde[2].xptr.flags:                 0 ; 0x4b6: L=0 E=0 D=0 C=0 S=0

kfffde[2].xptr.chk:                  42 ; 0x4b7: 0x2a

 

第一個,kfffde[0]指向的自身,DISK[0]AU[2]

第二個,kfffde[1]指向儲存著其他檔案的FILEDIRDISK[0]AU[22]

第三個,kfffde[2],已經超出的範圍

 

3.   由於現在檔案少,所以只有一個AU記錄著檔案的分佈

在這個AU中,每個塊代表一個檔案,既DISK[0]AU[22]BLK[0]表示一個檔案,DISK[0]AU[22]BLK[1]表示一個檔案[oracle10@zhangqiaoc ~]$ kfed p=read aun=22 blkn=4 dev=/dev/oracleasm/disks/VOL1 |more

kfbh.endian:                          1 ; 0x000: 0x01

kfbh.hard:                          130 ; 0x001: 0x82

kfbh.type:                            4 ; 0x002: KFBTYP_FILEDIR

kfbh.datfmt:                          1 ; 0x003: 0x01

kfbh.block.blk:                     260 ; 0x004: T=0 NUMB=0x104          --internal file id

kfbh.block.obj:                       1 ; 0x008: TYPE=0x0 NUMB=0x1

kfbh.check:                  1448949561 ; 0x00c: 0x565d3739

kfbh.fcn.base:                     3092 ; 0x010: 0x00000c14

kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000

kfbh.spare1:                          0 ; 0x018: 0x00000000

kfbh.spare2:                          0 ; 0x01c: 0x00000000

kfffdb.node.incarn:           727441081 ; 0x000: A=1 NUMM=0x15adef5c

kfffdb.node.frlist.number:   4294967295 ; 0x004: 0xffffffff

kfffdb.node.frlist.incarn:            0 ; 0x008: A=0 NUMM=0x0

kfffdb.hibytes:                       0 ; 0x00c: 0x00000000

kfffdb.lobytes:               314580992 ; 0x010: 0x12c02000     --檔案大小

kfffdb.xtntcnt:                     301 ; 0x014: 0x0000012d     --檔案一共有多少個AU

kfffdb.xtnteof:                     301 ; 0x018: 0x0000012d

kfffdb.blkSize:                    8192 ; 0x01c: 0x00002000

kfffdb.flags:                        17 ; 0x020: O=1 S=0 S=0 D=0 C=1 I=0 R=0 A=0

kfffdb.fileType:                      2 ; 0x021: 0x02

kfffdb.dXrs:                         17 ; 0x022: SCHE=0x1 NUMB=0x1

kfffdb.iXrs:                         17 ; 0x023: SCHE=0x1 NUMB=0x1

kfffdb.dXsiz[0]:             4294967295 ; 0x024: 0xffffffff

kfffdb.dXsiz[1]:                      0 ; 0x028: 0x00000000

kfffdb.dXsiz[2]:                      0 ; 0x02c: 0x00000000

kfffdb.iXsiz[0]:             4294967295 ; 0x030: 0xffffffff

kfffdb.iXsiz[1]:                      0 ; 0x034: 0x00000000

kfffdb.iXsiz[2]:                      0 ; 0x038: 0x00000000

kfffdb.xtntblk:                      61 ; 0x03c: 0x003d         --本塊中記錄著多少個AU

kfffdb.break:                        60 ; 0x03e: 0x003c         --跳轉到下一級記錄中 的記錄號

kfffdb.priZn:                         0 ; 0x040: 0x00

kfffdb.secZn:                         0 ; 0x041: 0x00

kfffdb.ub2spare:                      0 ; 0x042: 0x0000

kfffdb.alias[0]:                    212 ; 0x044: 0x000000d4

kfffdb.alias[1]:             4294967295 ; 0x048: 0xffffffff

kfffdb.strpwdth:                      1 ; 0x04c: 0x01

kfffdb.strpsz:                       20 ; 0x04d: 0x14

kfffdb.usmsz:                         0 ; 0x04e: 0x0000

kfffdb.crets.hi:               32940650 ; 0x050: HOUR=0xa DAYS=0x13 MNTH=0x8 YEAR=0x7da

kfffdb.crets.lo:             3893391360 ; 0x054: USEC=0x0 MSEC=0x1c SECS=0x1 MINS=0x3a

kfffdb.modts.hi:               32940651 ; 0x058: HOUR=0xb DAYS=0x13 MNTH=0x8 YEAR=0x7da

kfffdb.modts.lo:                      0 ; 0x05c: USEC=0x0 MSEC=0x0 SECS=0x0 MINS=0x0

kfffdb.spare[0]:                      0 ; 0x060: 0x00000000

kfffdb.spare[1]:                      0 ; 0x064: 0x00000000

kfffdb.spare[2]:                      0 ; 0x068: 0x00000000

kfffdb.spare[3]:                      0 ; 0x06c: 0x00000000

kfffdb.spare[4]:                      0 ; 0x070: 0x00000000

kfffdb.spare[5]:                      0 ; 0x074: 0x00000000

kfffdb.spare[6]:                      0 ; 0x078: 0x00000000

kfffdb.spare[7]:                      0 ; 0x07c: 0x00000000

kfffdb.spare[8]:                      0 ; 0x080: 0x00000000

kfffdb.spare[9]:                      0 ; 0x084: 0x00000000

kfffdb.spare[10]:                     0 ; 0x088: 0x00000000

kfffdb.spare[11]:                     0 ; 0x08c: 0x00000000

kfffdb.spare[12]:                     0 ; 0x090: 0x00000000

kfffdb.spare[13]:                     0 ; 0x094: 0x00000000

kfffdb.spare[14]:                     0 ; 0x098: 0x00000000

kfffdb.spare[15]:                     0 ; 0x09c: 0x00000000

kfffdb.usm:                             ; 0x0a0: length=0

kfffde[0].xptr.au:                   74 ; 0x4a0: 0x0000004a    --這是是資料AU

kfffde[0].xptr.disk:                  1 ; 0x4a4: 0x0001

kfffde[0].xptr.flags:                 0 ; 0x4a6: L=0 E=0 D=0 C=0 S=0

kfffde[0].xptr.chk:                  97 ; 0x4a7: 0x61

kfffde[1].xptr.au:                   83 ; 0x4a8: 0x00000053

kfffde[1].xptr.disk:                  0 ; 0x4ac: 0x0000

kfffde[1].xptr.flags:                 0 ; 0x4ae: L=0 E=0 D=0 C=0 S=0

kfffde[1].xptr.chk:                 121 ; 0x4af: 0x79

…………………….

kfffde[58].xptr.au:                 102 ; 0x670: 0x00000066

kfffde[58].xptr.disk:                 0 ; 0x674: 0x0000

kfffde[58].xptr.flags:                0 ; 0x676: L=0 E=0 D=0 C=0 S=0

kfffde[58].xptr.chk:                 76 ; 0x677: 0x4c

kfffde[59].xptr.au:                  93 ; 0x678: 0x0000005d

kfffde[59].xptr.disk:                 2 ; 0x67c: 0x0002

kfffde[59].xptr.flags:                0 ; 0x67e: L=0 E=0 D=0 C=0 S=0

kfffde[59].xptr.chk:                117 ; 0x67f: 0x75

kfffde[60].xptr.au:                  94 ; 0x680: 0x0000005e    -- kfffdb.break指定的跳轉出去的,也就是說這個AU不是資料AU,而是一個記錄該FILE有哪些AUAU

kfffde[60].xptr.disk:                 2 ; 0x684: 0x0002

kfffde[60].xptr.flags:                0 ; 0x686: L=0 E=0 D=0 C=0 S=0

kfffde[60].xptr.chk:                118 ; 0x687: 0x76

kfffde[61].xptr.au:          4294967295 ; 0x688: 0xffffffff

kfffde[61].xptr.disk:             65535 ; 0x68c: 0xffff

kfffde[61].xptr.flags:                0 ; 0x68e: L=0 E=0 D=0 C=0 S=0

kfffde[61].xptr.chk:                 42 ; 0x68f: 0x2a

 

 

4.   檢視這個塊

[oracle10@zhangqiaoc ~]$ kfed p=read aun=94 blkn=0 dev=/dev/oracleasm/disks/VOL3 |more

kfbh.endian:                          1 ; 0x000: 0x01

kfbh.hard:                          130 ; 0x001: 0x82

kfbh.type:                           12 ; 0x002: KFBTYP_INDIRECT

kfbh.datfmt:                          1 ; 0x003: 0x01

kfbh.block.blk:              2147483648 ; 0x004: T=1 NUMB=0x0

kfbh.block.obj:                     260 ; 0x008: TYPE=0x0 NUMB=0x104

kfbh.check:                  4058154623 ; 0x00c: 0xf1e2867f

kfbh.fcn.base:                     1336 ; 0x010: 0x00000538

kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000

kfbh.spare1:                          0 ; 0x018: 0x00000000

kfbh.spare2:                          0 ; 0x01c: 0x00000000

kffixb.dxsn:                         60 ; 0x000: 0x0000003c

kffixb.xtntblk:                     241 ; 0x004: 0x00f1            --本塊中記錄著多少AU

kffixb.dXrs:                         17 ; 0x006: SCHE=0x1 NUMB=0x1

kffixb.ub1spare:                      0 ; 0x007: 0x00

kffixb.ub4spare:                      0 ; 0x008: 0x00000000

kffixe[0].xptr.au:                   94 ; 0x00c: 0x0000005e

kffixe[0].xptr.disk:                  1 ; 0x010: 0x0001

kffixe[0].xptr.flags:                 0 ; 0x012: L=0 E=0 D=0 C=0 S=0

kffixe[0].xptr.chk:                 117 ; 0x013: 0x75

kffixe[1].xptr.au:                  103 ; 0x014: 0x00000067

kffixe[1].xptr.disk:                  0 ; 0x018: 0x0000

kffixe[1].xptr.flags:                 0 ; 0x01a: L=0 E=0 D=0 C=0 S=0

kffixe[1].xptr.chk:                  77 ; 0x01b: 0x4d

kffixe[2].xptr.au:                   95 ; 0x01c: 0x0000005f

kffixe[2].xptr.disk:                  2 ; 0x020: 0x0002

kffixe[2].xptr.flags:                 0 ; 0x022: L=0 E=0 D=0 C=0 S=0

kffixe[2].xptr.chk:                 119 ; 0x023: 0x77

kffixe[3].xptr.au:                   95 ; 0x024: 0x0000005f

kffixe[3].xptr.disk:                  1 ; 0x028: 0x0001

kffixe[3].xptr.flags:                 0 ; 0x02a: L=0 E=0 D=0 C=0 S=0

kffixe[3].xptr.chk:                 116 ; 0x02b: 0x74

kffixe[4].xptr.au:                  104 ; 0x02c: 0x00000068

kffixe[4].xptr.disk:                  0 ; 0x030: 0x0000

kffixe[4].xptr.flags:                 0 ; 0x032: L=0 E=0 D=0 C=0 S=0

kffixe[4].xptr.chk:                  66 ; 0x033: 0x42

 

這樣就能找到這個檔案所有的AU

那還會不會有下一級記錄塊分配的AU了,理論上應該沒有了

因為FILEDIR中1個塊,記錄著300個AU分配
每個AU 1MB,每個塊4096byte,一個AU就256個塊
一個塊記錄著480個資料AU
一共 300*256*480/1024/1024 = 35.15625 TB

OTN文件中描述 External redundancy 下最大檔案為 35 TB

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8242091/viewspace-671472/,如需轉載,請註明出處,否則將追究法律責任。

相關文章