Flex ASM 是 Oracle 12c 引入的实例级故障隔离机制,支持跨节点接管磁盘组服务;传统 ASM 为节点本地 1:1 绑定,无故障转移能力。
flex asm 不是“多开几个 asm 实例”就能自动高可用,它依赖集群服务发现机制和底层网络连通性;没启用 flex 模式时,单节点 asm 崩溃,同节点数据库必然报 ora-15032、ora-15063,这不是配置错,是架构不支持。
怎么确认当前 ASM 是否已启用 Flex 模式
别信安装界面勾选记录,得查 CRS 和 ASM 运行态。两个命令必须都验证:
- 在任意节点执行
asmcmd showclustermode,输出必须为ASM cluster : Flex mode enabled - 运行
crsctl stat res -t | grep asm,资源名应为ora.asm(无节点后缀),且状态是ONLINE;若看到ora.rac1.asm这类带节点名的资源,说明仍是传统 1:1 绑定模式
常见误判:asmca 图形界面点了“Enable Flex ASM”但没点 Finish 完成部署,或中途报错退出,CRS 里实际未变更——这种“半启用”状态查 showclustermode 仍会显示 disabled。
启用 Flex ASM 的硬性前提和关键操作顺序
Flex ASM 不是参数开关,是集群级重构,顺序错一步就卡死:
- Grid Infrastructure 必须 ≥ 12.1.0.2,用
opatch lsinventory确认补丁集,所有节点 GI 版本必须严格一致 - 执行前必须停整个集群:
crsctl stop cluster -all(不是只停 ASM 或 DB) - 真正生效的命令是静默配置:
asmca -silent -configureFlexASM -asmRedundancy HIGH -diskString '/dev/oracleasm/disks/*',其中-diskString必须与现有磁盘路径完全一致,否则后续加盘失败
启动后立即验证:asmcmd lsct 应列出多个节点的 ASM 实例,且 client 列能看到对应数据库实例名——如果 client 列为空,说明数据库还没完成服务注册,可能网络或 GNS 解析异常。
Flex ASM 下数据库如何连接 ASM:不是改 spfile 就完事
启用后,数据库不再硬连本地 ASM,而是通过 SCAN 或 GNS 解析 ASM 服务名;这个过程完全由 OCR 自动维护,DBA 不能手动干预:
-
asm_diskstring参数依然有效,但它只控制磁盘发现范围,不影响连接目标 - 真正决定连哪个 ASM 实例的是
ASM_CLIENT属性,由 Clusterware 动态写入 OCR,手工修改srvctl modify asm -client会被覆盖,且可能触发 OCR 冲突 - 如果数据库启动时报
ORA-15063但 ASM 实例在线,优先检查 SCAN VIP 是否可达、GNS 是否正常(nslookup scan-name)、以及防火墙是否放行 1521/1522 端口
Flex ASM 的故障转移是秒级的,但前提是客户端重连逻辑能触发——有些老版本 JDBC 驱动或自定义连接池未启用 TAF(Transparent Application Failover),会导致首次连接失败后不自动重试,看起来像“没切换”。
Flex ASM 的基数(ASM cardinality)怎么调
默认 ASM 基数是 3,即集群中最多运行 3 个 ASM 实例;它不是越多越好,要权衡跨节点 IO 开销和故障域覆盖:
- 查看当前基数:
srvctl config asm输出中的ASM cardinality字段 - 调整命令:
srvctl modify asm -cardinality 4,但必须确保集群中至少有 4 个节点具备 ASM 运行条件(共享存储可达、GI 正常) - 基数设太高会导致小集群(如仅 2 节点)出现 ASM 实例被调度到无共享存储的节点上,启动失败并报
ORA-15077
最易被忽略的一点:Flex ASM 的高可用能力,只在“ASM 实例进程崩溃”或“节点宕机”时触发接管;如果是 ASM 磁盘组损坏、DISKGROUP 被意外 DROP、或权限配置错误导致磁盘不可见,这些属于存储层问题,Flex ASM 不处理,也不会自动恢复。











