13510228421
技术资料
oracle ASM数据恢复
2011-06-07 12:18:33  

经常有朋友问我ASM的文件结构。以便于碰到ASM故障时能够处理。ASM是一个十分复杂的体系,不过其文件分配表的结构确是十分简单的。如果有朋友有兴趣写个工具,从ASM中读取文件,也是很容易实现的。

首先我们简单了解一下AU的概念,AU是分配单元,ASM的存储是以AU为单位分配的。10G缺省AUSIZE1M,如果要使用费缺省AU_SIZE,需要使用隐含参数。在11G中,这个隐含参数变成了标准参数了。

第二,ASM里的所有数据都是以文件形式组织的。每个文件包含NAU(除了METADATA文件外)。

首先我们要了解的是DISK HEADER,每个DGDISK都有一个HEAD,其位置是文件头部(如果以0为第一个块的话,那就是0号块),DISKHEADER其实就是每个DISKAU 0BLOCK 0。我们使用kfed来看看:

[grid@localhost ~]$ kfed read /dev/oracleasm/disks/ASMDISK1 aun=0
kfbh.endian: 1 ; 0x000: 0x01
kfbh.hard: 130 ; 0x001: 0x82
kfbh.type: 1 ; 0x002: KFBTYP_DISKHEAD
---DISKHEAD
kfbh.datfmt: 1 ; 0x003: 0x01
kfbh.block.blk: 0 ; 0x004: T=0 NUMB=0x0
kfbh.block.obj: 2147483648 ; 0x008: TYPE=0x8 NUMB=0x0
kfbh.check: 592378382 ; 0x00c: 0x234efa0e
kfbh.fcn.base: 0 ; 0x010: 0x00000000
kfbh.fcn.wrap: 0 ; 0x014: 0x00000000
kfbh.spare1: 0 ; 0x018: 0x00000000
kfbh.spare2: 0 ; 0x01c: 0x00000000
kfdhdb.driver.provstr: ORCLDISKASMDISK1 ; 0x000: length=16 ---
使用ASMLIB
kfdhdb.driver.reserved[0]: 1145918273 ; 0x008: 0x444d5341
kfdhdb.driver.reserved[1]: 827020105 ; 0x00c: 0x314b5349
kfdhdb.driver.reserved[2]: 0 ; 0x010: 0x00000000
kfdhdb.driver.reserved[3]: 0 ; 0x014: 0x00000000
kfdhdb.driver.reserved[4]: 0 ; 0x018: 0x00000000
kfdhdb.driver.reserved[5]: 0 ; 0x01c: 0x00000000
kfdhdb.compat: 186646528 ; 0x020: 0x0b200000
kfdhdb.dsknum: 0 ; 0x024: 0x0000
kfdhdb.grptyp: 2 ; 0x026: KFDGTP_NORMAL
----冗余模式为NORMAL
kfdhdb.hdrsts: 3 ; 0x027: KFDHDR_MEMBER
kfdhdb.dskname: DATA_0000 ; 0x028: length=9
---DISK NAME
kfdhdb.grpname: DATA ; 0x048: length=4
----DG NAME
kfdhdb.fgname: DATA_0000 ; 0x068: length=9 ---FAIL GROUP NAME
kfdhdb.capname: ; 0x088: length=0
kfdhdb.crestmp.hi: 32958036 ; 0x0a8: HOUR=0x14 DAYS=0x12 MNTH=0x9 YEAR=0x7db
kfdhdb.crestmp.lo: 1372083200 ; 0x0ac: USEC=0x0 MSEC=0x215 SECS=0x1c MINS=0x14
kfdhdb.mntstmp.hi: 32958761 ; 0x0b0: HOUR=0x9 DAYS=0x9 MNTH=0xa YEAR=0x7db
kfdhdb.mntstmp.lo: 2195050496 ; 0x0b4: USEC=0x0 MSEC=0x174 SECS=0x2d MINS=0x20
kfdhdb.secsize: 512 ; 0x0b8: 0x0200
kfdhdb.blksize: 4096 ; 0x0ba: 0x1000
-----块大小4096
kfdhdb.ausize: 1048576 ; 0x0bc: 0x00100000
kfdhdb.mfact: 113792 ; 0x0c0: 0x0001bc80
kfdhdb.dsksize: 7640 ; 0x0c4: 0x00001dd8
kfdhdb.pmcnt: 2 ; 0x0c8: 0x00000002
kfdhdb.fstlocn: 1 ; 0x0cc: 0x00000001
kfdhdb.altlocn: 2 ; 0x0d0: 0x00000002
kfdhdb.f1b1locn: 2 ; 0x0d4: 0x00000002 ----
指出1号文件(FILEDIR)的第一个块在AU
kfdhdb.redomirrors[0]: 0 ; 0x0d8: 0x0000
kfdhdb.redomirrors[1]: 0 ; 0x0da: 0x0000
kfdhdb.redomirrors[2]: 0 ; 0x0dc: 0x0000
kfdhdb.redomirrors[3]: 0 ; 0x0de: 0x0000
kfdhdb.dbcompat: 168820736 ; 0x0e0: 0x0a100000
kfdhdb.grpstmp.hi: 32958036 ; 0x0e4: HOUR=0x14 DAYS=0x12 MNTH=0x9 YEAR=0x7db
kfdhdb.grpstmp.lo: 1371925504 ; 0x0e8: USEC=0x0 MSEC=0x17b SECS=0x1c MINS=0x14
kfdhdb.vfstart: 0 ; 0x0ec: 0x00000000
kfdhdb.vfend: 0 ; 0x0f0: 0x00000000
kfdhdb.spfile: 59 ; 0x0f4: 0x0000003b
kfdhdb.spfflg: 1 ; 0x0f8: 0x00000001
kfdhdb.ub4spare[0]: 0 ; 0x0fc: 0x00000000
kfdhdb.ub4spare[1]: 0 ; 0x100: 0x00000000
kfdhdb.ub4spare[2]: 0 ; 0x104: 0x00000000
kfdhdb.ub4spare[3]: 0 ; 0x108: 0x00000000

