Oracle RAC集群中,ASM磁盘组一旦出现error count持续增长,通常比数据文件损坏更隐蔽,因为它不会立即导致SQL报错,而是通过I/O重试、性能抖动和节点驱逐逐渐暴露出来。error count并不是一个单独的ASM磁盘组属性,而是分布在多个动态性能视图和日志中的错误统计,理解它的来源和聚合方式,是避免RAC节点被错误踢出的第一步。

一、error count在ASM体系中的具体位置
在Oracle ASM中,磁盘组本身没有名为error count的列,真正的读错误和写错误记录在 v$asm_disk 视图的 READ_ERRS 和 WRITE_ERRS 列中。这两个指标分别表示ASM实例从对应物理磁盘读取数据时遇到的I/O错误次数,以及写入时发生的错误次数。只有当错误累计到一定程度,ASM才会将磁盘标记为离线或强制卸载磁盘组。
可以通过一条SQL同时观察磁盘组名称、磁盘名称、状态和错误计数,代码如下:
SELECT g.name AS dg_name,
d.name AS disk_name,
d.mount_status,
d.state,
d.read_errs,
d.write_errs,
d.read_time,
d.write_time
FROM v$asm_disk d, v$asm_diskgroup g
WHERE d.group_number = g.group_number
ORDER BY d.read_errs DESC, d.write_errs DESC;
查询结果中,如果某个磁盘的 READ_ERRS 或 WRITE_ERRS 显著高于同组其他磁盘,基本可以确定该磁盘对应的物理链路、控制器或盘片已经出现硬件级故障。需要注意的是,单个时间点的错误计数可能是瞬时I/O抖动造成的,真正有参考价值的是该计数在数小时或数天内的增长趋势。Oracle的后台进程PMON和RBAL会在检测到磁盘I/O错误时触发ASM实例内部的联机重试机制,如果重试仍失败,才会推进到磁盘离线流程。
二、Windows平台获取磁盘组错误计数的常用路径
在Windows Server上部署Oracle RAC或单实例Grid Infrastructure时,ASM实例的告警日志是发现error count增长后的第一手排查资料。典型路径为 C:\app\grid\diag\asm\+asm\ASM1\trace\alert_ASM1.log,其中 C:\app\grid 是Grid软件的ORACLE_BASE目录,+asm 和 ASM1 会随实例名和节点编号变化。如果无法确定具体路径,可以打开命令提示符执行 echo %ORACLE_BASE% 或在注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ 下查找Grid安装目录对应的ORACLE_HOME键值。
日志中需要重点搜索的关键字包括 ORA-27072、ORA-15025、I/O error 以及 kfk 模块的输出。例如当底层磁盘返回超时或介质错误时,alert日志会连续出现类似 WARNING: Read Failed. group:1 disk:2 的记录,这些记录中的group和disk编号正好可以和 v$asm_disk 视图中的 GROUP_NUMBER、DISK_NUMBER 对应。
除了查看文本日志,还可以在Windows命令提示符中进入Grid的bin目录,使用ASMCMD命令行工具直接查看磁盘组和磁盘状态。假设Grid安装在 C:\app\grid\product\11.2.0\grid_1,可以执行:
cd C:\app\grid\product\11.2.0\grid_1\bin asmcmd lsdsk --statistics -g DATA asmcmd lsdg asmcmd lsop
其中 lsdsk --statistics 会输出每个磁盘的读错误和写错误计数,lsdg 用来确认磁盘组的冗余类型、总空间和可用空间,lsop 则展示当前正在进行的ASM操作,例如重新平衡或磁盘修复。通过这些命令可以快速判断error count增长是否已经引发ASM操作阻塞。
三、从确认问题到恢复磁盘组健康度的处理流程
一旦确认某个磁盘的读错误或写错误持续增长,首先要检查该磁盘组使用的冗余级别。执行下面的SQL可以得到冗余类型和可用空间:
SELECT name,
type,
total_mb,
free_mb,
required_mirror_free_mb,
usable_file_mb
FROM v$asm_diskgroup;
如果磁盘组的 TYPE 列显示为 EXTERNAL,说明没有ASM级别的镜像保护,任何一块物理磁盘损坏都可能直接导致数据文件丢失。这种情况下应当立即备份关键数据,并在存储层确认是否有RAID保护。如果底层已经是RAID10或RAID5,那么ASM的error count可能来自RAID控制器报出的坏块,需要结合存储管理软件查看物理盘状态。如果磁盘组为 NORMAL 或 HIGH 冗余,则可以先执行磁盘离线操作,让ASM自动恢复数据副本。
在Windows环境中,确认磁盘物理路径和ASM磁盘名称后,可以使用SQL命令将故障磁盘从磁盘组中剔除。例如磁盘组DATA中名为DATA_0002的磁盘错误计数异常,可以执行:
ALTER DISKGROUP DATA OFFLINE DISK DATA_0002; ALTER DISKGROUP DATA DROP DISK DATA_0002;
执行离线后,ASM会自动启动重新平衡操作,将故障磁盘上的数据副本重新分布到其他正常磁盘。此时不建议立刻拔出物理磁盘,而应先观察 v$asm_operation 视图中的 OPERATION 列,确认REBALANCE操作已经完成。在Windows的存储管理界面中,完成替换后再将新磁盘添加回磁盘组,命令示例为:
ALTER DISKGROUP DATA ADD DISK '\.\ORCLDISKDATA3' NAME DATA_0003;
注意,Windows上给ASM使用的磁盘一般为裸设备或通过ASMLIB模拟的磁盘,路径格式可能是 \.\ORCLDISK...,这里的反斜杠不能省略或写成斜杠。添加完成后,ASM同样会自动重新平衡。如果重新平衡过程中再次出现error count增长,说明问题不在单块磁盘,而可能是HBA卡、光纤线缆、多路径软件或存储控制器故障,需要从整个I/O链路逐段排查。
最后还要检查磁盘组的 DISK_REPAIR_TIME 属性。该属性决定磁盘离线后ASM在多长时间内不会自动丢弃镜像,默认值通常为3.6小时。在更换磁盘前,如果预计维护窗口会超过这个时间,应提前执行 ALTER DISKGROUP DATA SET ATTRIBUTE 'disk_repair_time'='8.5H'; 以留出更长的恢复窗口。整个处理过程中,error count的下降趋势比单次零值更重要。只要计数不再继续增长,并且ASM重新平衡顺利完成,就说明底层链路已经恢复稳定。

