Flex ASM是Oracle 12c引入的高可用特性,本质是将ASM实例从“每节点必有”改为“集群内按需分布”,默认基数为3,支持跨节点远程访问与故障自动切换;传统ASM则要求每个节点必须运行本地ASM实例,强依赖导致单点故障。

Flex ASM 解决了传统 ASM 实例单点故障导致数据库无法启动的问题,核心是让数据库实例不再强依赖本地 ASM 进程。
Flex ASM 是什么,和传统 ASM 有什么本质区别
传统 RAC 中,每个节点必须运行一个本地 ASM 实例,所有数据库实例都通过该节点的 ASM 实例访问磁盘组;一旦这个 ASM 实例宕机或所在节点异常,该节点上的数据库实例就无法启动或会中断 —— 这就是典型的单点故障。
Flex ASM 则把 ASM 实例从“每节点必有”变成“集群内按需分布”,默认只在部分节点(通常是中心节点)运行有限数量的 ASM 实例(基数默认为 3),其他节点不运行 ASM,而是通过集群网络远程连接到可用的 ASM 实例。当某个 ASM 实例失败时,Oracle Clusterware 自动将客户端重定向到其他存活的 ASM 实例,整个过程对上层数据库实例透明。
关键判断依据是:INSTANCE_TYPE 参数值为 ASMPROX 表示当前连接的是代理模式(即 Flex ASM 模式),而不是传统 ASM。
如何确认当前是否启用 Flex ASM
不能只看安装时选了什么,得查运行时状态:
- 用
asmcmd showclustermode:输出FLEX表示集群处于 Flex 模式(强制启用 Flex ASM) - 用
srvctl config asm:若显示ASM is enabled on nodes: node1,node2但未列全所有节点,大概率是 Flex 模式 - 连入任意
ASM实例执行SELECT INSTANCE_TYPE FROM V$INSTANCE;:返回ASMPROX才是 Flex ASM 正在生效;返回ASM就是传统模式
注意:showclustermode 显示 STANDARD 并不绝对代表没开 Flex ASM —— 它可能被手动启用了,所以必须结合 INSTANCE_TYPE 验证。
Flex ASM 对数据库实例启动和故障恢复的实际影响
最直接的好处体现在两个场景:
- 节点重启后,数据库实例无需等待本机
ASM启动完成,只要集群中有任一ASM实例在线,就能通过代理连接并打开数据库 - 当某节点的
ASM实例因内存溢出、ORA-600 等异常退出时,已运行的数据库实例不会立即中止,而是由Clusterware在几秒内完成 ASM 连接切换,业务连接通常无感知(前提是应用连接串配置了FAILOVER=ON) - 叶节点(leaf node)完全不运行
ASM,却仍可运行数据库实例 —— 这种能力只在 Flex ASM + Flex Cluster 组合下才成立
但要注意:Flex ASM 不降低对共享存储本身的依赖。如果 OCR 磁盘组或数据磁盘组不可访问,无论 ASM 是哪种模式,数据库都会无法启动或报 ORA-15032 / ORA-15040 类错误。
Flex ASM 的配置与常见误操作
它不是装完 Grid Infrastructure 就自动开启的,需要显式启用:
- 新集群安装时,在
runInstaller图形界面勾选Configure Oracle Flex Cluster,Flex ASM 会随之启用 - 已有标准集群可通过
asmca图形工具或命令行srvctl modify asm -count N(N ≥ 1)来启用,但必须确保网络满足要求(至少一个专用 ASM 网络可用) - 禁用 Flex ASM 必须先停掉所有数据库实例,再用
srvctl disable asm,否则会报PRCR-1079
最容易被忽略的一点:Flex ASM 的 ASM 基数(asm count)设得太低(比如 1),虽然能跑通,但一旦那个唯一 ASM 实例挂了,整个集群的 ASM 访问就全部中断 —— 实际上又回到了单点故障。生产环境建议设为 ≥3,并确保这些 ASM 实例分布在不同物理节点上。











