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_status | MOUNTED / MISSING / CLOSED |
| header_status | FORMATTING / CANDIDATE / MEMBER / FOREIGN / PROVISIONED |
| mode_status | ONLINE / OFFLINE |
| state | NORMAL / 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. 最佳实践
- 添加前检查空间:避免 Rebalance 失败
- 使用 Rebalance Power:平衡速度与负载
- 避免高峰期操作:业务影响最小
- 监控 Rebalance:v$asm_operation
- 故障磁盘 Force 删除:避免等待
- 删除前备份:防止数据丢失
- 统一磁盘命名:清晰管理
- 使用 ASMFD:磁盘保护
- 生产用 19c+:特性完善
- 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