oracle asm 剖析系列(5)–alias directory
本站文章除注明转载外,均为本站原创: 转载自love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客
在前面的4篇文章中,我详细剖析了不少内容,这一篇,将为大家分解asm alias元数据结构。 这章内容其实很重要,
因为如果说你需要从asm中抽取数据文件,你起码要知道数据库里面的文件名信息吧?知道了以后,你使用amdu来
进行数据文件的抽取,将事半功倍~~~。
那么asm alias元数据到底在什么地方呢?如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
SQL> select number_kffxp file#, disk_kffxp disk#, count(disk_kffxp) extents 2 from x$kffxp 3 where group_kffxp=1 4 and disk_kffxp <> 65534 5 group by number_kffxp, disk_kffxp; FILE# DISK# EXTENTS ---------- ---------- ---------- 1 0 1 1 2 1 2 1 1 3 0 11 3 1 10 3 2 10 3 3 11 4 1 1 4 3 1 5 2 1 6 0 1 ---这就是alias directory 256 0 120 256 1 122 256 2 120 ...... |
既然我们知道alias directory 信息是file 6,那么就可以使用kfed工具来进行读取了。
—首先我们定位到file directory
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
[oracle@10gasm ~]$ kfed read /dev/sdd aun=2 blkn=1 | 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: 3992348944 ; 0x00c: 0xedf66910 kfbh.fcn.base: 2990 ; 0x010: 0x00000bae 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: 65 ; 0x020: O=1 S=0 S=0 D=0 C=0 I=0 R=1 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: 32977478 ; 0x050: HOUR=0x6 DAYS=0x12 MNTH=0xc YEAR=0x7dc kfffdb.crets.lo: 2407343104 ; 0x054: USEC=0x0 MSEC=0x349 SECS=0x37 MINS=0x23 kfffdb.modts.hi: 32977478 ; 0x058: HOUR=0x6 DAYS=0x12 MNTH=0xc YEAR=0x7dc kfffdb.modts.lo: 2407343104 ; 0x05c: USEC=0x0 MSEC=0x349 SECS=0x37 MINS=0x23 kfffdb.spare[0]: 0 ; 0x060: 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: 2 ; 0x4a8: 0x00000002 kfffde[1].xptr.disk: 2 ; 0x4ac: 0x0002 kfffde[1].xptr.flags: 0 ; 0x4ae: L=0 E=0 D=0 C=0 S=0 kfffde[1].xptr.chk: 42 ; 0x4af: 0x2a |
从上面可以看到,就位于au 2中,而我们的file 6,自然也就在block 6中,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
[oracle@10gasm ~]$ kfed read /dev/sdd aun=2 blkn=6 | 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: 6 ; 0x004: T=0 NUMB=0x6 kfbh.block.obj: 1 ; 0x008: TYPE=0x0 NUMB=0x1 kfbh.check: 171534609 ; 0x00c: 0x0a396911 kfbh.fcn.base: 2995 ; 0x010: 0x00000bb3 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: 1048576 ; 0x010: 0x00100000 kfffdb.xtntcnt: 1 ; 0x014: 0x00000001 kfffdb.xtnteof: 1 ; 0x018: 0x00000001 kfffdb.blkSize: 4096 ; 0x01c: 0x00001000 kfffdb.flags: 65 ; 0x020: O=1 S=0 S=0 D=0 C=0 I=0 R=1 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: 1 ; 0x03c: 0x0001 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: 32977478 ; 0x050: HOUR=0x6 DAYS=0x12 MNTH=0xc YEAR=0x7dc kfffdb.crets.lo: 2407345152 ; 0x054: USEC=0x0 MSEC=0x34b SECS=0x37 MINS=0x23 kfffdb.modts.hi: 32977478 ; 0x058: HOUR=0x6 DAYS=0x12 MNTH=0xc YEAR=0x7dc kfffdb.modts.lo: 2407345152 ; 0x05c: USEC=0x0 MSEC=0x34b SECS=0x37 MINS=0x23 kfffdb.spare[0]: 0 ; 0x060: 0x00000000 ........... kfffdb.spare[15]: 0 ; 0x09c: 0x00000000 kfffdb.usm: ; 0x0a0: length=0 kfffde[0].xptr.au: 26 ; 0x4a0: 0x0000001a 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: 48 ; 0x4a7: 0x30 kfffde[1].xptr.au: 4294967295 ; 0x4a8: 0xffffffff kfffde[1].xptr.disk: 65535 ; 0x4ac: 0xffff kfffde[1].xptr.flags: 0 ; 0x4ae: L=0 E=0 D=0 C=0 S=0 kfffde[1].xptr.chk: 42 ; 0x4af: 0x2a |
下面继续读取au 26,得到alias_dir,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
[oracle@10gasm ~]$ kfed read /dev/sdd aun=26 blkn=1 | more kfbh.endian: 1 ; 0x000: 0x01 kfbh.hard: 130 ; 0x001: 0x82 kfbh.type: 11 ; 0x002: KFBTYP_ALIASDIR kfbh.datfmt: 1 ; 0x003: 0x01 kfbh.block.blk: 1 ; 0x004: T=0 NUMB=0x1 kfbh.block.obj: 6 ; 0x008: TYPE=0x0 NUMB=0x6 kfbh.check: 1090379337 ; 0x00c: 0x40fdde49 kfbh.fcn.base: 1995 ; 0x010: 0x000007cb kfbh.fcn.wrap: 0 ; 0x014: 0x00000000 kfbh.spare1: 0 ; 0x018: 0x00000000 kfbh.spare2: 0 ; 0x01c: 0x00000000 kffdnd.bnode.incarn: 1 ; 0x000: A=1 NUMM=0x0 kffdnd.bnode.frlist.number: 4294967295 ; 0x004: 0xffffffff kffdnd.bnode.frlist.incarn: 0 ; 0x008: A=0 NUMM=0x0 kffdnd.overfl.number: 4294967295 ; 0x00c: 0xffffffff kffdnd.overfl.incarn: 0 ; 0x010: A=0 NUMM=0x0 kffdnd.parent.number: 0 ; 0x014: 0x00000000 kffdnd.parent.incarn: 1 ; 0x018: A=1 NUMM=0x0 kffdnd.fstblk.number: 1 ; 0x01c: 0x00000001 kffdnd.fstblk.incarn: 1 ; 0x020: A=1 NUMM=0x0 kfade[0].entry.incarn: 1 ; 0x024: A=1 NUMM=0x0 kfade[0].entry.hash: 710518681 ; 0x028: 0x2a59a799 kfade[0].entry.refer.number: 2 ; 0x02c: 0x00000002 kfade[0].entry.refer.incarn: 1 ; 0x030: A=1 NUMM=0x0 kfade[0].name: DATAFILE ; 0x034: length=8 kfade[0].fnum: 4294967295 ; 0x064: 0xffffffff kfade[0].finc: 4294967295 ; 0x068: 0xffffffff kfade[0].flags: 4 ; 0x06c: U=0 S=0 S=1 U=0 F=0 kfade[0].ub1spare: 0 ; 0x06d: 0x00 kfade[0].ub2spare: 0 ; 0x06e: 0x0000 kfade[1].entry.incarn: 3 ; 0x070: A=1 NUMM=0x1 kfade[1].entry.hash: 4053320104 ; 0x074: 0xf198c1a8 kfade[1].entry.refer.number: 3 ; 0x078: 0x00000003 kfade[1].entry.refer.incarn: 3 ; 0x07c: A=1 NUMM=0x1 kfade[1].name: CONTROLFILE ; 0x080: length=11 kfade[1].fnum: 4294967295 ; 0x0b0: 0xffffffff kfade[1].finc: 4294967295 ; 0x0b4: 0xffffffff kfade[1].flags: 4 ; 0x0b8: U=0 S=0 S=1 U=0 F=0 kfade[1].ub1spare: 0 ; 0x0b9: 0x00 kfade[1].ub2spare: 0 ; 0x0ba: 0x0000 kfade[2].entry.incarn: 1 ; 0x0bc: A=1 NUMM=0x0 kfade[2].entry.hash: 2803485489 ; 0x0c0: 0xa719cb31 kfade[2].entry.refer.number: 4 ; 0x0c4: 0x00000004 kfade[2].entry.refer.incarn: 1 ; 0x0c8: A=1 NUMM=0x0 kfade[2].name: ONLINELOG ; 0x0cc: length=9 kfade[2].fnum: 4294967295 ; 0x0fc: 0xffffffff kfade[2].finc: 4294967295 ; 0x100: 0xffffffff kfade[2].flags: 4 ; 0x104: U=0 S=0 S=1 U=0 F=0 kfade[2].ub1spare: 0 ; 0x105: 0x00 kfade[2].ub2spare: 0 ; 0x106: 0x0000 kfade[3].entry.incarn: 1 ; 0x108: A=1 NUMM=0x0 kfade[3].entry.hash: 2905271101 ; 0x10c: 0xad2aeb3d kfade[3].entry.refer.number: 5 ; 0x110: 0x00000005 kfade[3].entry.refer.incarn: 1 ; 0x114: A=1 NUMM=0x0 kfade[3].name: TEMPFILE ; 0x118: length=8 kfade[3].fnum: 4294967295 ; 0x148: 0xffffffff kfade[3].finc: 4294967295 ; 0x14c: 0xffffffff kfade[3].flags: 4 ; 0x150: U=0 S=0 S=1 U=0 F=0 kfade[3].ub1spare: 0 ; 0x151: 0x00 kfade[3].ub2spare: 0 ; 0x152: 0x0000 kfade[4].entry.incarn: 1 ; 0x154: A=1 NUMM=0x0 kfade[4].entry.hash: 3261836913 ; 0x158: 0xc26bae71 kfade[4].entry.refer.number: 6 ; 0x15c: 0x00000006 kfade[4].entry.refer.incarn: 1 ; 0x160: A=1 NUMM=0x0 kfade[4].name: PARAMETERFILE ; 0x164: length=13 kfade[4].fnum: 4294967295 ; 0x194: 0xffffffff kfade[4].finc: 4294967295 ; 0x198: 0xffffffff kfade[4].flags: 4 ; 0x19c: U=0 S=0 S=1 U=0 F=0 kfade[4].ub1spare: 0 ; 0x19d: 0x00 kfade[4].ub2spare: 0 ; 0x19e: 0x0000 kfade[5].entry.incarn: 1 ; 0x1a0: A=1 NUMM=0x0 kfade[5].entry.hash: 2892671843 ; 0x1a4: 0xac6aab63 kfade[5].entry.refer.number: 4294967295 ; 0x1a8: 0xffffffff kfade[5].entry.refer.incarn: 0 ; 0x1ac: A=0 NUMM=0x0 kfade[5].name: spfiletest.ora ; 0x1b0: length=14 kfade[5].fnum: 265 ; 0x1e0: 0x00000109 kfade[5].finc: 802678613 ; 0x1e4: 0x2fd7e755 kfade[5].flags: 17 ; 0x1e8: U=1 S=0 S=0 U=0 F=1 kfade[5].ub1spare: 0 ; 0x1e9: 0x00 kfade[5].ub2spare: 0 ; 0x1ea: 0x0000 kfade[6].entry.incarn: 0 ; 0x1ec: A=0 NUMM=0x0 kfade[6].entry.hash: 0 ; 0x1f0: 0x00000000 kfade[6].entry.refer.number: 0 ; 0x1f4: 0x00000000 kfade[6].entry.refer.incarn: 0 ; 0x1f8: A=0 NUMM=0x0 ....... |
到这里我们已经定位到asm alias directory的位置了,现在开始详细的剖析alias dir的结构。从上面kfed的结构,我们可以
看到,asm alias directory 的结构主要包括如下3部分:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
1) kfbh ,头部结构,这部分内容在前面几章都描述过,不再累述。 2) kffdnd,从上面输出的信息,我们不难猜测,这部分信息其实就是用来定位和描述block在目录树中的具体位置的。 跟前面描述disk directory的kffdnd结构是一样的,所以这里也不多说。 3) kfade,从上面输出的信息,可以简单的将该结构描述为如下: kfade[0].entry.incarn: 1 ; 0x024: A=1 NUMM=0x0 kfade[0].entry.hash: 710518681 ; 0x028: 0x2a59a799 kfade[0].entry.refer.number: 2 ; 0x02c: 0x00000002 ---指向下一层的block号 kfade[0].entry.refer.incarn: 1 ; 0x030: A=1 NUMM=0x0 ---entry部分内容,表示分支号,hash值和指向下一层block的指针等信息,这部分不需要过多关注 kfade[0].name: DATAFILE ; 0x034: length=8 ---表示对应的alias元数据名称 kfade[0].fnum: 4294967295 ; 0x064: 0xffffffff ---对应文件号,这里为最大值,表示无意义 kfade[0].finc: 4294967295 ; 0x068: 0xffffffff ---文件分支号 kfade[0].flags: 4 ; 0x06c: U=0 S=0 S=1 U=0 F=0 ---标志信息 该属性有如下的值: O - File is original, not snapshot S - File is striped S - Strict allocation policy D - File is damaged C - File creation is committed I - File has empty indirect block R - File has known at-risk value A - The at-risk value itsefl kfade[0].ub1spare: 0 ; 0x06d: 0x00 --这部分信息无意义 kfade[0].ub2spare: 0 ; 0x06e: 0x0000 --这部分信息无意义 |
大家可以看到,其实alias directory的结构也很简单,我这里就用上面的例子,来找到数据库中所有的文件的具体位置:
#### Datafiles:
从entry.refer.number 信息得知,datafile的 对应下一层block号为2,那么datafile alias信息应该就在block 2中,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
[oracle@10gasm ~]$ kfed read /dev/sdd aun=26 blkn=2 | more kfbh.endian: 1 ; 0x000: 0x01 kfbh.hard: 130 ; 0x001: 0x82 kfbh.type: 11 ; 0x002: KFBTYP_ALIASDIR kfbh.datfmt: 1 ; 0x003: 0x01 kfbh.block.blk: 2 ; 0x004: T=0 NUMB=0x2 kfbh.block.obj: 6 ; 0x008: TYPE=0x0 NUMB=0x6 kfbh.check: 1191105834 ; 0x00c: 0x46fed52a kfbh.fcn.base: 2596 ; 0x010: 0x00000a24 kfbh.fcn.wrap: 0 ; 0x014: 0x00000000 kfbh.spare1: 0 ; 0x018: 0x00000000 kfbh.spare2: 0 ; 0x01c: 0x00000000 kffdnd.bnode.incarn: 1 ; 0x000: A=1 NUMM=0x0 kffdnd.bnode.frlist.number: 4294967295 ; 0x004: 0xffffffff kffdnd.bnode.frlist.incarn: 0 ; 0x008: A=0 NUMM=0x0 kffdnd.overfl.number: 4294967295 ; 0x00c: 0xffffffff kffdnd.overfl.incarn: 0 ; 0x010: A=0 NUMM=0x0 kffdnd.parent.number: 1 ; 0x014: 0x00000001 kffdnd.parent.incarn: 1 ; 0x018: A=1 NUMM=0x0 kffdnd.fstblk.number: 2 ; 0x01c: 0x00000002 kffdnd.fstblk.incarn: 1 ; 0x020: A=1 NUMM=0x0 kfade[0].entry.incarn: 1 ; 0x024: A=1 NUMM=0x0 kfade[0].entry.hash: 1251413818 ; 0x028: 0x4a970f3a kfade[0].entry.refer.number: 4294967295 ; 0x02c: 0xffffffff kfade[0].entry.refer.incarn: 0 ; 0x030: A=0 NUMM=0x0 kfade[0].name: SYSTEM ; 0x034: length=6 kfade[0].fnum: 256 ; 0x064: 0x00000100 kfade[0].finc: 802678453 ; 0x068: 0x2fd7e6b5 kfade[0].flags: 18 ; 0x06c: U=0 S=1 S=0 U=0 F=1 kfade[0].ub1spare: 0 ; 0x06d: 0x00 kfade[0].ub2spare: 0 ; 0x06e: 0x0000 kfade[1].entry.incarn: 1 ; 0x070: A=1 NUMM=0x0 kfade[1].entry.hash: 1356948434 ; 0x074: 0x50e163d2 kfade[1].entry.refer.number: 4294967295 ; 0x078: 0xffffffff kfade[1].entry.refer.incarn: 0 ; 0x07c: A=0 NUMM=0x0 kfade[1].name: SYSAUX ; 0x080: length=6 kfade[1].fnum: 257 ; 0x0b0: 0x00000101 kfade[1].finc: 802678455 ; 0x0b4: 0x2fd7e6b7 kfade[1].flags: 18 ; 0x0b8: U=0 S=1 S=0 U=0 F=1 kfade[1].ub1spare: 0 ; 0x0b9: 0x00 kfade[1].ub2spare: 0 ; 0x0ba: 0x0000 kfade[2].entry.incarn: 1 ; 0x0bc: A=1 NUMM=0x0 kfade[2].entry.hash: 495364582 ; 0x0c0: 0x1d86a9e6 kfade[2].entry.refer.number: 4294967295 ; 0x0c4: 0xffffffff kfade[2].entry.refer.incarn: 0 ; 0x0c8: A=0 NUMM=0x0 kfade[2].name: UNDOTBS1 ; 0x0cc: length=8 kfade[2].fnum: 258 ; 0x0fc: 0x00000102 kfade[2].finc: 802678457 ; 0x100: 0x2fd7e6b9 kfade[2].flags: 18 ; 0x104: U=0 S=1 S=0 U=0 F=1 kfade[2].ub1spare: 0 ; 0x105: 0x00 kfade[2].ub2spare: 0 ; 0x106: 0x0000 kfade[3].entry.incarn: 1 ; 0x108: A=1 NUMM=0x0 kfade[3].entry.hash: 178167512 ; 0x10c: 0x0a9e9ed8 kfade[3].entry.refer.number: 4294967295 ; 0x110: 0xffffffff kfade[3].entry.refer.incarn: 0 ; 0x114: A=0 NUMM=0x0 kfade[3].name: USERS ; 0x118: length=5 kfade[3].fnum: 259 ; 0x148: 0x00000103 kfade[3].finc: 802678457 ; 0x14c: 0x2fd7e6b9 kfade[3].flags: 18 ; 0x150: U=0 S=1 S=0 U=0 F=1 kfade[3].ub1spare: 0 ; 0x151: 0x00 kfade[3].ub2spare: 0 ; 0x152: 0x0000 kfade[4].entry.incarn: 1 ; 0x154: A=1 NUMM=0x0 kfade[4].entry.hash: 3869160501 ; 0x158: 0xe69eb435 kfade[4].entry.refer.number: 4294967295 ; 0x15c: 0xffffffff kfade[4].entry.refer.incarn: 0 ; 0x160: A=0 NUMM=0x0 kfade[4].name: ROGER ; 0x164: length=5 kfade[4].fnum: 266 ; 0x194: 0x0000010a kfade[4].finc: 804210969 ; 0x198: 0x2fef4919 kfade[4].flags: 18 ; 0x19c: U=0 S=1 S=0 U=0 F=1 kfade[4].ub1spare: 0 ; 0x19d: 0x00 kfade[4].ub2spare: 0 ; 0x19e: 0x0000 kfade[5].entry.incarn: 0 ; 0x1a0: A=0 NUMM=0x0 kfade[5].entry.hash: 0 ; 0x1a4: 0x00000000 kfade[5].entry.refer.number: 0 ; 0x1a8: 0x00000000 kfade[5].entry.refer.incarn: 0 ; 0x1ac: A=0 NUMM=0x0 ........ |
从上面信息,我们可以知道system 对应是file 256,sysaux 对应file 257,,,,,,,,
#### Controlfile
同理,control的alias信息应该在block 3中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
[oracle@10gasm ~]$ kfed read /dev/sdd aun=26 blkn=3 | more kfbh.endian: 1 ; 0x000: 0x01 kfbh.hard: 130 ; 0x001: 0x82 kfbh.type: 11 ; 0x002: KFBTYP_ALIASDIR kfbh.datfmt: 1 ; 0x003: 0x01 kfbh.block.blk: 3 ; 0x004: T=0 NUMB=0x3 kfbh.block.obj: 6 ; 0x008: TYPE=0x0 NUMB=0x6 kfbh.check: 363349019 ; 0x00c: 0x15a8441b kfbh.fcn.base: 1683 ; 0x010: 0x00000693 kfbh.fcn.wrap: 0 ; 0x014: 0x00000000 kfbh.spare1: 0 ; 0x018: 0x00000000 kfbh.spare2: 0 ; 0x01c: 0x00000000 kffdnd.bnode.incarn: 3 ; 0x000: A=1 NUMM=0x1 kffdnd.bnode.frlist.number: 4294967295 ; 0x004: 0xffffffff kffdnd.bnode.frlist.incarn: 0 ; 0x008: A=0 NUMM=0x0 kffdnd.overfl.number: 4294967295 ; 0x00c: 0xffffffff kffdnd.overfl.incarn: 0 ; 0x010: A=0 NUMM=0x0 kffdnd.parent.number: 1 ; 0x014: 0x00000001 kffdnd.parent.incarn: 1 ; 0x018: A=1 NUMM=0x0 kffdnd.fstblk.number: 3 ; 0x01c: 0x00000003 kffdnd.fstblk.incarn: 3 ; 0x020: A=1 NUMM=0x1 kfade[0].entry.incarn: 3 ; 0x024: A=1 NUMM=0x1 kfade[0].entry.hash: 3062743642 ; 0x028: 0xb68dc25a kfade[0].entry.refer.number: 4294967295 ; 0x02c: 0xffffffff kfade[0].entry.refer.incarn: 0 ; 0x030: A=0 NUMM=0x0 kfade[0].name: Current ; 0x034: length=7 kfade[0].fnum: 260 ; 0x064: 0x00000104 kfade[0].finc: 802678553 ; 0x068: 0x2fd7e719 kfade[0].flags: 18 ; 0x06c: U=0 S=1 S=0 U=0 F=1 kfade[0].ub1spare: 0 ; 0x06d: 0x00 kfade[0].ub2spare: 0 ; 0x06e: 0x0000 ........ |
从上面信息,你可以知道目前数据库的controlfile名称为:Current.260.802678553
##### Redo logfile
同理,找到online logfile的alias 信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
[oracle@10gasm ~]$ kfed read /dev/sdd aun=26 blkn=4 | more kfbh.endian: 1 ; 0x000: 0x01 kfbh.hard: 130 ; 0x001: 0x82 kfbh.type: 11 ; 0x002: KFBTYP_ALIASDIR kfbh.datfmt: 1 ; 0x003: 0x01 kfbh.block.blk: 4 ; 0x004: T=0 NUMB=0x4 kfbh.block.obj: 6 ; 0x008: TYPE=0x0 NUMB=0x6 kfbh.check: 1826975500 ; 0x00c: 0x6ce56f0c kfbh.fcn.base: 1887 ; 0x010: 0x0000075f kfbh.fcn.wrap: 0 ; 0x014: 0x00000000 kfbh.spare1: 0 ; 0x018: 0x00000000 kfbh.spare2: 0 ; 0x01c: 0x00000000 kffdnd.bnode.incarn: 1 ; 0x000: A=1 NUMM=0x0 kffdnd.bnode.frlist.number: 4294967295 ; 0x004: 0xffffffff kffdnd.bnode.frlist.incarn: 0 ; 0x008: A=0 NUMM=0x0 kffdnd.overfl.number: 4294967295 ; 0x00c: 0xffffffff kffdnd.overfl.incarn: 0 ; 0x010: A=0 NUMM=0x0 kffdnd.parent.number: 1 ; 0x014: 0x00000001 kffdnd.parent.incarn: 1 ; 0x018: A=1 NUMM=0x0 kffdnd.fstblk.number: 4 ; 0x01c: 0x00000004 kffdnd.fstblk.incarn: 1 ; 0x020: A=1 NUMM=0x0 kfade[0].entry.incarn: 1 ; 0x024: A=1 NUMM=0x0 kfade[0].entry.hash: 2031796096 ; 0x028: 0x791abf80 kfade[0].entry.refer.number: 4294967295 ; 0x02c: 0xffffffff kfade[0].entry.refer.incarn: 0 ; 0x030: A=0 NUMM=0x0 kfade[0].name: group_1 ; 0x034: length=7 kfade[0].fnum: 261 ; 0x064: 0x00000105 kfade[0].finc: 802678553 ; 0x068: 0x2fd7e719 kfade[0].flags: 18 ; 0x06c: U=0 S=1 S=0 U=0 F=1 kfade[0].ub1spare: 0 ; 0x06d: 0x00 kfade[0].ub2spare: 0 ; 0x06e: 0x0000 kfade[1].entry.incarn: 1 ; 0x070: A=1 NUMM=0x0 kfade[1].entry.hash: 392836082 ; 0x074: 0x176a33f2 kfade[1].entry.refer.number: 4294967295 ; 0x078: 0xffffffff kfade[1].entry.refer.incarn: 0 ; 0x07c: A=0 NUMM=0x0 kfade[1].name: group_2 ; 0x080: length=7 kfade[1].fnum: 262 ; 0x0b0: 0x00000106 kfade[1].finc: 802678555 ; 0x0b4: 0x2fd7e71b kfade[1].flags: 18 ; 0x0b8: U=0 S=1 S=0 U=0 F=1 kfade[1].ub1spare: 0 ; 0x0b9: 0x00 kfade[1].ub2spare: 0 ; 0x0ba: 0x0000 kfade[2].entry.incarn: 1 ; 0x0bc: A=1 NUMM=0x0 kfade[2].entry.hash: 2800308934 ; 0x0c0: 0xa6e952c6 kfade[2].entry.refer.number: 4294967295 ; 0x0c4: 0xffffffff kfade[2].entry.refer.incarn: 0 ; 0x0c8: A=0 NUMM=0x0 kfade[2].name: group_3 ; 0x0cc: length=7 kfade[2].fnum: 263 ; 0x0fc: 0x00000107 kfade[2].finc: 802678557 ; 0x100: 0x2fd7e71d kfade[2].flags: 18 ; 0x104: U=0 S=1 S=0 U=0 F=1 kfade[2].ub1spare: 0 ; 0x105: 0x00 kfade[2].ub2spare: 0 ; 0x106: 0x0000 ......... |
从上面信息,你可以知道目前该数据库有3组redo,每组1个logfile,如下:
group_1.261.802678553
group_2.262.802678555
group_3.263.802678557
##### Spfile
同理,找到spfile的alias信息如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
[oracle@10gasm ~]$ kfed read /dev/sdd aun=26 blkn=6 | more kfbh.endian: 1 ; 0x000: 0x01 kfbh.hard: 130 ; 0x001: 0x82 kfbh.type: 11 ; 0x002: KFBTYP_ALIASDIR kfbh.datfmt: 1 ; 0x003: 0x01 kfbh.block.blk: 6 ; 0x004: T=0 NUMB=0x6 kfbh.block.obj: 6 ; 0x008: TYPE=0x0 NUMB=0x6 kfbh.check: 3446176149 ; 0x00c: 0xcd687995 kfbh.fcn.base: 1994 ; 0x010: 0x000007ca kfbh.fcn.wrap: 0 ; 0x014: 0x00000000 kfbh.spare1: 0 ; 0x018: 0x00000000 kfbh.spare2: 0 ; 0x01c: 0x00000000 kffdnd.bnode.incarn: 1 ; 0x000: A=1 NUMM=0x0 kffdnd.bnode.frlist.number: 4294967295 ; 0x004: 0xffffffff kffdnd.bnode.frlist.incarn: 0 ; 0x008: A=0 NUMM=0x0 kffdnd.overfl.number: 4294967295 ; 0x00c: 0xffffffff kffdnd.overfl.incarn: 0 ; 0x010: A=0 NUMM=0x0 kffdnd.parent.number: 1 ; 0x014: 0x00000001 kffdnd.parent.incarn: 1 ; 0x018: A=1 NUMM=0x0 kffdnd.fstblk.number: 6 ; 0x01c: 0x00000006 kffdnd.fstblk.incarn: 1 ; 0x020: A=1 NUMM=0x0 kfade[0].entry.incarn: 1 ; 0x024: A=1 NUMM=0x0 kfade[0].entry.hash: 1965945079 ; 0x028: 0x752df0f7 kfade[0].entry.refer.number: 4294967295 ; 0x02c: 0xffffffff kfade[0].entry.refer.incarn: 0 ; 0x030: A=0 NUMM=0x0 kfade[0].name: spfile ; 0x034: length=6 kfade[0].fnum: 265 ; 0x064: 0x00000109 kfade[0].finc: 802678613 ; 0x068: 0x2fd7e755 kfade[0].flags: 18 ; 0x06c: U=0 S=1 S=0 U=0 F=1 kfade[0].ub1spare: 0 ; 0x06d: 0x00 kfade[0].ub2spare: 0 ; 0x06e: 0x0000 ........ |
到这里,你知道数据库spfile的全称是spfile.265.802678613。
当你知道数据库文件的alias名称之后,如果你利用amdu从asm diskgroup中抽取某个文件,那么就灰常容易了,
而且如果你后面需要用来恢复,甚至你连文件名都不用改,如下例子抽取上述的spfile:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
[oracle@10gasm ~]$ amdu -dis '/dev/sd*' -extract data1.265 -output spfile.265.802678613 amdu_2013_01_14_05_35_42/ [oracle@10gasm ~]$ strings spfile.265.802678613 test.__db_cache_size=188743680 test.__java_pool_size=4194304 test.__large_pool_size=4194304 test.__shared_pool_size=83886080 test.__streams_pool_size=0 *.audit_file_dest='/home/oracle/admin/test/adump' *.background_dump_dest='/home/oracle/admin/test/bdump' *.compatible='10.2.0.1.0' *.control_files='+DATA1/test/controlfile/current.260.802678553' *.core_dump_dest='/home/oracle/admin/test/cdump' *.db_block_size=8192 *.db_create_file_dest='+DATA1' *.db_domain='' *.db_file_multiblock_read_count=16 *.db_name='test' *.dispatchers='(PROTOCOL=TCP) (SERVICE=testXDB)' *.job_queue_processes=10 *.open_cursors=300 *.pga_aggregate_target=94371840 *.processes=150 *.remote_login_passwordfile='EXCLUSIVE' *.sga_target=285212672 *.undo_management='AUTO' *.undo_tablespace='UNDOTBS1' *.user_dump_dest='/home/oracle/admin/test/udump' |
到最后,加上这一篇文章,已经一共有5篇asm 元数据的文章了,我想大家应该都了解的差不多了。回头会继续分解ACD,COD等结构.
One Response to “oracle asm 剖析系列(5)–alias directory”
请教下,11g的值怎么获取?
SQL> SELECT number_kffxp file#, disk_kffxp disk#, COUNT(disk_kffxp) extents
2 FROM x$kffxp
3 WHERE group_kffxp = 1
4 AND disk_kffxp 65534
5 GROUP BY number_kffxp, disk_kffxp;
FILE# DISK# EXTENTS
———- ———- ———-
1 0 2
2 0 1
3 0 21
3 1 21
4 0 4
4 1 4
5 0 1
6 1 1
8 0 1
9 1 1
[grid@oracle11 ~]$ kfed read /dev/asm-data1 aun=2 blkn=6 | grep au | head -5
kfffde[0].xptr.au: 27 ; 0x4a0: 0x0000001b
[grid@oracle11 ~]$ kfed read /dev/asm-data1 aun=27 blkn=1 | more
kfbh.endian: 0 ; 0x000: 0x00
kfbh.hard: 0 ; 0x001: 0x00
kfbh.type: 0 ; 0x002: KFBTYP_INVALID
对au 27 执行kfed,结果返回是错误的 KFBTYP_INVALID。
Leave a Reply
You must be logged in to post a comment.