Oracle ASM Disk 添加/删除/替换

Oracle ASM Disk 添加/删除/替换

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


1. 概述

ASM Disk Group 的磁盘管理是 ASM 日常运维的核心[1]:

  • 添加磁盘:扩容
  • 删除磁盘:缩容/退役
  • 替换磁盘:故障替换
  • Rebalance:数据重平衡

2. 查看磁盘

2.1 磁盘组磁盘

SELECT 
  group_number, 
  disk_number, 
  name,
  path, 
  mount_status, 
  header_status,
  mode_status,
  state,
  total_mb,
  free_mb
FROM v$asm_disk
ORDER BY group_number, disk_number;

2.2 字段说明

字段说明
mount_statusMOUNTED / MISSING / CLOSED
header_statusFORMATTING / CANDIDATE / MEMBER / FOREIGN / PROVISIONED
mode_statusONLINE / OFFLINE
stateNORMAL / ADDING / DROPPING / HUNG / FORCING

2.3 磁盘组容量

SELECT 
  group_number,
  name,
  type,
  total_mb,
  free_mb,
  required_mirror_free_mb,
  usable_file_mb,
  offline_disks
FROM v$asm_diskgroup;

3. 添加磁盘

3.1 添加单磁盘

-- 添加磁盘
ALTER DISKGROUP data ADD DISK '/dev/asm-disk5' NAME data_0005;

3.2 添加多磁盘

-- 添加多个磁盘
ALTER DISKGROUP data ADD DISK 
  '/dev/asm-disk5' NAME data_0005,
  '/dev/asm-disk6' NAME data_0006,
  '/dev/asm-disk7' NAME data_0007;

3.3 指定 Rebalance Power

-- 指定 Rebalance Power
ALTER DISKGROUP data ADD DISK '/dev/asm-disk5' 
  NAME data_0005 
  REBALANCE POWER 8;

3.4 添加 ASMFD 磁盘

-- 使用 ASMFD 磁盘
ALTER DISKGROUP data ADD DISK 'AFD:DATA5' NAME data_0005;

3.5 等待 Rebalance 完成

-- 查看 Rebalance 状态
SELECT 
  group_number, 
  operation, 
  state, 
  power, 
  actual,
  est_minutes
FROM v$asm_operation;

-- 等待完成
-- state = WAIT 或为空表示完成

4. 删除磁盘

4.1 删除单磁盘

-- 删除磁盘
ALTER DISKGROUP data DROP DISK data_0005;

4.2 删除多磁盘

ALTER DISKGROUP data DROP DISK 
  data_0005, data_0006, data_0007;

4.3 指定 Rebalance Power

ALTER DISKGROUP data DROP DISK data_0005 
  REBALANCE POWER 8;

4.4 强制删除

-- 强制删除(不等数据迁移)
ALTER DISKGROUP data DROP DISK data_0005 FORCE;
-- 注意:可能丢失数据,仅在磁盘损坏时使用

4.5 取消删除

-- 在 Rebalance 完成前可取消
ALTER DISKGROUP data UNDROP DISKS;

4.6 等待删除完成

SELECT 
  group_number, 
  operation, 
  state, 
  est_minutes
FROM v$asm_operation;

-- state 为空时完成
-- 磁盘从 v$asm_disk 消失

5. 替换磁盘

5.1 在线替换

-- 一步完成删除+添加
ALTER DISKGROUP data 
  DROP DISK data_0005 
  ADD DISK '/dev/asm-disk_new' NAME data_0005;

5.2 故障替换

-- 1. 强制删除故障磁盘
ALTER DISKGROUP data DROP DISK data_0005 FORCE;

-- 2. 添加新磁盘
ALTER DISKGROUP data ADD DISK '/dev/asm-disk_new' NAME data_0005;

5.3 替换更小磁盘

-- 1. 检查空间
SELECT name, total_mb, free_mb FROM v$asm_diskgroup WHERE name='DATA';

-- 2. 添加新磁盘(小容量)
ALTER DISKGROUP data ADD DISK '/dev/asm-disk_new' NAME data_new;

-- 3. 删除旧磁盘(大容量)
ALTER DISKGROUP data DROP DISK data_0005;

-- 4. 等待 Rebalance

6. 磁盘组缩容

6.1 删除多余磁盘

-- 删除 2 个磁盘(保持冗余)
ALTER DISKGROUP data DROP DISK data_0005, data_0006;

-- 等待完成
SELECT * FROM v$asm_operation;

6.2 空间检查

-- 删除前必须确保剩余空间足够
SELECT 
  name,
  total_mb,
  free_mb,
  (total_mb - free_mb) AS used_mb,
  usable_file_mb
