Oracle RAC集群的存储层依赖ASM(Automatic Storage Management)来管理磁盘,数据库文件不再直接落在文件系统上,而是存放在一个个ASM磁盘组里。日常运维中,DBA最常问的几个问题无非是:磁盘组还剩多少空间?某块盘挂在哪个组上?新加的盘为什么ASM识别不到?这些问题在sqlplus里查视图当然可以,但asmcmd工具提供的lsdg和lsdsk命令更快更直观,本文结合实际使用场景详细讲解这两个命令。

一、asmcmd工具的进入方式与基本环境
asmcmd是一个操作系统层面的命令行工具,它通过连接ASM实例来执行操作。在RAC环境下,登录到任意一个节点的grid用户下即可使用。进入之前需要先设置好环境变量,确认ORACLE_SID指向的是ASM实例而不是数据库实例,这一点非常关键。单节点数据库的SID通常是orcl这类名字,而ASM实例的SID在RAC中一般是+ASM1、+ASM2这种带节点号的格式。
如果直接在grid用户下敲asmcmd报错,多半是环境变量没配对。可以先执行echo $ORACLE_SID确认当前SID,再通过asmcmd -p进入交互模式,-p参数会在提示符前显示当前路径,比如+DATA/racdb,方便定位当前位置。进入后看到的目录结构类似+DATA、+FRA这样的磁盘组挂载点,可以用cd和ls像操作普通目录一样浏览。
-- 在grid用户下切换环境并进入asmcmd export ORACLE_SID=+ASM1 asmcmd -p ASMCMD> lsdg ASMCMD> exit
除了交互模式,asmcmd也支持一次性执行,格式为asmcmd lsdg或asmcmd lsdsk,适合写进shell脚本做定时巡检。需要注意的是,asmcmd必须在grid用户(或者说ASM软件的属主)下运行,用oracle用户执行可能会遇到权限错误,这是新手最常踩的坑之一。
二、lsdg命令详解:磁盘组状态一目了然
lsdg用来列出磁盘组的详细信息,不带任何参数执行时会显示所有已挂载的磁盘组。输出中最需要关注几列:State列显示磁盘组状态,正常应该是MOUNTED,如果出现DISMOUNTED说明该节点上组没有被挂载;Type列是冗余类型,EXTERN表示外部冗余、NORMAL是正常冗余、HIGH是高冗余;Total_MB和Free_MB分别代表总空间和剩余空间,单位是MB。
ASMCMD> lsdg State Type Rebal Sector Block AU Total_MB Free_MB Req_mir_Free_MB Usable_file_MB Offline_disks Voting_files Name MOUNTED EXTERN N 512 4096 1048576 2048000 356782 0 356782 0 Y DATA/ MOUNTED NORMAL N 512 4096 1048576 512000 88432 51200 18616 0 N FRA/
这里有一个容易被忽视的细节:Req_mir_Free_MB和Usable_file_MB这两列。在NORMAL冗余的组里,ASM会预留一部分空间用于镜像恢复,所以Free_MB并不等于真正可用的空间。Usable_file_MB才是扣除镜像开销后实际能写入的容量,规划空间时务必以这个数字为准,否则按Free_MB做容量预估,实际写入量到了一半就可能报ORA-15041错误。
lsdg还支持按组名过滤,比如lsdg DATA只看DATA组的信息,也可以配合-g参数显示更详细的统计信息。如果发现某个组的Offline_disks大于0,说明有磁盘离线了,这时需要立即用lsdsk配合排查是哪块盘出了问题,避免冗余空间耗尽导致组被强制卸载。
三、lsdsk命令详解:定位磁盘与排查问题
lsdsk用来查看ASM磁盘层面的信息,直接执行会列出当前节点可见的所有ASM磁盘,包括磁盘路径、模式、状态和所属磁盘组。输出中的Header_Status列很关键,它反映磁盘头部的状态,常见的取值有几种:MEMBER表示该盘已经是某个磁盘组的成员;CANDIDATE表示是候选盘,可以被添加到组里;FORMER表示这块盘曾经属于某个组但已被删除;PROVISIONED通常出现在ASMLIB或UDEV管理的场景,表示已配置但尚未加入组。
ASMCMD> lsdsk Path /dev/sdb1 /dev/sdc1 /dev/sdd1
默认输出很简洁,只有路径。想看详细信息需要加-k参数,它会显示磁盘大小、空闲空间、头部状态、所属组名等;-g参数则从V$ASM_DISK视图读取全局信息,能看到所有节点对该盘的可见情况,这在RAC多节点排查共享存储问题时特别有用。
ASMCMD> lsdsk -k -g Total_MB Free_MB OS_MB Name Failgroup Failgroup_Type LibLabel Product Redund Path Mode_S State Header_Status 102400 0 102400 DATA_0000 DATA_0000 REGULAR 0.0 UNKNOWN /dev/sdb1 ONLINE NORMAL MEMBER 102400 356782 102400 DATA_0001 DATA_0001 REGULAR 0.0 UNKNOWN /dev/sdc1 ONLINE NORMAL MEMBER 102400 0 102400 DATA_0002 DATA_0002 REGULAR 0.0 UNKNOWN /dev/sdd1 ONLINE NORMAL MEMBER
实际排障时,lsdsk最常见的用途有两个。第一是加盘前确认新盘状态,如果一块新扫出来的盘Header_Status显示为MEMBER,说明它的磁盘头还残留旧组信息,直接加盘会失败,需要先用dd清掉磁盘头或者用alter diskgroup ... drop disk在原组中正常删除。第二是判断节点间的磁盘可见性,如果节点1上lsdsk能看到某块盘而节点2上看不到,问题基本出在多路径配置、UDEV规则或SAN的zoning上,而不是ASM本身。
另外还有一个组合参数lsdsk -d DATA,可以只列出属于DATA组的磁盘,配合-p还能显示更完整的列信息。对于使用ASMLIB的环境,还可以用lsdsk --candidate只看候选盘,快速找出可用的空闲资源。
四、典型运维场景与注意事项
场景一:磁盘组使用率超过90%需要扩容。先用lsdg确认目标组的Usable_file_MB,再用lsdsk -k查看有没有CANDIDATE状态的空闲盘,确认路径无误后执行加盘SQL,加完观察Rebal列为Y表示正在重新平衡,等它变回N扩容才算完成。场景二:某节点数据库无法启动,报无法挂载磁盘组。此时在该节点执行lsdg看State是否为DISMOUNTED,再用lsdsk -g检查磁盘在该节点的可见性,逐层往下排查存储链路。
使用这两个命令时有几点提醒:一是lsdsk看到的磁盘路径在不同节点可能因多路径软件不同而显示不同,比如节点1显示/dev/sdb1,节点2显示/dev/mapper/mpathb,只要指向同一块物理盘就没问题;二是执行asmcmd相关命令会连到ASM实例,如果grid的profile环境变量混乱,可能出现连到错误实例的情况,建议每次先确认ORACLE_SID;三是巡检脚本中可以把lsdg输出做简单解析,对Free_MB低于阈值的组提前告警,比等业务报错再处理从容得多。掌握lsdg看组、lsdsk看盘这个基本分工,RAC存储层的日常管理就有了清晰的抓手。
Oracle RACASM磁盘组asmcmd修改时间:2026-09-10 13:18:38