查找已删除 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 字符或者反斜杠转义。

on it road .com

将 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 磁盘名称。

Oracle ASM 将物理磁盘设备映射到 ASMLIB 磁盘

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
日期:2020-09-17 00:11:50 来源:oir作者:oir