在Oracle RAC集群的日常运维中,ASM磁盘组的兼容性参数经常被忽视,直到集群升级或者新版本数据库要挂载旧磁盘组时,才会暴露出compatible参数不匹配的报错。典型场景是:数据库软件已经升到19c,但磁盘组的compatible.rdbms还停留在11.2,导致一些新特性无法使用,甚至在创建新数据库时直接报错。这篇文章就来系统讲讲ASM磁盘组兼容性参数的原理、修改方法和注意事项。

一、compatible.asm和compatible.rdbms到底控制什么
ASM磁盘组有两个核心兼容性属性:compatible.asm和compatible.rdbms。前者控制磁盘组本身的元数据格式,也就是ASM实例使用这个磁盘组时所需的最低软件版本;后者控制的是数据库实例访问该磁盘组时所需的最低数据库版本。这两个参数一旦设置,就只能调高,不能调低,这是ASM设计上的硬性限制,因为调高参数可能会触发磁盘组内部数据结构的不可逆变更。
实际工作中有一条重要的依赖规则:compatible.asm必须大于等于compatible.rdbms,也就是说你不能让ASM兼容性低于数据库兼容性。此外,磁盘组的AU大小、智能数据摆放、快照磁盘组等高级特性都依赖较高的compatible.asm取值,例如要做OCR存放在AFD磁盘组、或者使用磁盘组级别的在线迁移功能,通常都要求compatible.asm达到12.1或12.2以上。
查看当前所有磁盘组的兼容性设置很简单,以grid用户连接ASM实例后执行:
-- 在grid用户下进入SQL*Plus,如通过本地Windows客户端远程连接 -- 连接串示例(Windows路径下的tnsnames.ora位于 C:\app\product\19.0.0\dbhome\network\admin) set linesize 200 col name for a20 col compatibility for a30 col database_compatibility for a30 SELECT group_number, name, compatibility, database_compatibility FROM v$asm_diskgroup;
查询结果中的COMPATIBILITY列对应compatible.asm,DATABASE_COMPATIBILITY列对应compatible.rdbms。如果发现取值偏低,先别急着改,需要按下一节的方法确认依赖关系。
二、修改前的依赖检查与影响评估
修改兼容性参数的第一个前提是确认集群中所有节点的GI软件版本都达到目标版本。假设你打算把compatible.asm调到19.0.0.0,那么所有节点的Grid Infrastructure都必须是19c,包括正在滚动升级过程中的中间状态也要考虑。可以通过以下语句确认ASM实例自身软件版本:
SELECT instance_name, version, status FROM v$asm_client; SELECT version FROM v$instance;
第二个前提是确认挂载该磁盘组的所有数据库的compatible初始化参数。如果磁盘组的compatible.rdbms被调到19.0.0.0,那么所有使用该磁盘组的数据库实例compatible参数也必须不低于这个值,否则数据库实例下次启动时会报ORA-15121错误无法挂载。检查数据库侧的取值:
-- 在数据库实例执行 SELECT name, value FROM v$parameter WHERE name = 'compatible'; -- 查看哪些数据库正在使用该磁盘组 SELECT dg.name, c.db_name, c.version FROM v$asm_diskgroup dg, v$asm_client c WHERE dg.group_number = c.group_number;
第三个评估点是修改是否可逆。对于compatible.rdbms来说,如果磁盘组内没有发生实际的元数据结构升级,某些小版本调整在特殊情况下可以通过降级流程处理,但官方明确不建议依赖这一点,生产环境操作前应当把不可逆作为默认假设,做好备份和变更方案评审,OCR和表决磁盘所在的磁盘组尤其要谨慎。
三、修改磁盘组兼容性的完整操作步骤
确认依赖满足后,修改本身非常简单,用ALTER DISKGROUP语句即可完成,而且是在线操作,不需要停数据库实例。登录任意一个节点的ASM实例执行:
-- 以sysasm身份连接ASM实例 -- sqlplus / as sysasm ALTER DISKGROUP DATA SET ATTRIBUTE 'compatible.asm' = '19.0.0.0'; ALTER DISKGROUP DATA SET ATTRIBUTE 'compatible.rdbms' = '19.0.0.0'; -- FRA磁盘组同样处理 ALTER DISKGROUP FRA SET ATTRIBUTE 'compatible.asm' = '19.0.0.0'; ALTER DISKGROUP FRA SET ATTRIBUTE 'compatible.rdbms' = '19.0.0.0';
执行完成后,建议立即验证属性是否生效,并且观察告警日志确认没有报错:
-- 验证属性值
SELECT group_number, name, compatibility, database_compatibility
FROM v$asm_diskgroup
WHERE name IN ('DATA','FRA');
-- 查看磁盘组属性明细
SELECT dg.name, a.name, a.value
FROM v$asm_diskgroup dg, v$asm_attribute a
WHERE dg.group_number = a.group_number
AND a.name LIKE 'compatible%';
需要注意的是,修改compatible.asm时ASM会在磁盘组内执行一次性的元数据格式升级,期间磁盘组会短暂进入rebalance式的内部操作,对于超大磁盘组(几十TB以上)可能持续一段时间,建议安排在业务低峰执行。修改完成后可以观察v$asm_operation确认没有遗留的后台操作:
SELECT group_number, operation, state, est_minutes FROM v$asm_operation;
四、常见报错与注意事项汇总
操作中最常见的错误是ORA-15221和ORA-15242。前者通常出现在试图降低参数时,属于正常的保护机制;后者多半是尝试将compatible.asm设置为低于compatible.rdbms的值,违反了依赖规则。遇到这些报错先检查目标版本的依赖链,而不是反复重试。
几个实用的运维建议:第一,修改前用kfed或者直接通过v$asm_attribute导出一份当前属性的完整快照存档,方便变更后比对;第二,OCR所在的磁盘组兼容性调整要额外确认ocrcheck输出正常,命令为ocrcheck,调整后建议再跑一次cluvfy comp asm做集群校验;第三,如果集群还在滚动升级的中间阶段,务必等所有节点补丁和GI版本一致后再调整参数,否则未升级节点会直接无法挂载磁盘组,导致节点驱逐。
最后强调一次核心原则:兼容性参数是单向阀门,只能升不能降,所有调整动作都要建立在充分评估和可验证的备份基础之上。掌握好参数依赖关系、检查方法和在线修改流程,RAC集群的ASM磁盘组兼容性管理就会变得清晰可控。
Oracle RACASM磁盘组compatible.rdbms修改时间:2026-09-06 05:48:34