于是我们查看一下AU=2的块:

kfbh.endian: 1 ; 0x000: 0x01
kfbh.hard: 130 ; 0x001: 0x82
kfbh.type: 5 ; 0x002: KFBTYP_LISTHEAD
kfbh.datfmt: 1 ; 0x003: 0x01
kfbh.block.blk: 0 ; 0x004: T=0 NUMB=0x0
kfbh.block.obj: 1 ; 0x008: TYPE=0x0 NUMB=0x1
kfbh.check: 4277826449 ; 0x00c: 0xfefa7391
kfbh.fcn.base: 3982 ; 0x010: 0x00000f8e
kfbh.fcn.wrap: 0 ; 0x014: 0x00000000
kfbh.spare1: 0 ; 0x018: 0x00000000
kfbh.spare2: 0 ; 0x01c: 0x00000000

我们可以看到,这个块的类型是LISTHEAD,这是1号文件(FILE DIR)的文件头。这个文件的块大小是4096,里面保存了文件的分配表的信息。每个文件的分配表占用一个BLOCK4096字节),1号文件(FILE DIR)的文件分配表在AU 2 BLOCK 1里,我们来看一下:

kfbh.endian: 1 ; 0x000: 0x01
kfbh.hard: 130 ; 0x001: 0x82
kfbh.type: 4 ; 0x002: KFBTYP_FILEDIR ----
这个块是FILEDIR
kfbh.datfmt: 1 ; 0x003: 0x01
kfbh.block.blk: 1 ; 0x004: T=0 NUMB=0x1
kfbh.block.obj: 1 ; 0x008: TYPE=0x0 NUMB=0x1
----1号文件
kfbh.check: 3992216370 ; 0x00c: 0xedf46332
kfbh.fcn.base: 458 ; 0x010: 0x000001ca
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: 6 ; 0x014: 0x00000006
------EXTENT的数量6个(有冗余是3)
kfffdb.xtnteof: 6 ; 0x018: 0x00000006
------文件尾部的指针
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
-----ASM METADATA
kfffdb.dXrs: 19 ; 0x022: SCHE=0x1 NUMB=0x3
kfffdb.iXrs: 19 ; 0x023: SCHE=0x1 NUMB=0x3
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: 6 ; 0x03c: 0x0006
kfffdb.break: 60 ; 0x03e: 0x003c
kfffdb.priZn: 0 ; 0x040: KFDZN_COLD
kfffdb.secZn: 0 ; 0x041: KFDZN_COLD
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: 32958036 ; 0x050: HOUR=0x14 DAYS=0x12 MNTH=0x9 YEAR=0x7db
kfffdb.crets.lo: 1372204032 ; 0x054: USEC=0x0 MSEC=0x28b SECS=0x1c MINS=0x14
kfffdb.modts.hi: 32958036 ; 0x058: HOUR=0x14 DAYS=0x12 MNTH=0x9 YEAR=0x7db
kfffdb.modts.lo: 1372204032 ; 0x05c: USEC=0x0 MSEC=0x28b SECS=0x1c MINS=0x14
kfffdb.dasz[0]: 0 ; 0x060: 0x00
kfffdb.dasz[1]: 0 ; 0x061: 0x00
kfffdb.dasz[2]: 0 ; 0x062: 0x00

