ASM Disk Group 创建与维护

ASM Disk Group 创建与维护

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


1. 概述

ASM Disk Group 是 ASM 管理的核心对象,由多个 Disk 组成[1]:

操作命令
创建CREATE DISKGROUP
修改ALTER DISKGROUP
删除DROP DISKGROUP
挂载ALTER DISKGROUP … MOUNT
卸载ALTER DISKGROUP … DISMOUNT

2. 创建 Disk Group

2.1 准备 Disk

# 1. 识别磁盘
ls /dev/sd*

# 2. 配置 UDEV 规则(推荐)
cat > /etc/udev/rules.d/99-oracle-asm.rules <<EOF
KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/\$name", RESULT=="3600508b1001c1d3a8b3ef23456000001", SYMLINK+="asm-disk1", OWNER="oracle", GROUP="oinstall", MODE="0660"
EOF

# 3. 重新加载 UDEV
udevadm control --reload-rules
udevadm trigger

# 4. 验证
ls -l /dev/asm*

2.2 创建 Disk Group

-- 外部冗余
CREATE DISKGROUP data EXTERNAL REDUNDANCY
  DISK '/dev/asm-disk1', '/dev/asm-disk2'
  ATTRIBUTE 'au_size'='4M', 'compatible.rdbms'='19.0', 'compatible.asm'='19.0';

-- Normal 冗余(2-way)
CREATE DISKGROUP data NORMAL REDUNDANCY
  FAILGROUP fg1 DISK '/dev/asm-disk1', '/dev/asm-disk2'
  FAILGROUP fg2 DISK '/dev/asm-disk3', '/dev/asm-disk4'
  ATTRIBUTE 'au_size'='4M';

-- High 冗余(3-way)
CREATE DISKGROUP data HIGH REDUNDANCY
  FAILGROUP fg1 DISK '/dev/asm-disk1'
  FAILGROUP fg2 DISK '/dev/asm-disk2'
  FAILGROUP fg3 DISK '/dev/asm-disk3';

2.3 Flex 冗余(18c+)

-- Flex Redundancy
CREATE DISKGROUP data FLEX REDUNDANCY
  FAILGROUP fg1 DISK '/dev/asm-disk1'
  FAILGROUP fg2 DISK '/dev/asm-disk2'
  FAILGROUP fg3 DISK '/dev/asm-disk3';

3. Disk Group 属性

3.1 常用属性

属性说明默认
au_sizeAU 大小1MB
compatible.rdbms数据库兼容版本10.1
compatible.asmASM 兼容版本11.2
disk_repair_timeDisk 修复时间3.6h
cell.smart_scan_capableExadataFALSE
content.type数据类型DATA
sector_size扇区大小512

3.2 修改属性

-- 修改兼容性
ALTER DISKGROUP data SET ATTRIBUTE 'compatible.rdbms'='19.0';
ALTER DISKGROUP data SET ATTRIBUTE 'compatible.asm'='19.0';

-- 修改 Disk Repair Time
ALTER DISKGROUP data SET ATTRIBUTE 'disk_repair_time'='8H';

3.3 查看属性

SELECT 
  group_number,
  name,
  value
FROM v$asm_attribute
WHERE group_number = 1;

4. Disk 添加/删除

4.1 添加 Disk

-- 添加单个 Disk
ALTER DISKGROUP data ADD DISK '/dev/asm-disk5';

-- 添加并指定名称
ALTER DISKGROUP data ADD DISK '/dev/asm-disk5' NAME data_0005;

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

-- 添加到指定 Failgroup
ALTER DISKGROUP data ADD FAILGROUP fg3 DISK '/dev/asm-disk7';

4.2 删除 Disk

-- 删除 Disk(触发 rebalance)
ALTER DISKGROUP data DROP DISK data_0005;

-- 删除并指定 rebalance power
ALTER DISKGROUP data DROP DISK data_0005 REBALANCE POWER 8;

-- 删除多个 Disk
ALTER DISKGROUP data DROP DISK data_0005, data_0006;

4.3 替换 Disk

-- 在线替换(不停机)
ALTER DISKGROUP data DROP DISK data_0005 
  ADD FAILGROUP fg1 DISK '/dev/asm-disk7' NAME data_0007;

5. Disk Group 维护

5.1 MOUNT / DISMOUNT

-- MOUNT
ALTER DISKGROUP data MOUNT;

-- DISMOUNT
ALTER DISKGROUP data DISMOUNT;

-- 强制 MOUNT
ALTER DISKGROUP data MOUNT FORCE;

-- MOUNT 所有 Disk Group
ALTER DISKGROUP ALL MOUNT;

5.2 RESIZE

-- 调整所有 Disk 大小
ALTER DISKGROUP data RESIZE ALL;

-- 调整单个 Disk
ALTER DISKGROUP data RESIZE DISK data_0005 SIZE 100G;

5.3 CHECK / REPAIR

-- 检查一致性
ALTER DISKGROUP data CHECK ALL;

-- 修复
ALTER DISKGROUP data CHECK ALL REPAIR;

5.4 Undrop Disk

-- 撤销删除操作
ALTER DISKGROUP data UNDROP DISKS;

6. Rebalance

6.1 自动 Rebalance

添加/删除 Disk 时自动触发:

-- 添加 Disk 自动 rebalance
ALTER DISKGROUP data ADD DISK '/dev/asm-disk5';
-- 后台自动 rebalance

-- 手动触发
ALTER DISKGROUP data REBALANCE POWER 8;

6.2 Power 设置

Power说明
0不执行
1最慢(默认)
4中等
8较快
11最快(19c 最大)
3212c+ MAX(受 resources 限制)

6.3 查看 Rebalance 进度

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

详细内容见:Oracle ASM Rebalance 机制


7. Disk Group 删除

-- 删除空 Disk Group
DROP DISKGROUP data;

-- 删除包含文件的 Disk Group
DROP DISKGROUP data INCLUDING CONTENTS;

-- 强制删除(无法 mount 时)
DROP DISKGROUP data FORCE INCLUDING CONTENTS;

8. Disk Group 模板

8.1 默认模板

SELECT 
  group_number,
  name,
  redundancy,
  stripe,
  system
FROM v$asm_template
WHERE group_number = 1;
模板名用途
PARAMETERFILESPFILE
DATAFILE数据文件
ONLINELOGRedo Log
ARCHIVELOG归档日志
CONTROLFILE控制文件
BACKUPSETRMAN 备份
DATAGUARDCONFIGDG 配置

8.2 自定义模板

-- 创建模板
ALTER DISKGROUP data ADD TEMPLATE high_imp 
  ATTRIBUTES (HIGH FINE);

-- 使用模板创建文件
CREATE TABLESPACE important_ts 
  DATAFILE '+DATA(high_imp)' SIZE 100M;

-- 删除模板
ALTER DISKGROUP data DROP TEMPLATE high_imp;

9. ASM 元数据备份

9.1 备份元数据

# ASMCMD 备份
asmcmd md_backup /tmp/asm_metadata_backup.gpb -G DATA

# 备份所有 Disk Group
asmcmd md_backup /tmp/asm_metadata_backup.gpb

9.2 恢复元数据

# 恢复
asmcmd md_restore /tmp/asm_metadata_backup.gpb

10. 相关视图

-- Disk Group 概览
SELECT 
  group_number, 
  name, 
  state, 
  type, 
  total_mb, 
  free_mb,
  ROUND(free_mb/total_mb*100, 2) AS free_pct
FROM v$asm_diskgroup;

-- Disk 详情
SELECT 
  group_number,
  disk_number,
  mount_status,
  header_status,
  mode_status,
  state,
  path,
  total_mb,
  free_mb
FROM v$asm_disk;

-- Disk Group 属性
SELECT group_number, name, value 
FROM v$asm_attribute;

11. 常见坑与排错

11.1 ORA-15032 / ORA-15063

现象:Disk Group 无法 mount。

修复

-- 1. 检查 Disk 状态
SELECT group_number, disk_number, header_status, state 
FROM v$asm_disk;

-- 2. 强制 mount
ALTER DISKGROUP data MOUNT FORCE;

-- 3. 检查 ASM alert log
! tail -100 $ORACLE_BASE/diag/asm/+asm/+ASM/trace/alert_+ASM.log

11.2 Disk Header 损坏

现象ORA-15025: could not open disk '/dev/asm-disk1'

修复

# 1. 检查 disk header
kfed read /dev/asm-disk1

# 2. 修复(如果有备份)
kfed repair /dev/asm-disk1

# 3. 重建 Disk Group(最后手段)

11.3 Disk Group 满了

现象ORA-15041: diskgroup space exhausted

修复

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

-- 2. 增加 Disk
ALTER DISKGROUP data ADD DISK '/dev/asm-disk5';

-- 3. 清理旧备份
RMAN> DELETE OBSOLETE;

11.4 Rebalance 不收敛

现象:rebalance 长时间不结束。

修复

-- 检查进度
SELECT * FROM v$asm_operation;

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

-- 检查错误
SELECT * FROM v$asm_operation WHERE state = 'ERRORS';

11.5 Disk 离线后超时

现象disk_repair_time 超时,Disk 被永久删除。

修复

-- 1. 增大 disk_repair_time
ALTER DISKGROUP data SET ATTRIBUTE 'disk_repair_time'='24H';

-- 2. 在超时前修复 Disk 并上线
ALTER DISKGROUP data ONLINE DISK data_0005;

12. 最佳实践

  1. 使用 UDEV 规则:保证 Disk 路径稳定
  2. Disk 大小一致:均衡 I/O
  3. Normal/High Redundancy:保证数据可用性
  4. disk_repair_time 充足:≥ 8 小时
  5. 定期备份元数据md_backup
  6. 监控 Disk 使用率:< 80%
  7. Rebalance power 合理:4-8
  8. 生产推荐独立 Disk Group:DATA/FRA/REDO 分开
  9. Flex Redundancy(18c+):灵活冗余
  10. 定期 ASM 健康检查ALTER DISKGROUP ... CHECK

13. 参考资料

[1] Oracle Automatic Storage Management Administrator’s Guide 19c https://docs.oracle.com/en/database/oracle/oracle-database/19/ostmg/

[2] Oracle ASM Quick Start 19c https://docs.oracle.com/en/database/oracle/oracle-database/19/ostmg/asm-diskgroups.html