在Oracle RAC集群的日常维护中,查看ASM磁盘组的使用情况是高频操作。使用asmcmd工具执行ls -l命令能够一次列出磁盘组的名称、冗余类型、总容量、剩余空间、所需的镜像保护空间以及当前挂载状态。Windows环境下,这个工具实际对应的是Grid Infrastructure安装目录下的asmcmd.exe,例如C:\app\19.0.0\grid\bin\asmcmd.exe。直接运行该命令不会影响数据库实例,也不需要登录SQL*Plus,适合在巡检脚本或人工排查时快速获取存储层信息。

一、ls -l输出字段的详细含义
执行ls -l后,输出通常分为多列。以常见的ASM版本为例,除了Name列表示磁盘组或目录名外,Type列表示冗余级别,EXTERN表示外部冗余,磁盘组不提供ASM层面的镜像;NORMAL表示正常冗余,需要至少两个故障组;HIGH表示高冗余,要求三个故障组。Total_MB和Free_MB分别显示磁盘组总容量和当前剩余容量,而Required_Mirror_Free_MB则是为了满足镜像策略而预留的空间。也就是说,如果某个磁盘组采用NORMAL冗余,当一块磁盘离线时,ASM要能够完成重新镜像,所需的空间就是从这一列扣除的。
比较容易被误解的是Usable_file_MB。它并不是直接拿Free_MB减去镜像预留空间那么简单。ASM在计算可提供给数据库文件的空间时,还会考虑故障组之间的不平衡程度。因此在某些文档中,Usable_file_MB可能会比Free_MB小很多,甚至接近零。这个字段更适合用来判断新建数据文件或恢复操作是否有足够空间,而不应只看Free_MB。State列标识磁盘组当前是MOUNTED、CONNECTED还是DISMOUNTED,RAC集群中只有所有节点都能MOUNT的磁盘组才能在对应节点上提供存储服务。
下面是一个典型的输出示例:
ASMCMD> ls -l Name Type Rebal Total_MB Free_MB Required_Mirror_Free_MB Usable_file_MB Voting_files State DATA/ EXTERN N 102400 80000 0 80000 N MOUNTED OCR_VOTE/ NORMAL N 20480 10240 5120 2560 Y MOUNTED FRA/ EXTERN N 51200 10000 0 10000 N MOUNTED
输出中的Rebal列表示磁盘组是否正在进行重新平衡操作,N为否,Y为是。如果看到Y,说明磁盘组正在做数据重分布,此时应避免大量写入或删除操作,以免延长平衡时间。Voting_files为Y的磁盘组表示其中存放了集群投票文件,这类磁盘组在维护时需要特别小心,不能随意卸载。
二、Windows环境中定位asmcmd并执行命令
Windows下的Oracle Grid Infrastructure安装目录与Linux不同,通常安装在类似C:\app\19.0.0\grid的位置,而asmcmd.exe就位于该目录的bin子目录中。如果已经在安装过程中将bin目录加入系统PATH,那么可以直接在命令提示符中输入asmcmd;如果没有,则需要先通过cd /d命令切换到对应目录。以管理员身份打开命令提示符,设置ORACLE_HOME和ORACLE_SID是避免出现环境异常的关键,因为asmcmd需要连接到本地的ASM实例。
set ORACLE_HOME=C:\app\19.0.0\grid set ORACLE_SID=+ASM1 cd /d C:\app\19.0.0\grid\bin asmcmd ls -l
这里设置的ORACLE_SID需要与当前节点上的ASM实例名一致,RAC集群中每个节点通常对应+ASM1、+ASM2等实例。如果不确定本机ASM实例名,可以在服务列表中找到OracleASMService开头的服务,或者使用C:\app\19.0.0\grid\bin\srvctl status asm -n 主机名来确认。值得注意的是,即使ORACLE_SID设置错了,asmcmd也可能报出连接失败或权限错误,而不会给出明确提示,因此环境变量检查应当成为排查第一步。
另外,在Windows的命令行中,反斜杠在路径里是普通字符,不需要像某些脚本语言那样进行转义。直接写C:\app\19.0.0\grid\bin\asmcmd即可。如果确实不想频繁设置变量,可以创建一个批处理脚本,将上述命令固化下来,放在固定的维护目录中,例如C:\scripts\check_asm.bat。
三、结合RAC集群状态进行磁盘组排查
在RAC集群中查看ASM磁盘组时,单看asmcmd的输出还不够,需要结合集群资源状态确认磁盘组在各节点是否都正常挂载。可以在任意节点执行C:\app\19.0.0\grid\bin\crsctl status resource -t,观察ora.DATA.dg、ora.FRA.dg等资源是否处于ONLINE状态。如果某个节点上的ASM实例没有启动,或者磁盘组资源在某个节点处于OFFLINE,那么该节点上的数据库实例可能会无法打开数据文件,甚至导致实例崩溃。
常见的故障场景是:管理员在节点一执行asmcmd ls -l看到磁盘组State为MOUNTED,但在节点二却提示无法连接到ASM实例或磁盘组不可见。这时应首先确认节点二的ORACLE_SID是否填写正确,以及Grid Infrastructure服务是否正常启动。例如使用C:\app\19.0.0\grid\bin\crsctl check cluster来查看集群状态,再用C:\app\19.0.0\grid\bin\srvctl status asm -n 节点二检查该节点ASM实例的运行情况。很多时候问题并不是磁盘组损坏,而是环境变量或监听配置导致asmcmd连到了错误的实例。
C:\app\19.0.0\grid\bin\crsctl check cluster C:\app\19.0.0\grid\bin\srvctl status asm -n racnode2 C:\app\19.0.0\grid\bin\crsctl status resource -t
此外,当磁盘组空间不足时,ls -l中的Usable_file_MB会快速下降,此时应结合数据库告警日志和视图V$ASM_DISKGROUP进一步确认。虽然asmcmd的输出足够直观,但在自动化监控中,还是建议通过SQL查询ASM实例获取更结构化的数据。Windows环境下可以使用sqlplus以sysasm身份登录,执行select name, total_mb, free_mb, usable_file_mb from v$asm_diskgroup;。不过如果只想快速看一眼各磁盘组健康度,asmcmd ls -l依然是最直接的选择。