FROM v$asm_diskgroup;
-- usable_file_mb 必须大于 used_mb 的冗余倍数

7. 磁盘故障处理

7.1 磁盘 offline

-- 手动 offline
ALTER DISKGROUP data OFFLINE DISK data_0005;

-- 指定删除时间(自动删除)
ALTER DISKGROUP data OFFLINE DISK data_0005 DROP AFTER 30m;

7.2 磁盘 online

-- 磁盘修复后 online
ALTER DISKGROUP data ONLINE DISK data_0005;

-- 所有 offline 磁盘 online
ALTER DISKGROUP data ONLINE ALL;

7.3 强制 Mount

-- 磁盘组故障后强制 Mount
ALTER DISKGROUP data MOUNT FORCE;
-- 可能丢失部分数据

8. Rebalance 优化

8.1 调整 Power

-- 修改 Power
ALTER DISKGROUP data REBALANCE MODIFY POWER 11;

-- 暂停
ALTER DISKGROUP data REBALANCE SUSPEND;

-- 恢复
ALTER DISKGROUP data REBALANCE RESUME;

8.2 全局 Power Limit

-- 设置 ASM_POWER_LIMIT
ALTER SYSTEM SET asm_power_limit=8 SCOPE=BOTH;

-- 默认 1,最大 1024(11g+)

详细内容见:Oracle ASM Rebalance Power 与并行度优化


9. 监控 Rebalance

9.1 操作进度

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

9.2 磁盘状态变化

SELECT 
  disk_number,
  name,
  path,
  state,
  mount_status,
  mode_status
FROM v$asm_disk
WHERE group_number = (SELECT group_number FROM v$asm_diskgroup WHERE name='DATA')
ORDER BY disk_number;

9.3 Alert Log

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

10. 常见坑与排错

10.1 ORA-15032: 磁盘组变更失败

修复

-- 1. 检查 ASM 状态
SELECT group_number, name, state FROM v$asm_diskgroup;

-- 2. 重新执行
ALTER DISKGROUP data ADD DISK '/dev/asm-disk5';

10.2 ORA-15031: 磁盘路径不匹配

修复

# 1. 检查磁盘路径
ls -l /dev/asm-disk5

# 2. 检查权限
chown oracle:dba /dev/asm-disk5
chmod 660 /dev/asm-disk5

# 3. 检查 ASM 磁盘
oracleasm listdisks
# 或
asmcmd afd_lsdsk

10.3 ORA-15033: 磁盘已是其他组成员

修复

-- 检查磁盘状态
SELECT path, header_status FROM v$asm_disk WHERE path='/dev/asm-disk5';

-- 如果是 FOREIGN,强制清除
-- 在 OS 层清除磁盘头
dd if=/dev/zero of=/dev/asm-disk5 bs=1M count=10

-- 重新添加
ALTER DISKGROUP data ADD DISK '/dev/asm-disk5';

10.4 ORA-15041: 磁盘组空间不足

修复

-- 1. 检查空间
SELECT name, total_mb, free_mb, usable_file_mb FROM v$asm_diskgroup;

-- 2. 增加磁盘
ALTER DISKGROUP data ADD DISK '/dev/asm-disk_new';

-- 3. 然后删除
ALTER DISKGROUP data DROP DISK data_0005;

10.5 Rebalance 卡住

修复

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

-- 2. 检查等待事件
SELECT event, state FROM v$session WHERE program LIKE '%RBAL%';

-- 3. 调整 Power
ALTER DISKGROUP data REBALANCE MODIFY POWER 11;

10.6 删除磁盘后空间未释放

原因:Rebalance 未完成。

修复

-- 等待 Rebalance 完成
SELECT * FROM v$asm_operation;
-- 完成后空间才释放

11. 最佳实践

  1. 添加前检查空间:避免 Rebalance 失败
  2. 使用 Rebalance Power:平衡速度与负载
  3. 避免高峰期操作:业务影响最小
  4. 监控 Rebalance:v$asm_operation
  5. 故障磁盘 Force 删除:避免等待
  6. 删除前备份:防止数据丢失
  7. 统一磁盘命名:清晰管理
  8. 使用 ASMFD:磁盘保护
  9. 生产用 19c+:特性完善
  10. UDEV 配置权限:避免权限问题

12. 参考资料

[1] Oracle ASM Administrator’s Guide 19c, “Managing Oracle ASM Disks” https://docs.oracle.com/en/database/oracle/oracle-database/19/ostmg/managing-oracle-asm-disks.html