承接ASM恢复时间的研究思考,这里补充从ASM中恢复出数据文件的需要知道细节部分。
首先找到asm的file directory的物理位置:
[oracle@rac1 ~]$ kfed read /dev/raw/raw1 aunum=0 blknum=0 kfbh.endian: 1 ; 0×000: 0×01 kfbh.hard: 130 ; 0×001: 0×82 kfbh.type: 1 ; 0×002: KFBTYP_DISKHEAD …… kfdhdb.blksize: 4096 ; 0x0ba: 0×1000 kfdhdb.ausize: 1048576 ; 0x0bc: 0×00100000 kfdhdb.mfact: 113792 ; 0x0c0: 0x0001bc80 kfdhdb.dsksize: 3067 ; 0x0c4: 0x00000bfb kfdhdb.pmcnt: 2 ; 0x0c8: 0×00000002 kfdhdb.fstlocn: 1 ; 0x0cc: 0×00000001 kfdhdb.altlocn: 2 ; 0x0d0: 0×00000002 kfdhdb.f1b1locn: 2 ; 0x0d4: 0×00000002
从结果里我们可以看到,file directory的第1个block在AU2上,而从10-12c中的研究分析,ASM的1号文件的file dir的地址都在0号盘的au2上,如果到这里看不懂,研究下asm的metadata文件1-255。
接下来看一下AU2的1号block:
[oracle@rac1 ~]$ kfed read /dev/raw/raw1 aunum=2 blknum=1 kfbh.endian: 1 ; 0×000: 0×01 kfbh.hard: 130 ; 0×001: 0×82 kfbh.type: 4 ; 0×002: KFBTYP_FILEDIR …… kfffdb.usm: ; 0x0a0: length=0 <strong>kfffde[0].xptr.au: 2 ; 0x4a0: 0×00000002</strong> kfffde[0].xptr.disk: 0 ; 0x4a4: 0×0000 kfffde[0].xptr.flags: 0 ; 0x4a6: L=0 E=0 D=0 C=0 S=0 kfffde[0].xptr.chk: 40 ; 0x4a7: 0×28 kfffde[1].xptr.au: 2 ; 0x4a8: 0×00000002 kfffde[1].xptr.disk: 1 ; 0x4ac: 0×0001 kfffde[1].xptr.flags: 0 ; 0x4ae: L=0 E=0 D=0 C=0 S=0 kfffde[1].xptr.chk: 41 ; 0x4af: 0×29 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 C=0 S=0 kfffde[2].xptr.chk: 42 ; 0x4b7: 0x2a <strong>kfffde[3].xptr.au: 93 ; 0x4b8: 0x0000005d</strong> kfffde[3].xptr.disk: 0 ; 0x4bc: 0×0000 kfffde[3].xptr.flags: 0 ; 0x4be: L=0 E=0 D=0 C=0 S=0 kfffde[3].xptr.chk: 119 ; 0x4bf: 0×77 kfffde[4].xptr.au: 93 ; 0x4c0: 0x0000005d kfffde[4].xptr.disk: 1 ; 0x4c4: 0×0001 kfffde[4].xptr.flags: 0 ; 0x4c6: L=0 E=0 D=0 C=0 S=0 kfffde[4].xptr.chk: 118 ; 0x4c7: 0×76 kfffde[5].xptr.au: 4294967294 ; 0x4c8: 0xfffffffe …… kfffde[39].xptr.disk: 65535 ; 0x5dc: 0xffff
从结果里我们可以知道/dev/raw/raw1只有两个file directory,第一个file directory在AU2上,第二个file directory在AU93上。asm的默认au为1m,每个file的dir大小为4k,所以每个au最多只能存储256个file,asm1-255file为metadata,所以通常的数据库数据文件都在第二个AU后(这里建议关注下,如果datafile所占有的au数量非常多,4k信息装不下怎么办?)。
在这里1M AU的情况下对于第二个file directory而言,datafile 1就在block 0里,datafile 2就在block 1里,依次类推,所以datafile 4在block 3里(au的基础单元为os块4k大小),下来观察这个block:
[oracle@rac1 ~]$ kfed read /dev/raw/raw1 aunum=93 blknum=3 kfbh.endian: 1 ; 0×000: 0×01 kfbh.hard: 130 ; 0×001: 0×82 kfbh.type: 4 ; 0×002: KFBTYP_FILEDIR kfbh.datfmt: 1 ; 0×003: 0×01 kfbh.block.blk: 259 ; 0×004: T=0 NUMB=0×103 kfbh.block.obj: 1 ; 0×008: TYPE=0×0 NUMB=0×1 …… kfffdb.spare[15]: 0 ; 0x09c: 0×00000000 kfffdb.usm: ; 0x0a0: length=0 kfffde[0].xptr.au: 211 ; 0x4a0: 0×000000d3 kfffde[0].xptr.disk: 1 ; 0x4a4: 0×0001 kfffde[0].xptr.flags: 0 ; 0x4a6: L=0 E=0 D=0 C=0 S=0 kfffde[0].xptr.chk: 106 ; 0x4a7: 0x6a kfffde[1].xptr.au: 211 ; 0x4a0: 0×000000d3 kfffde[1].xptr.disk: 0 ; 0x4ac: 0×0000 kfffde[1].xptr.flags: 0 ; 0x4ae: L=0 E=0 D=0 C=0 S=0 kfffde[1].xptr.chk: 107 ; 0x4af: 0x6b kfffde[2].xptr.au: 212 ; 0x4b0: 0×000000d4 kfffde[2].xptr.disk: 0 ; 0x4b4: 0×0000 kfffde[2].xptr.flags: 0 ; 0x4b6: L=0 E=0 D=0 C=0 S=0 kfffde[2].xptr.chk: 106 ; 0x4b7: 0x6a kfffde[3].xptr.au: 212 ; 0x4b0: 0×000000d4 kfffde[3].xptr.disk: 1 ; 0x4bc: 0×0001 kfffde[3].xptr.flags: 0 ; 0x4be: L=0 E=0 D=0 C=0 S=0 kfffde[3].xptr.chk: 107 ; 0x4bf: 0x6b kfffde[4].xptr.au: 213 ; 0x4c0: 0×000000d5 kfffde[4].xptr.disk: 1 ; 0x4c4: 0×0001 kfffde[4].xptr.flags: 0 ; 0x4c6: L=0 E=0 D=0 C=0 S=0 kfffde[4].xptr.chk: 108 ; 0x4c7: 0x6c kfffde[5].xptr.au: 213 ; 0x4c0: 0×000000d5 kfffde[5].xptr.disk: 0 ; 0x4cc: 0×0000 kfffde[5].xptr.flags: 0 ; 0x4ce: L=0 E=0 D=0 C=0 S=0 kfffde[5].xptr.chk: 109 ; 0x4cf: 0x6d kfffde[6].xptr.au: 214 ; 0x4d0: 0×000000d6 kfffde[6].xptr.disk: 0 ; 0x4d4: 0×0000 kfffde[6].xptr.flags: 0 ; 0x4d6: L=0 E=0 D=0 C=0 S=0 kfffde[6].xptr.chk: 108 ; 0x4d7: 0x6c kfffde[7].xptr.au: 214 ; 0x4d0: 0×000000d6 kfffde[7].xptr.disk: 1 ; 0x4dc: 0×0001 kfffde[7].xptr.flags: 0 ; 0x4de: L=0 E=0 D=0 C=0 S=0 kfffde[12].xptr.au: 4294967295 ; 0×500: 0xffffffff kfffde[12].xptr.disk: 65535 ; 0×504: 0xffff …… kfffde[23].xptr.au: 4294967295 ; 0×558: 0xffffffff kfffde[23].xptr.disk: 65535 ; 0x55c: 0xffff
根据上面的信息可以发现datafile 4在/dev/raw/raw1上的物理存储位置可以看到datafile 4一共占了6个AU,分别是AU211,AU212,AU213,AU214.