Oracle RAC集群环境下,ASM磁盘组的rebalance(重新平衡)操作是存储扩容、缩容过程中的关键环节。当往磁盘组里加入新磁盘或者删除旧磁盘时,ASM会自动把数据在所有磁盘之间重新均匀分布,这个过程由ARBn后台进程负责执行。但很多DBA在执行完add disk或drop disk之后,查询V$ASM_OPERATION视图发现操作一直停留在wait rebalance状态,等了半天数据一点没动,甚至影响到后续的存储切换计划。要理解并解决这个问题,得先弄清楚rebalance的运作机制。

wait rebalance到底意味着什么
首先需要澄清一个概念:V$ASM_OPERATION视图中的STATE字段如果显示WAIT,并不一定代表出了问题。ASM的rebalance操作是按磁盘组串行调度的,同一个磁盘组在同一时刻只允许一个rebalance任务真正执行(RUN状态)。如果同一个磁盘组有多个rebalance请求排队,后面的请求就会显示为WAIT,等前面的任务跑完才会轮到它。这是一种正常的排队现象。
真正的异常情况是:队列里只有一个rebalance操作,但它长期处于WAIT状态不动,或者另一个节点上的操作一直是RUN但进度始终不涨。这种情况通常说明rebalance被某种条件阻塞了。常见的阻塞原因包括:磁盘组正在执行drop disk的前置清理、某个节点的ASM实例异常、磁盘组属性DISK_REPAIR_TIME相关联的offline磁盘没有处理、以及rebalance与resize等其他存储操作产生了互斥。
排查的第一步是确认到底是哪种状态。在任意节点ASM实例执行下面的查询:
-- 查看当前rebalance操作状态
SELECT GROUP_NUMBER, OPERATION, STATE, POWER, ACTUAL, SOFAR, EST_WORK,
EST_RATE, EST_MINUTES
FROM V$ASM_OPERATION;
-- 查看磁盘组层面的属性
SELECT GROUP_NUMBER, NAME, VALUE
FROM V$ASM_ATTRIBUTE
WHERE NAME LIKE 'rebalance%';如果EST_MINUTES一直是0而SOFAR不变,基本可以断定操作被挂起了,需要进一步定位原因。
rebalance被阻塞的常见原因与处理
第一个高频原因是ASM_POWER_LIMIT参数过低。power值决定了rebalance的并行度,取值范围0到1024(11g以前是0到11)。如果power为0,rebalance实际上处于暂停状态,视图里就会看到WAIT而永远不执行。检查方式很简单:
-- 查看当前power限制 SHOW PARAMETER ASM_POWER_LIMIT; -- 主动唤醒或调整正在等待的rebalance(power=0会导致挂起) ALTER DISKGROUP data REBALANCE POWER 8;
第二个原因是drop disk操作没有完成前置的磁盘内容清空。当你drop一块盘时,ASM必须先把这块盘上的数据迁移到其他盘,只有迁移完毕盘才会从磁盘组移除。如果这个迁移过程因为源盘性能差或网络问题变得极慢,后续的rebalance请求都会排队等待。可以用V$ASM_DISK视图的MODE_STATUS和STATE字段确认磁盘状态,如果磁盘处于DROPPING状态,说明数据迁移还在进行。
第三个原因是集群节点间的问题。RAC环境下rebalance由某个节点的ARBn进程实际执行,如果那个节点的ASM实例负载很高,或者节点间私有网络(interconnect)出现抖动,rebalance的IO会大打折扣。此时可以通过V$ASM_OPERATION在两个节点分别查询,看RUN状态落在哪个节点,再结合该节点的ADR告警日志分析。Windows平台上的集群环境,ADR日志路径通常在C:\app\oracle\diag\asm\+asm\+asm1\trace目录下,查看alert日志能发现ARBn进程相关的报错。
第四个原因是磁盘组兼容性属性的限制。COMPATIBLE.ASM和COMPATIBLE.RDBMS版本不匹配,或者磁盘组处于RESTRICTED模式(比如执行过mount restricted),都会导致rebalance行为异常。RESTRICTED模式下磁盘组只在一个节点可见,如果操作脚本连到了错误节点,rebalance会一直等待:
-- 检查磁盘组是否处于RESTRICTED挂载 SELECT GROUP_NUMBER, NAME, STATE FROM V$ASM_DISKGROUP; -- 正常节点重新挂载(谨慎操作,需停相关业务) ALTER DISKGROUP data DISMOUNT; ALTER DISKGROUP data MOUNT;
实战排查步骤与预防建议
遇到wait rebalance问题时,建议按照固定的顺序排查。第一步确认是不是排队问题,查V$ASM_OPERATION看是否存在多个操作,如果只有一个操作且长期WAIT则继续。第二步检查power参数和磁盘组状态,确认没有RESTRICTED挂载、没有offline磁盘。第三步查看执行节点的ASM alert日志,搜索ARBn、rebalance关键字,确认没有ORA-150xx系列错误。第四步检查节点间私有网络延迟,RAC的rebalance数据传输依赖interconnect,网络质量差会直接拖慢甚至卡住进度。
日常运维上有几个实践建议。做存储变更前,先用ALTER DISKGROUP ... REBALANCE POWER n WAIT预估影响时间,避免业务高峰期操作。扩容时优先一次性加入所有新盘再触发rebalance,而不是分批加盘触发多次平衡,多次rebalance的累计IO开销远大于一次完成。如果需要临时暂停rebalance(比如业务高峰来不及跑完),可以显式把power改成0,但一定要记得事后恢复,否则就会复现wait rebalance的假故障。
-- 业务高峰临时暂停(事后必须恢复) ALTER DISKGROUP data REBALANCE POWER 0; -- 低峰期高功率执行 ALTER DISKGROUP data REBALANCE POWER 20 NOWAIT; -- 监控进度的便捷查询 SELECT INST_ID, OPERATION, STATE, SOFAR, EST_WORK, EST_MINUTES FROM GV$ASM_OPERATION ORDER BY INST_ID;
总的来说,wait rebalance绝大多数情况不是bug,而是排队、参数或资源问题。只要按照上面的顺序把power设置、磁盘状态、节点健康度和磁盘组挂载模式逐项核实清楚,问题基本都能定位并解决。平时做好变更窗口规划和rebalance的进度预估,可以大幅减少这类问题对业务的干扰。
Oracle RACASM磁盘组wait rebalance修改时间:2026-09-03 08:26:34