kfffdb.dasz[3]: 0 ; 0x063: 0x00
kfffdb.permissn: 0 ; 0x064: 0x00
kfffdb.ub1spar1: 0 ; 0x065: 0x00
kfffdb.ub2spar2: 0 ; 0x066: 0x0000
kfffdb.user.entnum: 0 ; 0x068: 0x0000
kfffdb.user.entinc: 0 ; 0x06a: 0x0000
kfffdb.group.entnum: 0 ; 0x06c: 0x0000
kfffdb.group.entinc: 0 ; 0x06e: 0x0000
kfffdb.spare[0]: 0 ; 0x070: 0x00000000
kfffdb.spare[1]: 0 ; 0x074: 0x00000000
kfffdb.spare[2]: 0 ; 0x078: 0x00000000
kfffdb.spare[3]: 0 ; 0x07c: 0x00000000
kfffdb.spare[4]: 0 ; 0x080: 0x00000000
kfffdb.spare[5]: 0 ; 0x084: 0x00000000
kfffdb.spare[6]: 0 ; 0x088: 0x00000000
kfffdb.spare[7]: 0 ; 0x08c: 0x00000000
kfffdb.spare[8]: 0 ; 0x090: 0x00000000
kfffdb.spare[9]: 0 ; 0x094: 0x00000000
kfffdb.spare[10]: 0 ; 0x098: 0x00000000
kfffdb.spare[11]: 0 ; 0x09c: 0x00000000
kfffdb.usm: ; 0x0a0: length=0
kfffde[0].xptr.au: 2 ; 0x4a0: 0x00000002
---AU 2是第一个块
kfffde[0].xptr.disk: 0 ; 0x4a4: 0x0000
kfffde[0].xptr.flags: 0 ; 0x4a6: L=0 E=0 D=0 S=0
kfffde[0].xptr.chk: 40 ; 0x4a7: 0x28
kfffde[1].xptr.au: 2 ; 0x4a8: 0x00000002
----冗余块
kfffde[1].xptr.disk: 1 ; 0x4ac: 0x0001
kfffde[1].xptr.flags: 0 ; 0x4ae: L=0 E=0 D=0 S=0
kfffde[1].xptr.chk: 41 ; 0x4af: 0x29
kfffde[2].xptr.au: 4294967294 ; 0x4b0: 0xfffffffe
--------该项目是空的
kfffde[2].xptr.disk: 65534 ; 0x4b4: 0xfffe
kfffde[2].xptr.flags: 0 ; 0x4b6: L=0 E=0 D=0 S=0
kfffde[2].xptr.chk: 42 ; 0x4b7: 0x2a
kfffde[3].xptr.au: 60 ; 0x4b8: 0x0000003c
----AU 60是第二个块
kfffde[3].xptr.disk: 1 ; 0x4bc: 0x0001
kfffde[3].xptr.flags: 0 ; 0x4be: L=0 E=0 D=0 S=0
kfffde[3].xptr.chk: 23 ; 0x4bf: 0x17
kfffde[4].xptr.au: 60 ; 0x4c0: 0x0000003c
---60块的冗余块
kfffde[4].xptr.disk: 0 ; 0x4c4: 0x0000
kfffde[4].xptr.flags: 0 ; 0x4c6: L=0 E=0 D=0 S=0
kfffde[4].xptr.chk: 22 ; 0x4c7: 0x16
kfffde[5].xptr.au: 4294967294 ; 0x4c8: 0xfffffffe
---空的
kfffde[5].xptr.disk: 65534 ; 0x4cc: 0xfffe
kfffde[5].xptr.flags: 0 ; 0x4ce: L=0 E=0 D=0 S=0
kfffde[5].xptr.chk: 42 ; 0x4cf: 0x2a
kfffde[6].xptr.au: 4294967295 ; 0x4d0: 0xffffffff
----后面全部为空了(EOF6)
--More--

