由于ASM的管理相对复杂,Oracle提供了一系列的工具用户帮助用户理解ASM,并且在出现问题之后,可以通过这些工具进行故障诊断和分析。
Kfed工具
对于Oracle 10gR2版本,可以通过使用如下步骤获得kfed工具:
cd $ORACLE_HOME/rdbms/lib make -f ins_rdbms.mk ikfed
以下是可能的编译输出(来自Oracle 10gR2+Linux环境):
[root@danaly ~]# su - oracle [oracle@danaly ~]$ cd $ORACLE_HOME/rdbms/lib [oracle@danaly lib]$ make -f ins_rdbms.mk ikfed Linking KFED utility (kfed) rm -f /opt/oracle/product/10.2.0/rdbms/lib/kfed gcc -o /opt/oracle/product/10.2.0/rdbms/lib/kfed ... mv -f /opt/oracle/product/10.2.0/bin/kfed /opt/oracle/product/10.2.0/bin/kfedO mv: cannot stat `/opt/oracle/product/10.2.0/bin/kfed': No such file or directory make: [ikfed] Error 1 (ignored) mv /opt/oracle/product/10.2.0/rdbms/lib/kfed /opt/oracle/product/10.2.0/bin/kfed chmod 751 /opt/oracle/product/10.2.0/bin/kfed [oracle@danaly lib]$ which kfed ~/product/10.2.0/bin/kfed
Kfed的常用参数有:
[oracle@bossdb-rac2 lib]$ kfed -help as/mlib ASM Library [asmlib='lib'] aun/um AU number to examine or update [AUNUM=number] aus/z Allocation Unit size in bytes [AUSZ=number] blkn/um Block number to examine or update [BLKNUM=number] blks/z Metadata block size in bytes [BLKSZ=number] ch/ksum Update checksum before each write [CHKSUM=YES/NO] cn/t Count of AUs to process [CNT=number] d/ev ASM device to examine or update [DEV=string] o/p KFED operation type [OP=READ/WRITE/MERGE/NEW/FORM/FIND/STRUCT] p/rovnm Name for provisioning purposes [PROVNM=string] s/eek AU number to seek to [SEEK=number] te/xt File name for translated block text [TEXT=string] ty/pe ASM metadata block type number [TYPE=number]
通过以上帮助说明,可以看到kfed支持对于ASM信息的READ/WRITE/MERGE/ NEW/FORM/FIND/STRUCT等操作,实际上是非常完备了。
通过read指令可以读取ASM磁盘头的元数据信息:
[oracle@danaly ~]$ kfed read /dev/oracleasm/disks/VOL6 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: T=0 NUMB=0x0 kfbh.block.obj: 2147483652 ; 0x008: TYPE=0x8 NUMB=0x4 kfbh.check: 863027707 ; 0x00c: 0x3370c1fb ………… kfdhdb.grptyp: 1 ; 0x026: KFDGTP_EXTERNAL kfdhdb.hdrsts: 3 ; 0x027: KFDHDR_MEMBER kfdhdb.dskname: VOL6 ; 0x028: length=4 kfdhdb.grpname: ORADG ; 0x048: length=5 kfdhdb.fgname: VOL6 ; 0x068: length=4 kfdhdb.capname: ; 0x088: length=0 kfdhdb.crestmp.hi: 32868906 ; 0x0a8: HOUR=0xa DAYS=0x11 MNTH=0x2 YEAR=0x7d6 kfdhdb.crestmp.lo: 1770533888 ; 0x0ac: USEC=0x0 MSEC=0x20d SECS=0x18 MINS=0x1a kfdhdb.mntstmp.hi: 32884629 ; 0x0b0: HOUR=0x15 DAYS=0x1c MNTH=0x1 YEAR=0x7d7 kfdhdb.mntstmp.lo: 1934266368 ; 0x0b4: USEC=0x0 MSEC=0x2a4 SECS=0x34 MINS=0x1c ……… kfdhdb.redomirrors[3]: 0 ; 0x0de: 0x0000 kfdhdb.dbcompat: 168820736 ; 0x0e0: 0x0a100000 kfdhdb.grpstmp.hi: 32875626 ; 0x0e4: HOUR=0xa DAYS=0x3 MNTH=0x9 YEAR=0x7d6 kfdhdb.grpstmp.lo: 3477741568 ; 0x0e8: USEC=0x0 MSEC=0x288 SECS=0x34 MINS=0x33 ………………
Kfed的write功能还可以向磁盘组写入元数据,用于特殊的故障恢复。
KFOD工具
在系统级别,Oracle还提供一个KFOD工具,用于列举搜索磁盘,在ASM实例启动之后,这些信息可以通过视图提供。
[oracle@db210-rac1 oracle]$ kfod -h _asm_a/llow_only_raw_disks KFOD allow only raw devices [_asm_allow_only_raw_disks=TRUE/(FALSE)] _asm_l/ibraries ASM Libraries[_asm_libraries='lib1','lib2',...] _asms/id ASM Instance[_asmsid=sid] a/sm_diskstring ASM Diskstring [asm_diskstring='discoverystring', 'discoverystring' ...] d/isks Disks to discover [disks=raw,asm,all] g/roup Group discover [group=controlfile] n/ohdr KFOD header suppression [nohdr=TRUE/(FALSE)] o/p KFOD options type [OP=DISKS/GROUPS/ALL] p/file ASM parameter file [pfile='parameterfile'] s/tatus Include disk header status [status=TRUE/(FALSE)] v/erbose KFOD verbose errors [verbose=TRUE/(FALSE)]
可以用以下命令查询磁盘状态信息:
[oracle@db210-rac1 oracle]$ kfod disks=all status=true -------------------------------------------------------------------------------- Disk Size Header Path ================================================================================ 1: 15360 Mb MEMBER /dev/rdsk/asmdata 2: 200 Mb CANDIDATE /dev/rdsk/asmspfile 3: 200 Mb FOREIGN /dev/rdsk/emcpower0b 4: 200 Mb FOREIGN /dev/rdsk/emcpower0d 5: 200 Mb FOREIGN /dev/rdsk/emcpower0e 6: 5120 Mb MEMBER /dev/rdsk/emcpower1d 7: 200 Mb FOREIGN /dev/rdsk/emcpower2d 8: 200 Mb FOREIGN /dev/rdsk/emcpower2e 9: 200 Mb CANDIDATE /dev/rdsk/emcpower2f 10: 4096 Mb CANDIDATE /dev/rdsk/emcpower2h 11: 200 Mb FOREIGN /dev/rdsk/ocr1 12: 200 Mb FOREIGN /dev/rdsk/ocr2 13: 200 Mb FOREIGN /dev/rdsk/voting 14: 200 Mb FOREIGN /dev/rdsk/voting1 -------------------------------------------------------------------------------- ORACLE_SID ORACLE_HOME ================================================================================ +ASM1 /opt/oracle/product/10.2.0/db10g +ASM2 /opt/oracle/product/10.2.0/db10g
AMDU工具
在Oracle 10g中,ASM磁盘组的信息需要在Mount之后才能通过内部视图查询,如果磁盘组因为故障无法正常加载,那么信息将不可用,这为诊断带来了诸多不便。
从Oracle 11g开始,Oracle提供了一个工具AMDU用于协助诊断,通过这个工具可以在磁盘组加载之前将ASM的元数据抽取出来,用于数据库诊断,这个工具可以向后兼容,引入到10g中。
通过amdu –h可以查看详细的帮助说明,缺省的调用amdu,会自动生成一个以时间命名的目录,该目录下生成的报告文件会记录磁盘组的相关信息:
[oracle@enmou1 ~]$ amdu amdu_2011_03_29_10_28_41/ [oracle@enmou1 ~]$ cd amdu_2011_03_29_10_28_41/ [oracle@enmou1 amdu_2011_03_29_10_28_41]$ ls report.txt
该报告的主要内容如下:
[oracle@enmou1 amdu_2011_03_29_10_28_41]$ more report.txt -*-amdu-*- ******************************* AMDU Settings ******************************** ORACLE_HOME = /u01/app/db/11.2.0 System name: Linux Node name: enmou1 Release: 2.6.18-128.el5 Version: #1 SMP Wed Dec 17 11:41:38 EST 2008 Machine: x86_64 amdu run: 29-MAR-11 10:28:41 Endianess: 1 --------------------------------- Operations --------------------------------- ********************************* DISCOVERY ********************************** ----------------------------- DISK REPORT N0001 ------------------------------ Disk Path: ORCL:VOL1 Unique Disk ID: Disk Label: VOL1 Physical Sector Size: 512 bytes Disk Size: 1954 megabytes Group Name: CRSDG Disk Name: VOL1 Failure Group Name: VOL1 Disk Number: 0 Header Status: 3 Disk Creation Time: 2011/03/17 11:39:10.772000 Last Mount Time: 2011/03/29 09:21:38.608000 Compatibility Version: 0x0b200000(11020000) Disk Sector Size: 512 bytes Disk size in AUs: 1954 AUs Group Redundancy: 1 Metadata Block Size: 4096 bytes -〉元数据块大小,4K AU Size: 1048576 bytes -〉AU大小:1M Stride: 113792 AUs Group Creation Time: 2011/03/17 11:39:10.671000 File 1 Block 1 location: AU 2 -〉文件使用,从AU 2开始 OCR Present: NO ******************************* END OF REPORT ********************************
定义特定的参数可以获得ASM磁盘组内部的区间分配等详细信息。以下命令指定转储CRSDG的磁盘组信息,除了报告文件外,还生成了map和img信息文件:
[oracle@enmou1 ~]$ amdu -diskstring '/dev/oracleasm/disks/VOL*' -dump 'CRSDG' amdu_2011_03_29_10_36_03/ [oracle@enmou1 ~]$ cd amdu_2011_03_29_10_36_03/ [oracle@enmou1 amdu_2011_03_29_10_36_03]$ ls CRSDG_0001.img CRSDG.map report.txt
这里MAP文件的信息如下,其内容描述了ASM元数据在磁盘组中的位置,最后部分就是指针信息:
[oracle@enmou1 amdu_2011_03_29_10_36_03]$ more CRSDG.map N0001 D0000 R00 A00000000 F00000000 I0 E00000000 U00 C00256 S0001 B0000000000 N0001 D0000 R00 A00000001 F00000000 I0 E00000000 U00 C00256 S0001 B0001048576 N0001 D0000 R00 A00000002 F00000001 I0 E00000000 U00 C00256 S0001 B0002097152 N0001 D0000 R00 A00000003 F00000002 I0 E00000000 U00 C00256 S0001 B0003145728 N0001 D0000 R00 A00000004 F00000003 I0 E00000000 U00 C00256 S0001 B0004194304
而IMG文件则是元数据块的镜像转储,为2进制文件,这些文件在ASM出现故障时,可以用于收集信息,分析故障。