当ASM磁盘组无法MOUNT之时如何找到对应的物理磁盘?
程序员文章站
2022-04-16 19:24:18
...
如果数据存放于ASM磁盘组之上,当ASM磁盘组无法MOUNT起来,则意味着无法打开数据库。我们假设磁盘头部没有损坏,只是盘符变了,但无法正确设置ASM_DISKSTRING参数。 实验环境: RHEL5 + ORACLE10.2.0.4RAC+RAW+ASM 通过此次实验你将掌握以下知识点: 1. 初步
如果数据存放于ASM磁盘组之上,当ASM磁盘组无法MOUNT起来,则意味着无法打开数据库。我们假设磁盘头部没有损坏,只是盘符变了,但无法正确设置ASM_DISKSTRING参数。
实验环境: RHEL5 + ORACLE10.2.0.4RAC+RAW+ASM
通过此次实验你将掌握以下知识点:
1. 初步了解如何使用ORACLE两款内部工具amdu/kfed
2. 在ASM磁盘组无法MOUNT的情况下,如何对应物理磁盘和ASMDISK的关系
3. 当ASM_DISKSTRING设置不全时,如何补全并将磁盘组MOUNT起来。
SQL> ALTER DISKGROUP ALL MOUNT Sat Nov 29 22:15:09 2014 NOTE: cache registered group DATA number=1 incarn=0x5bc84523 Sat Nov 29 22:15:09 2014 NOTE: Hbeat: instance first (grp 1) Sat Nov 29 22:15:13 2014 NOTE: start heartbeating (grp 1) NOTE: cache opening disk 0 of grp 1: DATA_0000 path:/dev/raw/raw3下面我们取消raw3,raw4裸设备的定义,重启操作系统...
SQL> alter diskgroup all mount; alter diskgroup all mount * ERROR at line 1: ORA-15032: not all alterations performed ORA-15063: ASM discovered an insufficient number of disks for diskgroup "DATA" SQL> alter system set asm_diskstring='/dev/sdd1'; alter diskgroup data mount; alter diskgroup data mount * ERROR at line 1: ORA-15032: not all alterations performed ORA-15040: diskgroup is incomplete ORA-15042: ASM disk "1" is missing截取部分report.txt内容:
----------------------------- DISK REPORT N0010 ------------------------------ Disk Path: /dev/sdd1 Unique Disk ID: Disk Label: Physical Sector Size: 512 bytes Disk Size: 1019 megabytes Group Name: DATA Disk Name: DATA_0000 Failure Group Name: DATA_0000 Disk Number: 0 Header Status: 3 Disk Creation Time: 2014/11/05 12:55:10.506000 Last Mount Time: 2014/11/29 23:14:47.663000 Compatibility Version: 0x0a100000 Disk Sector Size: 512 bytes Disk size in AUs: 1019 AUs Group Redundancy: 1 Metadata Block Size: 4096 bytes AU Size: 1048576 bytes Stride: 113792 AUs Group Creation Time: 2014/11/05 12:55:10.486000 File 1 Block 1 location: AU 2 ----------------------------- DISK REPORT N0012 ------------------------------ Disk Path: /dev/sde1结合以上信息,使用KFED再次确认:
[oracle@dwdb1 tmp]$ kfed read /dev/sde1 |more 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: 2147483649 ; 0x008: TYPE=0x8 NUMB=0x1 kfbh.check: 1289251580 ; 0x00c: 0x4cd86afc 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: 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: 168820736 ; 0x020: 0x0a100000 kfdhdb.dsknum: 1 ; 0x024: 0x0001 kfdhdb.grptyp: 1 ; 0x026: KFDGTP_EXTERNAL kfdhdb.hdrsts: 3 ; 0x027: KFDHDR_MEMBER 这样,就可以确定disk1就为/dev/sde1了 SQL> alter system set asm_diskstring='/dev/sdd1','/dev/sde1'; System altered. SQL> alter diskgroup data mount; Diskgroup altered.接下来就可以启动数据库了。
以上简单地使用了AMDU/KFED命令,这两款具都可以实现在ASM磁盘组无法MOUNT的情况下对磁盘读写,其中KFED命令还可以用于磁盘头部的修复(10.2.5.0以上的数据库全有自动备份),还可以做异常恢复:从ASM磁盘直接恢复数据文件,总之也是个非常强大的工具。