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) |
state | WAIT/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. 最佳实践
- 业务低峰执行 rebalance:减少影响
- Power 合理选择:高峰 1-2,低峰 8-11
- 监控 est_minutes:评估完成时间
- 定期检查 v$asm_operation:及时发现错误
- 使用 SSD:rebalance 速度大幅提升
- Disk 大小一致:均衡分布
- 预留维护窗口:大规模变更
- 避免业务高峰:在线操作也要谨慎
- 设置 disk_repair_time:减少不必要的 rebalance
- 使用 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