简单写了一个查询asm disk directory。
我们一般在asm磁盘mount不了的时候,需要检查磁盘头的信息,有时候盘头的信息会和disk directory的信息不一致,需要手工的修改disk dir或者盘头的信息。
由于找disk dir有点麻烦,需要先找到file 1 block 1,找到file dir,再去找disk dir,如果磁盘多,这个过程会有点麻烦,因此写了个脚本,可以指示如何去找disk dir。
脚本见文章末尾附件。脚本运行完之后,会在当前目录下产生一个以时间戳结尾的chk_result文件。输出类似结果如下:
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 |
[oracle@rac1 log]$ cat chk_result_20150719210305.txt ##################################### # ASM Disk Metadata Info ##################################### ---------------------------- ALL DISK INFO: ============================ /dev/asm-acfs01 ACFS kfdhdb.f1b1locn: 2 ; 0x0d4: 0x00000002 kfdhdb.dsknum: 0 ; 0x024: 0x0000 /dev/asm-acfs02 ACFS kfdhdb.f1b1locn: 0 ; 0x0d4: 0x00000000 kfdhdb.dsknum: 1 ; 0x024: 0x0001 /dev/asm-data01 DATA kfdhdb.f1b1locn: 447 ; 0x0d4: 0x000001bf kfdhdb.dsknum: 0 ; 0x024: 0x0000 /dev/asm-data02 DATA kfdhdb.f1b1locn: 0 ; 0x0d4: 0x00000000 kfdhdb.dsknum: 1 ; 0x024: 0x0001 /dev/asm-data03 DATA kfdhdb.f1b1locn: 0 ; 0x0d4: 0x00000000 kfdhdb.dsknum: 2 ; 0x024: 0x0002 /dev/asm-fra01 FRA kfdhdb.f1b1locn: 2 ; 0x0d4: 0x00000002 kfdhdb.dsknum: 0 ; 0x024: 0x0000 /dev/asm-fra02 FRA kfdhdb.f1b1locn: 0 ; 0x0d4: 0x00000000 kfdhdb.dsknum: 1 ; 0x024: 0x0001 /dev/asm-fra03 FRA kfdhdb.f1b1locn: 0 ; 0x0d4: 0x00000000 kfdhdb.dsknum: 2 ; 0x024: 0x0002 /dev/asm-data04 MYTEST kfdhdb.f1b1locn: 0 ; 0x0d4: 0x00000000 kfdhdb.dsknum: 1 ; 0x024: 0x0001 /dev/asm-data05 MYTEST kfdhdb.f1b1locn: 2 ; 0x0d4: 0x00000002 kfdhdb.dsknum: 0 ; 0x024: 0x0000 /dev/asm-fra04 MYTEST kfdhdb.f1b1locn: 0 ; 0x0d4: 0x00000000 kfdhdb.dsknum: 2 ; 0x024: 0x0002 /dev/asm-ocrvot1 OCRVOT kfdhdb.f1b1locn: 2 ; 0x0d4: 0x00000002 kfdhdb.dsknum: 0 ; 0x024: 0x0000 /dev/asm-ocrvot2 OCRVOT kfdhdb.f1b1locn: 2 ; 0x0d4: 0x00000002 kfdhdb.dsknum: 1 ; 0x024: 0x0001 /dev/asm-ocrvot3 OCRVOT kfdhdb.f1b1locn: 2 ; 0x0d4: 0x00000002 kfdhdb.dsknum: 2 ; 0x024: 0x0002 ---------------------------- FILE_DIR(f1b1) INFO: ============================ /dev/asm-acfs01 ACFS kfdhdb.f1b1locn: 2 ; 0x0d4: 0x00000002 kfdhdb.dsknum: 0 ; 0x024: 0x0000 /dev/asm-data01 DATA kfdhdb.f1b1locn: 447 ; 0x0d4: 0x000001bf kfdhdb.dsknum: 0 ; 0x024: 0x0000 /dev/asm-fra01 FRA kfdhdb.f1b1locn: 2 ; 0x0d4: 0x00000002 kfdhdb.dsknum: 0 ; 0x024: 0x0000 /dev/asm-data05 MYTEST kfdhdb.f1b1locn: 2 ; 0x0d4: 0x00000002 kfdhdb.dsknum: 0 ; 0x024: 0x0000 /dev/asm-ocrvot1 OCRVOT kfdhdb.f1b1locn: 2 ; 0x0d4: 0x00000002 kfdhdb.dsknum: 0 ; 0x024: 0x0000 /dev/asm-ocrvot2 OCRVOT kfdhdb.f1b1locn: 2 ; 0x0d4: 0x00000002 kfdhdb.dsknum: 1 ; 0x024: 0x0001 /dev/asm-ocrvot3 OCRVOT kfdhdb.f1b1locn: 2 ; 0x0d4: 0x00000002 kfdhdb.dsknum: 2 ; 0x024: 0x0002 ---------------------------- DISK_DIR LOC: ============================ ==> ACFS : kfffde[0].xptr.au: 2 ; 0x4a0: 0x00000002 kfffde[0].xptr.disk: 1 ; 0x4a4: 0x0001 ------------ ==> DATA : kfffde[0].xptr.au: 2 ; 0x4a0: 0x00000002 kfffde[0].xptr.disk: 1 ; 0x4a4: 0x0001 ------------ ==> FRA : kfffde[0].xptr.au: 2 ; 0x4a0: 0x00000002 kfffde[0].xptr.disk: 2 ; 0x4a4: 0x0002 ------------ ==> MYTEST : kfffde[0].xptr.au: 2 ; 0x4a0: 0x00000002 kfffde[0].xptr.disk: 2 ; 0x4a4: 0x0002 ------------ ==> OCRVOT : kfffde[0].xptr.au: 3 ; 0x4a0: 0x00000003 kfffde[0].xptr.disk: 2 ; 0x4a4: 0x0002 kfffde[1].xptr.au: 3 ; 0x4a8: 0x00000003 kfffde[1].xptr.disk: 1 ; 0x4ac: 0x0001 kfffde[2].xptr.au: 3 ; 0x4b0: 0x00000003 kfffde[2].xptr.disk: 0 ; 0x4b4: 0x0000 ------------ ==> OCRVOT : kfffde[0].xptr.au: 3 ; 0x4a0: 0x00000003 kfffde[0].xptr.disk: 2 ; 0x4a4: 0x0002 kfffde[1].xptr.au: 3 ; 0x4a8: 0x00000003 kfffde[1].xptr.disk: 1 ; 0x4ac: 0x0001 kfffde[2].xptr.au: 3 ; 0x4b0: 0x00000003 kfffde[2].xptr.disk: 0 ; 0x4b4: 0x0000 ------------ ==> OCRVOT : kfffde[0].xptr.au: 3 ; 0x4a0: 0x00000003 kfffde[0].xptr.disk: 2 ; 0x4a4: 0x0002 kfffde[1].xptr.au: 3 ; 0x4a8: 0x00000003 kfffde[1].xptr.disk: 1 ; 0x4ac: 0x0001 kfffde[2].xptr.au: 3 ; 0x4b0: 0x00000003 kfffde[2].xptr.disk: 0 ; 0x4b4: 0x0000 ------------ |
根据上面的结果,可以去看如DATA这个diskgroup的disk dir在该diskgroup的disk1,aun 2上。那么,我们就可用用kfed看此disk 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 |
[oracle@rac1 log]$ kfed read /dev/asm-data02 aun=2 kfbh.endian: 1 ; 0x000: 0x01 kfbh.hard: 130 ; 0x001: 0x82 kfbh.type: 6 ; 0x002: KFBTYP_DISKDIR kfbh.datfmt: 1 ; 0x003: 0x01 kfbh.block.blk: 0 ; 0x004: blk=0 kfbh.block.obj: 2 ; 0x008: file=2 kfbh.check: 3293924642 ; 0x00c: 0xc4554d22 kfbh.fcn.base: 28405 ; 0x010: 0x00006ef5 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 kfddde[0].entry.incarn: 3 ; 0x024: A=1 NUMM=0x1 kfddde[0].entry.hash: 0 ; 0x028: 0x00000000 kfddde[0].entry.refer.number:4294967295 ; 0x02c: 0xffffffff kfddde[0].entry.refer.incarn: 0 ; 0x030: A=0 NUMM=0x0 kfddde[0].dsknum: 0 ; 0x034: 0x0000 kfddde[0].state: 2 ; 0x036: KFDSTA_NORMAL kfddde[0].ddchgfl: 132 ; 0x037: 0x84 kfddde[0].dskname: DATA_0000 ; 0x038: length=9 kfddde[0].fgname: DATA_0000 ; 0x058: length=9 kfddde[0].crestmp.hi: 33016111 ; 0x078: HOUR=0xf DAYS=0x9 MNTH=0x2 YEAR=0x7df kfddde[0].crestmp.lo: 3814190080 ; 0x07c: USEC=0x0 MSEC=0x1fb SECS=0x35 MINS=0x38 kfddde[0].failstmp.hi: 0 ; 0x080: HOUR=0x0 DAYS=0x0 MNTH=0x0 YEAR=0x0 kfddde[0].failstmp.lo: 0 ; 0x084: USEC=0x0 MSEC=0x0 SECS=0x0 MINS=0x0 kfddde[0].timer: 0 ; 0x088: 0x00000000 kfddde[0].size: 1019 ; 0x08c: 0x000003fb kfddde[0].srRloc.super.hiStart: 0 ; 0x090: 0x00000000 kfddde[0].srRloc.super.loStart: 0 ; 0x094: 0x00000000 kfddde[0].srRloc.super.length: 0 ; 0x098: 0x00000000 …… |
第0块盘是/dev/asm-data01,我们可以对比盘头的信息,是否有差异:
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 |
[oracle@rac1 log]$ kfed read /dev/asm-data01 kfbh.endian: 1 ; 0x000: 0x01 kfbh.hard: 130 ; 0x001: 0x82 kfbh.type: 1 ; 0x002: KFBTYP_DISKHEAD kfbh.datfmt: 1 ; 0x003: 0x01 kfbh.block.blk: 0 ; 0x004: blk=0 kfbh.block.obj: 2147483648 ; 0x008: disk=0 kfbh.check: 2274119862 ; 0x00c: 0x878c50b6 kfbh.fcn.base: 27832 ; 0x010: 0x00006cb8 kfbh.fcn.wrap: 0 ; 0x014: 0x00000000 kfbh.spare1: 0 ; 0x018: 0x00000000 kfbh.spare2: 0 ; 0x01c: 0x00000000 kfdhdb.driver.provstr: ORCLDISK ; 0x000: length=8 kfdhdb.driver.reserved[0]: 0 ; 0x008: 0x00000000 kfdhdb.driver.reserved[1]: 0 ; 0x00c: 0x00000000 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: 1 ; 0x026: KFDGTP_EXTERNAL kfdhdb.hdrsts: 3 ; 0x027: KFDHDR_MEMBER kfdhdb.dskname: DATA_0000 ; 0x028: length=9 kfdhdb.grpname: DATA ; 0x048: length=4 kfdhdb.fgname: DATA_0000 ; 0x068: length=9 kfdhdb.capname: ; 0x088: length=0 kfdhdb.crestmp.hi: 33016111 ; 0x0a8: HOUR=0xf DAYS=0x9 MNTH=0x2 YEAR=0x7df kfdhdb.crestmp.lo: 3814190080 ; 0x0ac: USEC=0x0 MSEC=0x1fb SECS=0x35 MINS=0x38 kfdhdb.mntstmp.hi: 33021547 ; 0x0b0: HOUR=0xb DAYS=0x13 MNTH=0x7 YEAR=0x7df kfdhdb.mntstmp.lo: 785752064 ; 0x0b4: USEC=0x0 MSEC=0x168 SECS=0x2d MINS=0xb kfdhdb.secsize: 512 ; 0x0b8: 0x0200 kfdhdb.blksize: 4096 ; 0x0ba: 0x1000 kfdhdb.ausize: 1048576 ; 0x0bc: 0x00100000 kfdhdb.mfact: 113792 ; 0x0c0: 0x0001bc80 kfdhdb.dsksize: 1019 ; 0x0c4: 0x000003fb kfdhdb.pmcnt: 2 ; 0x0c8: 0x00000002 kfdhdb.fstlocn: 1 ; 0x0cc: 0x00000001 kfdhdb.altlocn: 2 ; 0x0d0: 0x00000002 kfdhdb.f1b1locn: 447 ; 0x0d4: 0x000001bf kfdhdb.redomirrors[0]: 0 ; 0x0d8: 0x0000 kfdhdb.redomirrors[1]: 65535 ; 0x0da: 0xffff kfdhdb.redomirrors[2]: 65535 ; 0x0dc: 0xffff kfdhdb.redomirrors[3]: 65535 ; 0x0de: 0xffff kfdhdb.dbcompat: 186646528 ; 0x0e0: 0x0b200000 kfdhdb.grpstmp.hi: 33005974 ; 0x0e4: HOUR=0x16 DAYS=0xc MNTH=0x8 YEAR=0x7de kfdhdb.grpstmp.lo: 3913823232 ; 0x0e8: USEC=0x0 MSEC=0x20d SECS=0x14 MINS=0x3a kfdhdb.vfstart: 0 ; 0x0ec: 0x00000000 kfdhdb.vfend: 0 ; 0x0f0: 0x00000000 kfdhdb.spfile: 0 ; 0x0f4: 0x00000000 |
我的磁盘目前是正常的情况。在异常的情况下,可能会因为disk dir和disk header信息不一致,导致ora-15042 无法mount asm。
1 2 3 4 5 6 7 |
disk directory , kfddde[3].crestmp.hi: 32989455 ; 0x5b8: HOUR=0xf DAYS=0x8 MNTH=0x8 YEAR=0x7dd kfddde[3].crestmp.lo: 942520320 ; 0x5bc: USEC=0x0 MSEC=0x36e SECS=0x2 MINS=0xe ASM disk header level value was, kfdhdb.crestmp.hi: 32989458 ; 0x0a8: HOUR=0x12 DAYS=0x8 MNTH=0x8 YEAR=0x7dd kfdhdb.crestmp.lo: 2350652416 ; 0x0ac: USEC=0x0 MSEC=0x307 SECS=0x1 MINS=0x23 <<<<<<<<<<<<<< |
我们可以用kfed修改一下之后,再merge进去,然后在mount起来,再运行check all norepair检查该diskgroup,没问题后,就可以起到数据库了。