这个文件的第一个AU(AU 2)中的FILE DIR包含的都是ASM METADATA,文件名从1255256以后的数据文件都包含在第二个AU中(AU 60)。在这个数据库中,SYSAUXASM文件号是257,因此这个文件的FILE DIRAU 60BLOCK 1

kfbh.endian: 1 ; 0x000: 0x01
kfbh.hard: 130 ; 0x001: 0x82
kfbh.type: 4 ; 0x002: KFBTYP_FILEDIR
----FILEDIR
kfbh.datfmt: 1 ; 0x003: 0x01
kfbh.block.blk: 257 ; 0x004: T=0 NUMB=0x101 ---
文件号257
kfbh.block.obj: 1 ; 0x008: TYPE=0x0 NUMB=0x1
kfbh.check: 939601142 ; 0x00c: 0x38012cf6
kfbh.fcn.base: 3973 ; 0x010: 0x00000f85
kfbh.fcn.wrap: 0 ; 0x014: 0x00000000
kfbh.spare1: 0 ; 0x018: 0x00000000
kfbh.spare2: 0 ; 0x01c: 0x00000000
kfffdb.node.incarn: 762214283 ; 0x000: A=1 NUMM=0x16b73bc5
kfffdb.node.frlist.number: 4294967295 ; 0x004: 0xffffffff
kfffdb.node.frlist.incarn: 0 ; 0x008: A=0 NUMM=0x0
kfffdb.hibytes: 0 ; 0x00c: 0x00000000
kfffdb.lobytes: 723525632 ; 0x010: 0x2b202000
--文件大小
kfffdb.xtntcnt: 1382 ; 0x014: 0x00000566
--扩展的大小
kfffdb.xtnteof: 1382 ; 0x018: 0x00000566
kfffdb.blkSize: 8192 ; 0x01c: 0x00002000
---文件块大小是8K
kfffdb.flags: 17 ; 0x020: O=1 S=0 S=0 D=0 C=1 I=0 R=0 A=0
kfffdb.fileType: 12 ; 0x021: 0x0c
---数据库文件
kfffdb.dXrs: 18 ; 0x022: SCHE=0x1 NUMB=0x2
kfffdb.iXrs: 19 ; 0x023: SCHE=0x1 NUMB=0x3
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: 63 ; 0x03c: 0x003f
kfffdb.break: 60 ; 0x03e: 0x003c
kfffdb.priZn: 0 ; 0x040: KFDZN_COLD
kfffdb.secZn: 0 ; 0x041: KFDZN_COLD
kfffdb.ub2spare: 0 ; 0x042: 0x0000
kfffdb.alias[0]: 213 ; 0x044: 0x000000d5
kfffdb.alias[1]: 4294967295 ; 0x048: 0xffffffff
kfffdb.strpwdth: 1 ; 0x04c: 0x01
kfffdb.strpsz: 20 ; 0x04d: 0x14
kfffdb.usmsz: 0 ; 0x04e: 0x0000
kfffdb.crets.hi: 32958038 ; 0x050: HOUR=0x16 DAYS=0x12 MNTH=0x9 YEAR=0x7db
kfffdb.crets.lo: 761643008 ; 0x054: USEC=0x0 MSEC=0x170 SECS=0x16 MINS=0xb
kfffdb.modts.hi: 32958804 ; 0x058: HOUR=0x14 DAYS=0xa MNTH=0xa YEAR=0x7db
kfffdb.modts.lo: 0 ; 0x05c: USEC=0x0 MSEC=0x0 SECS=0x0 MINS=0x0
kfffdb.dasz[0]: 0 ; 0x060: 0x00
kfffdb.dasz[1]: 0 ; 0x061: 0x00
kfffdb.dasz[2]: 0 ; 0x062: 0x00
kfffdb.dasz[3]: 0 ; 0x063: 0x00
kfffdb.permissn: 0 ; 0x064: 0x00
kfffdb.ub1spar1: 0 ; 0x065: 0x00
kfffdb.ub2spar2: 0 ; 0x066: 0x0000
kfffdb.user.entnum: 0 ; 0x068: 0x0000
kfffdb.user.entinc: 0 ; 0x06a: 0x0000
kfffdb.group.entnum: 0 ; 0x06c: 0x0000
kfffdb.group.entinc: 0 ; 0x06e: 0x0000
kfffdb.spare[0]: 0 ; 0x070: 0x00000000
kfffdb.spare[1]: 0 ; 0x074: 0x00000000
kfffdb.spare[2]: 0 ; 0x078: 0x00000000
kfffdb.spare[3]: 0 ; 0x07c: 0x00000000
kfffdb.spare[4]: 0 ; 0x080: 0x00000000
kfffdb.spare[5]: 0 ; 0x084: 0x00000000
kfffdb.spare[6]: 0 ; 0x088: 0x00000000
kfffdb.spare[7]: 0 ; 0x08c: 0x00000000
kfffdb.spare[8]: 0 ; 0x090: 0x00000000
kfffdb.spare[9]: 0 ; 0x094: 0x00000000
kfffdb.spare[10]: 0 ; 0x098: 0x00000000
kfffdb.spare[11]: 0 ; 0x09c: 0x00000000
kfffdb.usm: ; 0x0a0: length=0
kfffde[0].xptr.au: 753 ; 0x4a0: 0x000002f1
----DISK 0 ,AU 753是该文件的第一个AU
kfffde[0].xptr.disk: 0 ; 0x4a4: 0x0000
kfffde[0].xptr.flags: 0 ; 0x4a6: L=0 E=0 D=0 S=0
kfffde[0].xptr.chk: 217 ; 0x4a7: 0xd9
kfffde[1].xptr.au: 753 ; 0x4a8: 0x000002f1
kfffde[1].xptr.disk: 1 ; 0x4ac: 0x0001
kfffde[1].xptr.flags: 0 ; 0x4ae: L=0 E=0 D=0 S=0
kfffde[1].xptr.chk: 216 ; 0x4af: 0xd8
kfffde[2].xptr.au: 754 ; 0x4b0: 0x000002f2
kfffde[2].xptr.disk: 1 ; 0x4b4: 0x0001
kfffde[2].xptr.flags: 0 ; 0x4b6: L=0 E=0 D=0 S=0
kfffde[2].xptr.chk: 219 ; 0x4b7: 0xdb
kfffde[3].xptr.au: 754 ; 0x4b8: 0x000002f2
kfffde[3].xptr.disk: 0 ; 0x4bc: 0x0000
kfffde[3].xptr.flags: 0 ; 0x4be: L=0 E=0 D=0 S=0
kfffde[3].xptr.chk: 218 ; 0x4bf: 0xda
kfffde[4].xptr.au: 755 ; 0x4c0: 0x000002f3
kfffde[4].xptr.disk: 0 ; 0x4c4: 0x0000
kfffde[4].xptr.flags: 0 ; 0x4c6: L=0 E=0 D=0 S=0
kfffde[4].xptr.chk: 219 ; 0x4c7: 0xdb
kfffde[5].xptr.au: 755 ; 0x4c8: 0x000002f3
kfffde[5].xptr.disk: 1 ; 0x4cc: 0x0001
kfffde[5].xptr.flags: 0 ; 0x4ce: L=0 E=0 D=0 S=0
kfffde[5].xptr.chk: 218 ; 0x4cf: 0xda
kfffde[6].xptr.au: 756 ; 0x4d0: 0x000002f4

