查找已删除 ASMLIB 磁盘的脚本
如果 ASMLIB 磁盘已被删除,则它不会显示在 /dev/oracleasm/disks 中。
我们可以使用以下 shell 脚本检查与 ASM(LIB) 相关联(或者曾经)的设备:
#!/bin/bash GRID_HOME=`cat /etc/oratab | grep ^+ASM | awk -F":" '{print }'` for device in `ls /dev/sd*` do asmdisk=`$GRID_HOME/bin/kfed read $device | grep ORCL | tr -s ' ' | cut -f2 -d' ' | cut -c1-4` if [ "$asmdisk" = "ORCL" ] then echo "Disk device $device may be an ASM disk" fi done
这些脚本查看 /dev 中的 sd 设备。
该脚本需要以特权用户身份运行。
当然,我们可以查看 /dev/dm*、/dev/mapper 等或者 /dev 中的所有设备,尽管这可能不是一个好主意。
在 ASM 磁盘上读取 kfed 示例:
./kfed read /dev/dm-7 | grep ORCL kfdhdb.driver.provstr:ORCLDISKTESTDB_ARCH_08 ; 0x000: length=23
注意:kfed 二进制文件应该在 RDBMS 主页(11.2 版之前)和 Grid Infrastructure 主页(11.2 版及更高版本)中可用。
出于本文的目的,我假设 Grid Infrastructure 版本为 11.2 或者更高版本。
不用 kfed 也可以使用这样的脚本来实现相同的效果:
#!/bin/bash for device in `ls /dev/sd*` do asmdisk=`od -c $device | head | grep 0000040 | tr -d ' ' | cut -c8-11` if [ "$asmdisk" = "ORCL" ] then echo "Disk device $device may be an ASM disk" fi done
od 命令以八进制和其他格式转储文件。
-c 选项是选择 ASCII 字符或者反斜杠转义。
将 ASM 磁盘映射到物理磁盘的脚本
这是来自 oracle 的一个小脚本(我稍微修改了它以包含 kfed 命令的路径)。
该脚本可以作为 root 或者任何其他用户(oracle 或者 grid)运行。
#!/bin/bash ## ASMLIB_DISK -- disk name in ASMLIB ## ASM_DISK -- disk name in ASM ## DEVICE -- physical disk name GRID_HOME=`cat /etc/oratab | grep ^+ASM | awk -F":" '{print }'` for ASMLIB_DISK in `ls /dev/oracleasm/disks/*` do ASM_DISK=`$GRID_HOME/bin/kfed read $ASMLIB_DISK | grep dskname | tr -s ' '| cut -f2 -d' '` majorminor=`ls -l $ASMLIB_DISK | tr -s ' ' | cut -f5,6 -d' '` device=`ls -l /dev/ | tr -s ' ' | grep -w "$majorminor" | cut -f10 -d' '` echo "ASMLIB disk name : $ASMLIB_DISK" echo "ASM_DISK name : $ASM_DISK" echo "Physical disk device : /dev/$device" done
上述脚本的示例输出:
# ./asm_device_mapping.sh ASMLIB disk name : DATA_01 ASM_DISK name : DATA_01 Physical disk device : /dev/dm-6476 ASMLIB disk name : DATA_02 ASM_DISK name : DATA_02 Physical disk device : /dev/dm-6473 ...
查找 asmlib 磁盘名和 asm 磁盘名
默认情况下,当我们使用 oracleasm scandisks 扫描磁盘时,相应的磁盘设备文件(ASMLIB 磁盘名称)存储在路径 /dev/oracleasm/disks 中。
例如 :
# ls -lrt /dev/oracleasm/disks total 0 brw-rw---- 1 oracle oinstall 201, 40112 Oct 3 11:08 REDO_1 brw-rw---- 1 oracle oinstall 201, 31232 Oct 3 11:08 REDO_2 brw-rw---- 1 oracle oinstall 201, 15408 Oct 3 11:09 DATA_1 brw-rw---- 1 oracle oinstall 201, 6336 Oct 3 11:09 DATA_2 brw-rw---- 1 oracle oinstall 201, 62432 Oct 3 11:09 DATA_3 ...
我们可以使用 ASM 实用程序 kfed 读取磁盘头并获取 ASM 磁盘组中正在使用的磁盘名称。
例如 :
export ORACLE_HOME=[grid home] # cd $ORACLE_HOME/bin # ./kfed read /dev/dm-17 .... kfdhdb.dsknum: 0 ; 0x024: 0x0000 kfdhdb.grptyp: 1 ; 0x026: KFDGTP_EXTERNAL kfdhdb.hdrsts: 3 ; 0x027: KFDHDR_MEMBER kfdhdb.dskname: DATADG_DISK01 ; 0x028: length=19 kfdhdb.grpname: DATADG ; 0x048: length=14 kfdhdb.fgname: DATADG_DISK01 ; 0x068: length=19 ....
如上所示,我们可以 grep for dskname ,以获取 ASM 磁盘名称。
ASMLIB 是 Oracle 数据库的自动存储管理 (ASM) 特性的支持库,可用于 Linux 操作系统。
当 ASMLIB 用于管理 ASM 磁盘时,设备路径信息不会出现在 GV$ASM_DISK.PATH 中。
这篇文章展示了如何获取与 ASMLIB 磁盘名称关联的物理磁盘设备名称。
查找物理磁盘设备
从命令“ls -lrt /dev/oracleasm/disks”的输出中我们得到主要和次要编号,可用于查找与asm磁盘对应的物理设备。
例如 :
# ls -lrt /dev/oracleasm/disks/DATA_1 brw-rw---- 1 oracle oinstall 201, 15408 Oct 3 11:09 DATA_1
从上面的输出 grep 目录 /dev 中的主要、次要编号 201、15408 以获取物理设备。
# ls -lrt /dev/ | grep "201,15408" brw------- 1 root root 201, 15408 Oct 3 10:48 dm-17