Oracle ASM冗余必须显式定义FAILGROUP才能实现真正容错:NORMAL需≥2个独立FAILGROUP,HIGH需≥3个物理隔离FAILGROUP,EXTERNAL虽不镜像但仍建议按路径划分FAILGROUP;未定义则所有磁盘归GROUP_0,导致单点失效。
NORMAL冗余下不显式定义FAILGROUP等于没冗余
oracle asm的normal冗余默认写两份副本,但这两份必须落在不同failgroup才真正防止单点失效。如果建组时漏掉failgroup子句,所有磁盘会被自动归入group_0——意味着主副副本可能共用同一控制器、背板甚至raid卡。一旦该路径中断,ora-15042报错直接触发磁盘组dismount。
常见错误写法:CREATE DISKGROUP data NORMAL REDUNDANCY DISK '/dev/mapper/disk1', '/dev/mapper/disk2'
正确做法必须显式分组:
- 确认物理拓扑:用
lsscsi -v或存储厂商工具验证每块磁盘归属的控制器 - 按控制器划分:如控制器A下的磁盘归
FAILGROUP ctrl_a,控制器B下的归FAILGROUP ctrl_b - 命令中每个
FAILGROUP至少含1块磁盘,且总failgroup数≥2 - 后续添加磁盘时,必须带
FAILGROUP参数,否则会进默认组破坏冗余
HIGH冗余要求至少3个独立FAILGROUP
HIGH冗余不是“越多磁盘越安全”,而是强制要求三个副本分布在三个互不重叠的物理故障域。若只配了2个FAILGROUP,CREATE DISKGROUP会直接报错;若配了3个但其中两个共享同一电源或光纤交换机,实际仍等同于单点故障。
关键约束:
-
CREATE DISKGROUP命令必须声明≥3个FAILGROUP,例如FAILGROUP site_a、FAILGROUP site_b、FAILGROUP site_c - 每个
FAILGROUP应有独立HBA卡、独立光纤链路、独立供电单元 - 容量需尽量均衡,否则
REBALANCE过程会卡在最小容量组上 - 运行中任意两个
FAILGROUP离线,磁盘组进入降级状态,Usable_file_MB将趋近于0,归档和备份会失败
EXTERNAL冗余不等于“不用管FAILGROUP”
虽然EXTERNAL冗余模式下ASM不做镜像,看似不需要FAILGROUP,但RAC环境中仍需注意:若多个节点挂载同一套共享LUN,而这些LUN后端实际由同一存储控制器管理,未做FAILGROUP隔离会导致所有节点IO路径依赖单点。此时即使ASM不镜像,集群高可用性也形同虚设。
实操建议:
- 即便用
EXTERNAL,也建议按物理路径显式建FAILGROUP,便于后续切换冗余级别 - 在RAC中,
V$ASM_DISK里FAILGROUP为空不是问题,但PATH列必须真实反映跨节点的存储拓扑 - 避免把多路径设备(如
/dev/mapper/mpatha)误认为天然隔离——它们常映射到同一控制器
检查FAILGROUP是否真生效的三步验证
建完磁盘组不能只看asmcmd lsdg显示state=CONNECTED,必须立刻查底层分布:
- 执行
SELECT NAME, FAILGROUP, PATH FROM GV$ASM_DISK WHERE GROUP_NUMBER = (SELECT GROUP_NUMBER FROM V$ASM_DISKGROUP WHERE NAME = 'DATA') - 确认每行
FAILGROUP非空,且至少出现2个(NORMAL)或3个(HIGH)不同值 - 对照
PATH字段,验证相同FAILGROUP的磁盘确实属于同一物理设备(如都含ctrla前缀)
最容易被忽略的是:添加新磁盘后不指定FAILGROUP,它会悄悄进入GROUP_0,久而久之整个磁盘组的冗余结构就瓦解了。这种问题不会立刻报错,但会在某次控制器故障时集中爆发。


