DISK 0 ,AU 753是该文件的第一个AU,我们把这个文件DD出来看看:

[grid@localhost asmtest]$ dd if=/dev/oracleasm/disks/ASMDISK2 of=test1.dump bs=1024k skip=753 count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.00336261 seconds, 312 MB/s


可以看出0x2152位置是文件名,说明我们DD出来的块确是是SYSAUX这个文件。

是不是很简单,不过有些细心的人会有疑问了,一个4096字节的块,只能包含60AU项,如果有冗余,只能包含30MAU的指针,超过30M的文件如何处理呢。在每个FILEDIR块中,第61AU记录是特殊的,其指向的AU不是包含文件数据的AU,而是指向下一个FILEDIR

kfffde[61].xptr.au:                 783 ; 0x688: 0x0000030f
kfffde[61].xptr.disk:                 0 ; 0x68c: 0x0000
kfffde[61].xptr.flags:                0 ; 0x68e: L=0 E=0 D=0 S=0
kfffde[61].xptr.chk:                 38 ; 0x68f: 0x26

我们来看看783

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:                     257 ; 0x008: TYPE=0x0 NUMB=0x101
kfbh.check:                  2166261598 ; 0x00c: 0x811e875e
kfbh.fcn.base:                     1440 ; 0x010: 0x000005a0
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kffixb.dxsn:                         30 ; 0x000: 0x0000001e
kffixb.xtntblk:                     480 ; 0x004: 0x01e0
kffixb.dXrs:                         18 ; 0x006: SCHE=0x1 NUMB=0x2
kffixb.ub1spare:                      0 ; 0x007: 0x00
kffixb.ub4spare:                      0 ; 0x008: 0x00000000
kffixe[0].xptr.au:                  784 ; 0x00c: 0x00000310
kffixe[0].xptr.disk:                  0 ; 0x010: 0x0000
kffixe[0].xptr.flags:                 0 ; 0x012: L=0 E=0 D=0 S=0
kffixe[0].xptr.chk:                  57 ; 0x013: 0x39
kffixe[1].xptr.au:                  784 ; 0x014: 0x00000310
kffixe[1].xptr.disk:                  1 ; 0x018: 0x0001
kffixe[1].xptr.flags:                 0 ; 0x01a: L=0 E=0 D=0 S=0
kffixe[1].xptr.chk:                  56 ; 0x01b: 0x38
kffixe[2].xptr.au:                  785 ; 0x01c: 0x00000311
kffixe[2].xptr.disk:                  1 ; 0x020: 0x0001
kffixe[2].xptr.flags:                 0 ; 0x022: L=0 E=0 D=0 S=0
kffixe[2].xptr.chk:                  57 ; 0x023: 0x39
kffixe[3].xptr.au:                  785 ; 0x024: 0x00000311
kffixe[3].xptr.disk:                  0 ; 0x028: 0x0000
kffixe[3].xptr.flags:                 0 ; 0x02a: L=0 E=0 D=0 S=0
kffixe[3].xptr.chk:                  56 ; 0x02b: 0x38
kffixe[4].xptr.au:                  786 ; 0x02c: 0x00000312
kffixe[4].xptr.disk:                  0 ; 0x030: 0x0000
kffixe[4].xptr.flags:                 0 ; 0x032: L=0 E=0 D=0 S=0
kffixe[4].xptr.chk:                  59 ; 0x033: 0x3b
kffixe[5].xptr.au:                  786 ; 0x034: 0x00000312
kffixe[5].xptr.disk:                  1 ; 0x038: 0x0001
kffixe[5].xptr.flags:                 0 ; 0x03a: L=0 E=0 D=0 S=0
kffixe[5].xptr.chk:                  58 ; 0x03b: 0x3a
kffixe[6].xptr.au:                  787 ; 0x03c: 0x00000313
kffixe[6].xptr.disk:                  1 ; 0x040: 0x0001
kffixe[6].xptr.flags:                 0 ; 0x042: L=0 E=0 D=0 S=0
kffixe[6].xptr.chk:                  59 ; 0x043: 0x3b
kffixe[7].xptr.au:                  787 ; 0x044: 0x00000313
kffixe[7].xptr.disk:                  0 ; 0x048: 0x0000
我们可以看到这个块的类型是INDIRECT,非直接文件目录。这个AU里包含了余下的AU信息。如果这个AU还放不下这个文件的AU信息,那么最后一条记录指向下一个INDIRECTAU

