Flex ASM 是 Oracle 12c 引入的实例级故障隔离机制,支持跨节点接管磁盘组服务;传统 ASM 为节点本地 1:1 绑定,无故障转移能力。
Flex ASM 是什么,和传统 ASM 有什么本质区别
flex asm 不是“多个 asm 实例一起跑”就叫高可用,而是 oracle 12c 引入的**实例级故障隔离机制**:单个节点上的 asm 实例挂了,集群里其他节点的 asm 实例能自动接管它的磁盘组服务,客户端(数据库实例)几乎无感。传统 asm 是 1:1 绑定——哪个节点起 asm,本地数据库就只能连它;flex asm 改为“服务发现 + 远程连接”,asm 实例可以跨节点提供服务。
关键判断:如果你的 RAC 集群只有 2 个节点,又没开 Flex ASM,那一个节点 ASM 崩了,另一个节点上的数据库实例会立刻报 ORA-15032、ORA-15063,根本连不上磁盘组——这不是配置问题,是架构限制。
检查当前是否已启用 Flex ASM
别猜,直接查。Flex ASM 启用与否,看的是集群层面的 ASM 模式,不是单个实例参数。
- 在任意节点执行:
asmcmd showclustermode,输出Flex mode enabled才算开启 - 查 CRS 资源:
crsctl stat res -t | grep asm,如果看到资源名含ora.asm且状态是ONLINE(不是ora.<nodename>.asm</nodename>这种带节点名的旧格式),大概率是 Flex 模式 - 误判高发点:
asmca图形界面里勾选了“Enable Flex ASM”,但没点“Finish”后执行部署,或部署中途失败,实际 CRS 里仍是传统模式
启用 Flex ASM 的硬性前提和操作顺序
Flex ASM 不是开关一按就生效,它依赖集群基础设施就位,顺序错一步就卡住。
- 必须使用 Oracle Grid Infrastructure 12.1.0.2 及以上版本(
opatch lsinventory确认补丁集) - 所有节点的 GI 必须版本一致,且
crsctl check cluster -all全部通过 - 操作必须在集群停止状态下进行:
crsctl stop cluster -all,不是只停 ASM - 真正启用命令是:
asmca -silent -configureFlexASM -asmRedundancy HIGH -diskString '/dev/oracleasm/disks/*'(注意:-diskString必须和现有磁盘路径完全一致,否则后续加盘失败) - 启动后验证:
asmcmd lsct应显示多个节点的 ASM 实例在线,且client列有对应数据库实例名
Flex ASM 下数据库实例连接 ASM 的真实行为
启用后,数据库实例不再硬编码连本地 ASM,而是通过 GNS 或 SCAN 解析 ASM 服务名,这个过程容易被网络配置拖垮。
- 数据库的
spfile中asm_diskstring参数依然有效,但它只影响磁盘发现,不影响连接目标 - 真正决定连哪个 ASM 实例的是
ASM_CLIENT属性,由 OCR 自动维护,DBA 不可手动改 - 常见故障现象:
ORA-15027(active ASM client found)通常是因为旧 ASM 实例残留进程没清干净,需手工 killasm_pmon_+ASM*进程再重启 GI - 性能提示:跨节点访问 ASM(比如节点1的 DB 连节点2的 ASM)会增加网络延迟,对频繁元数据操作(如大量小文件创建)敏感,别盲目追求“全节点都起 ASM 实例”
Flex ASM 的核心复杂点不在开启动作,而在它把 ASM 从“本地服务”变成了“集群服务”,所有依赖 ASM 的组件(DB、ACFS、ADVM)都得重新适应服务发现逻辑。最容易被忽略的是网络层——GNS 必须正常工作,DNS 不能有缓存污染,否则客户端可能卡在连接阶段,日志里只显示超时,不报具体错误。










