ASM Rebalance 机制详解

ASM Rebalance 机制详解

适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

ASM Rebalance 是 ASM 自动重新平衡数据分布的机制[1]:

触发场景

  • 添加 Disk
  • 删除 Disk
  • Disk 故障
  • 手动触发
  • 修改 Disk 大小

核心目标

  • I/O 均衡
  • 数据均匀分布
  • 在线操作(不停机)

2. Rebalance 工作机制

2.1 触发流程

1. ALTER DISKGROUP ... ADD/DROP DISK
2. ASM RBAL 进程协调
3. ASM 启动 ARBn 进程(rebalance worker)
4. ARBn 进程:
   a. 扫描所有 Extent
   b. 计算目标位置
   c. 移动 Extent
5. 更新元数据
6. 完成 rebalance

2.2 数据移动

原始状态(Disk 1, 2, 3):
+-----+-----+-----+
| D1  | D2  | D3  |
+-----+-----+-----+
| E1  | E4  | E7  |
| E2  | E5  | E8  |
| E3  | E6  | E9  |
+-----+-----+-----+

添加 Disk 4 后:
+-----+-----+-----+-----+
| D1  | D2  | D3  | D4  |
+-----+-----+-----+-----+
| E1  | E4  | E7  | E10 |  ← 新 Extent
| E2  | E5  | E8  | E11 |
| E3  | E6  | E9  | E12 |
+-----+-----+-----+-----+

Rebalance 过程:
- ARBn 进程从 D1/D2/D3 移动部分 Extent 到 D4
- 保证每个 Disk 容量使用率一致

2.3 在线特性

  • 不阻塞数据库访问
  • 数据库可正常 DML/查询
  • Rebalance 后台异步执行
  • 失败可自动重启

3. Rebalance Power

3.1 Power 等级

Power速度资源占用适用
0不执行-暂停
1(默认)最慢最低业务高峰
4中等中等一般场景
8较快较高业务低峰
11最快(19c)维护窗口
MAX(32+)12c+最高紧急

3.2 设置 Power

-- 添加 Disk 时指定 power
ALTER DISKGROUP data ADD DISK '/dev/asm-disk5' REBALANCE POWER 8;

-- 手动触发 rebalance
ALTER DISKGROUP data REBALANCE POWER 4;

-- 修改运行中 rebalance power
ALTER DISKGROUP data REBALANCE MODIFY POWER 11;

-- 暂停 rebalance
ALTER DISKGROUP data REBALANCE MODIFY POWER 0;

-- 恢复
ALTER DISKGROUP data REBALANCE MODIFY POWER 4;

3.3 ASM_POWER_LIMIT 参数

SHOW PARAMETER asm_power_limit;
-- 默认 1,最大 1024

-- 修改
ALTER SYSTEM SET asm_power_limit=8 SCOPE=BOTH;

4. Rebalance 并行度

4.1 ARBn 进程

-- 查看运行中的 ARBn 进程
SELECT name, description 
FROM v$asm_process 
WHERE name LIKE 'ARB%';

4.2 并行度配置

-- 19c+ 自动并行度
ALTER DISKGROUP data SET ATTRIBUTE 'rebalance.compatibility'='19.0.0.0';

-- 并行度 = power × parallel_degree
ALTER DISKGROUP data REBALANCE POWER 8;
-- 19c+: 自动分配多个 ARBn 进程

5. Rebalance 监控

5.1 v$asm_operation

SELECT 
  group_number,
  operation,
  state,
  power,
  actual,
  sofar,
  est_work,
  est_rate,
  est_minutes,
  ERROR_CODE
FROM v$asm_operation;

字段说明

字段含义
operation操作类型(REBAL/ONLINE/OFFLINE)
stateWAIT/RUN/HALES/ERRORS
power请求的 power
actual实际 power
sofar已完成
est_work估计总工作量
est_rate估计速率(每秒)
est_minutes估计剩余时间(分钟)

5.2 Alert Log

# ASM alert log
tail -f $ORACLE_BASE/diag/asm/+asm/+ASM/trace/alert_+ASM.log

# 查找 rebalance 相关
grep -i "rebalance" alert_+ASM.log

5.3 ASMCMD

asmcmd> lsdg
asmcmd> iostat

6. Rebalance 影响因素

6.1 I/O 子系统

  • Disk 速度(SSD > SAS > SATA)
  • HBA 带宽
  • 存储控制器