至此大家对ASM文件分配的方法应该有了一个大概的了解了吧。

其实了解了这些信息,基本上可以动手写一个从ASM中读取文件的工具了。这里还缺少一个信息,就是文件别名的信息,就是数据文件名和ASM文件号之间的关系。这个别名文件的ASM文件号是6

ALIAS文件的文件号是6

[grid@localhost ~]$ kfed read /dev/oracleasm/disks/ASMDISK1 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:                  3972293371 ; 0x00c: 0xecc462fb
kfbh.fcn.base:                        0 ; 0x010: 0x00000000
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:                       3 ; 0x014: 0x00000003
kfffdb.xtnteof:                       3 ; 0x018: 0x00000003
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:                         19 ; 0x022: SCHE=0x1 NUMB=0x3
kfffdb.iXrs:                         19 ; 0x023: SCHE=0x1 NUMB=0x3
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:                       3 ; 0x03c: 0x0003
kfffdb.break:                        60 ; 0x03e: 0x003c
kfffdb.priZn:                         0 ; 0x040: KFDZN_COLD
kfffdb.secZn:                         0 ; 0x041: KFDZN_COLD
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:               32958036 ; 0x050: HOUR=0x14 DAYS=0x12 MNTH=0x9 YEAR=0x7db
kfffdb.crets.lo:             1372207104 ; 0x054: USEC=0x0 MSEC=0x28e SECS=0x1c MINS=0x14
kfffdb.modts.hi:               32958036 ; 0x058: HOUR=0x14 DAYS=0x12 MNTH=0x9 YEAR=0x7db
kfffdb.modts.lo:             1372207104 ; 0x05c: USEC=0x0 MSEC=0x28e SECS=0x1c MINS=0x14
kfffdb.dasz[0]:                       0 ; 0x060: 0x00
kfffdb.dasz[1]:                       0 ; 0x061: 0x00
kfffdb.dasz[2]:                       0 ; 0x062: 0x00

