简单写了一个查询asm disk directory。
我们一般在asm磁盘mount不了的时候,需要检查磁盘头的信息,有时候盘头的信息会和disk directory的信息不一致,需要手工的修改disk dir或者盘头的信息。
由于找disk dir有点麻烦,需要先找到file 1 block 1,找到file dir,再去找disk dir,如果磁盘多,这个过程会有点麻烦,因此写了个脚本,可以指示如何去找disk dir。
脚本见附件。脚本运行完之后,会在当前目录下产生一个以时间戳结尾的chk_result文件。输出类似结果如下:
[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的信息:
[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,我们可以对比盘头的信息,是否有差异:
[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。
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,没问题后,就可以起到数据库了。
附件:asm_disk_dir_loc.zip