6.2 ASM 资源

  • ASM SGA 大小
  • ASM 后台进程数
  • CPU 资源

6.3 数据库负载

  • 高负载会限制 rebalance
  • 业务高峰期降低 power
  • 维护窗口提高 power

7. 强制 Rebalance 场景

7.1 Disk 修复后

-- Disk 故障修复后上线
ALTER DISKGROUP data ONLINE DISK data_0005;
-- 自动触发 rebalance

7.2 Resizing Disk

-- 调整 Disk 大小
ALTER DISKGROUP data RESIZE DISK data_0005 SIZE 200G;
-- 触发 rebalance

7.3 文件模板变更

-- 修改模板属性
ALTER DISKGROUP data MODIFY TEMPLATE datafile 
  ATTRIBUTES (COARSE);
-- 不会自动 rebalance,需手动触发
ALTER DISKGROUP data REBALANCE;

8. Rebalance 优化

8.1 选择合适 Power

场景推荐 Power
业务高峰1-2
业务低峰4-8
维护窗口11-MAX
紧急MAX

8.2 Rollback 触发

-- 取消未完成的 rebalance
ALTER DISKGROUP data UNDROP DISKS;

-- 重新指定 power
ALTER DISKGROUP data REBALANCE POWER 4;

8.3 使用 Exadata Smart Scan

-- Exadata 环境下启用
ALTER DISKGROUP data SET ATTRIBUTE 'cell.smart_scan_capable'='TRUE';

9. 常见坑与排错

9.1 Rebalance 卡住

现象:rebalance 长时间不进展。

排查

-- 1. 检查状态
SELECT * FROM v$asm_operation;

-- 2. 检查 ARBn 进程
SELECT name, state, program 
FROM v$asm_process 
WHERE name LIKE 'ARB%';

-- 3. 检查 ASM alert log
grep "rebalance" alert_+ASM.log

修复

-- 增加 power
ALTER DISKGROUP data REBALANCE MODIFY POWER 11;

-- 或暂停后重启
ALTER DISKGROUP data REBALANCE MODIFY POWER 0;
ALTER DISKGROUP data REBALANCE MODIFY POWER 8;

9.2 Rebalance ERROR

现象v$asm_operation.ERROR_CODE 非 0。

修复

-- 检查 ASM alert log 中的具体错误
! grep "ERROR" $ORACLE_BASE/diag/asm/+asm/+ASM/trace/alert_+ASM.log

-- 修复后重新触发
ALTER DISKGROUP data REBALANCE POWER 4;

9.3 Rebalance 影响业务

现象:业务响应慢,rebalance 占用资源。

修复

-- 降低 power
ALTER DISKGROUP data REBALANCE MODIFY POWER 1;

-- 或暂停
ALTER DISKGROUP data REBALANCE MODIFY POWER 0;

9.4 估算时间不准

现象est_minutes 远超实际。

原因:估算基于当前速率,I/O 波动会导致误差。

修复

  • 定期监控
  • 业务低峰执行
  • 选择稳定 I/O 子系统

9.5 RAC 多节点 Rebalance

现象:RAC 中 rebalance 不收敛。

修复

-- 1. 检查所有 ASM 实例
SELECT instance_name, status FROM gv$instance;

-- 2. 重启 ASM(节点级)
crsctl stop res ora.asm -n node1
crsctl start res ora.asm -n node1

10. 最佳实践

  1. 业务低峰执行 rebalance:减少影响
  2. Power 合理选择:高峰 1-2,低峰 8-11
  3. 监控 est_minutes:评估完成时间
  4. 定期检查 v$asm_operation:及时发现错误
  5. 使用 SSD:rebalance 速度大幅提升
  6. Disk 大小一致:均衡分布
  7. 预留维护窗口:大规模变更
  8. 避免业务高峰:在线操作也要谨慎
  9. 设置 disk_repair_time:减少不必要的 rebalance
  10. 使用 asm_power_limit:全局限制

11. 参考资料

[1] Oracle Automatic Storage Management Administrator’s Guide 19c, “Managing ASM Rebalance” https://docs.oracle.com/en/database/oracle/oracle-database/19/ostmg/asm-rebalance.html

[2] Oracle Support Note 1558901.1, “ASM Rebalance Internals” https://support.oracle.com/epmos/faces/DocumentDisplay?id=1558901.1