kfffdb.dasz[3]:                       0 ; 0x063: 0x00
kfffdb.permissn:                      0 ; 0x064: 0x00
kfffdb.ub1spar1:                      0 ; 0x065: 0x00
kfffdb.ub2spar2:                      0 ; 0x066: 0x0000
kfffdb.user.entnum:                   0 ; 0x068: 0x0000
kfffdb.user.entinc:                   0 ; 0x06a: 0x0000
kfffdb.group.entnum:                  0 ; 0x06c: 0x0000
kfffdb.group.entinc:                  0 ; 0x06e: 0x0000
kfffdb.spare[0]:                      0 ; 0x070: 0x00000000
kfffdb.spare[1]:                      0 ; 0x074: 0x00000000
kfffdb.spare[2]:                      0 ; 0x078: 0x00000000
kfffdb.spare[3]:                      0 ; 0x07c: 0x00000000
kfffdb.spare[4]:                      0 ; 0x080: 0x00000000
kfffdb.spare[5]:                      0 ; 0x084: 0x00000000
kfffdb.spare[6]:                      0 ; 0x088: 0x00000000
kfffdb.spare[7]:                      0 ; 0x08c: 0x00000000
kfffdb.spare[8]:                      0 ; 0x090: 0x00000000
kfffdb.spare[9]:                      0 ; 0x094: 0x00000000
kfffdb.spare[10]:                     0 ; 0x098: 0x00000000
kfffdb.spare[11]:                     0 ; 0x09c: 0x00000000
kfffdb.usm:                             ; 0x0a0: length=0
kfffde[0].xptr.au:                   49 ; 0x4a0: 0x00000031
kfffde[0].xptr.disk:                  0 ; 0x4a4: 0x0000
kfffde[0].xptr.flags:                 0 ; 0x4a6: L=0 E=0 D=0 S=0
kfffde[0].xptr.chk:                  27 ; 0x4a7: 0x1b
kfffde[1].xptr.au:                   49 ; 0x4a8: 0x00000031
kfffde[1].xptr.disk:                  1 ; 0x4ac: 0x0001
kfffde[1].xptr.flags:                 0 ; 0x4ae: L=0 E=0 D=0 S=0
kfffde[1].xptr.chk:                  26 ; 0x4af: 0x1a
kfffde[2].xptr.au:           4294967294 ; 0x4b0: 0xfffffffe
kfffde[2].xptr.disk:              65534 ; 0x4b4: 0xfffe
kfffde[2].xptr.flags:                 0 ; 0x4b6: L=0 E=0 D=0 S=0
kfffde[2].xptr.chk:                  42 ; 0x4b7: 0x2a
kfffde[3].xptr.au:           4294967295 ; 0x4b8: 0xffffffff
kfffde[3].xptr.disk:              65535 ; 0x4bc: 0xffff
kfffde[3].xptr.flags:                 0 ; 0x4be: L=0 E=0 D=0 S=0
kfffde[3].xptr.chk:                  42 ; 0x4bf: 0x2a
kfffde[4].xptr.au:           4294967295 ; 0x4c0: 0xffffffff
kfffde[4].xptr.disk:              65535 ; 0x4c4: 0xffff
kfffde[4].xptr.flags:                 0 ; 0x4c6: L=0 E=0 D=0 S=0
kfffde[4].xptr.chk:                  42 ; 0x4c7: 0x2a
kfffde[5].xptr.au:           4294967295 ; 0x4c8: 0xffffffff
kfffde[5].xptr.disk:              65535 ; 0x4cc: 0xffff
kfffde[5].xptr.flags:                 0 ; 0x4ce: L=0 E=0 D=0 S=0
kfffde[5].xptr.chk:                  42 ; 0x4cf: 0x2a
kfffde[6].xptr.au:           4294967295 ; 0x4d0: 0xffffffff

ALIAS文件的AU49:

[grid@localhost ~]$ kfed read /dev/oracleasm/disks/ASMDISK1 aun=49 |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:                       0 ; 0x004: T=0 NUMB=0x0
kfbh.block.obj:                       6 ; 0x008: TYPE=0x0 NUMB=0x6
kfbh.check:                  2830664843 ; 0x00c: 0xa8b8848b
kfbh.fcn.base:                      462 ; 0x010: 0x000001ce
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:                 0 ; 0x01c: 0x00000000
kffdnd.fstblk.incarn:                 1 ; 0x020: A=1 NUMM=0x0
kfade[0].entry.incarn:                1 ; 0x024: A=1 NUMM=0x0
kfade[0].entry.hash:         4004320810 ; 0x028: 0xeead162a
kfade[0].entry.refer.number:          1 ; 0x02c: 0x00000001
kfade[0].entry.refer.incarn:          1 ; 0x030: A=1 NUMM=0x0
kfade[0].name:                      ASM ; 0x034: length=3
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:                1 ; 0x070: A=1 NUMM=0x0
kfade[1].entry.hash:          185602149 ; 0x074: 0x0b101065
kfade[1].entry.refer.number:          3 ; 0x078: 0x00000003
kfade[1].entry.refer.incarn:          1 ; 0x07c: A=1 NUMM=0x0
kfade[1].name:                     ORCL ; 0x080: length=4
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:                0 ; 0x0bc: A=0 NUMM=0x0
kfade[2].entry.hash:                  0 ; 0x0c0: 0x00000000
kfade[2].entry.refer.number:          0 ; 0x0c4: 0x00000000
kfade[2].entry.refer.incarn:          0 ; 0x0c8: A=0 NUMM=0x0
kfade[2].name:                          ; 0x0cc: length=0
kfade[2].fnum:                        0 ; 0x0fc: 0x00000000

kfade[51].ub2spare:                   0 ; 0xf92: 0x0000
kfade[52].entry.incarn:               0 ; 0xf94: A=0 NUMM=0x0
kfade[52].entry.hash:                 0 ; 0xf98: 0x00000000
kfade[52].entry.refer.number:         0 ; 0xf9c: 0x00000000
kfade[52].entry.refer.incarn:         0 ; 0xfa0: A=0 NUMM=0x0
kfade[52].name:                         ; 0xfa4: length=0
kfade[52].fnum:                       0 ; 0xfd4: 0x00000000
kfade[52].finc:                       0 ; 0xfd8: 0x00000000
kfade[52].flags:                      0 ; 0xfdc: U=0 S=0 S=0 U=0 F=0
kfade[52].ub1spare:                   0 ; 0xfdd: 0x00
kfade[52].ub2spare:                   0 ; 0xfde: 0x0000

这个AU的类型是ALIASDIR,存放别名的,每个AU可以放52个别名,

kfade[0].entry.incarn:                1 ; 0x024: A=1 NUMM=0x0
kfade[0].entry.hash:         2097622492 ; 0x028: 0x7d072ddc
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:                762214281 ; 0x068: 0x2d6e7789
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

 

 

[Print]  [Close]  

7x24小时服务  QQ 1186505712 Email 1186505712@qq.com  TEL  13510228421   陈工   
         本站所有资源版权归深圳市极佳电脑技术服务有限公司,禁止克隆本站,抄袭本站文章等侵权行为,否则我们必将追究其法律责任! 

地址:深圳市龙华区中海汇德理花园2栋1单元1903
copyright 2008-2022 极佳数据 ( SQL110.com ) All rights reserved 粤ICP备17000871号

在线解答
QQ762862548
在线解答
QQ1186505712
在线解答
QQ254897536
在线解答
在线解答
在线解答