是,RAC中每个节点的$ORACLE_HOME/dbs/init.ora仅含SPFILE='ASM路径'一行,真实spfile位于ASM共享存储;需用cat检查该行内容,并用asmcmd ls验证ASM路径是否存在且大小写正确。
确认当前节点的spfile实际路径是否指向ASM
oracle rac中,每个节点的$oracle_home/dbs/init<sid>.ora</sid>通常不存真实参数,只有一行spfile='<asm_path>'</asm_path>。如果这行路径写错(比如指向了不存在的磁盘组、拼写错误或本地文件系统路径),startup会直接失败,且不报具体参数错误。
检查方法:cat $ORACLE_HOME/dbs/init<sid>.ora</sid>,确认SPFILE=后的内容是否为有效ASM路径,如'+DATA/ORCL/spfileORCL.ora';
再用asmcmd ls <asm_path></asm_path>验证该文件是否存在。
- 若路径是
/u01/app/oracle/product/.../dbs/spfile...这类本地路径,说明该节点被误配置为单机模式,需修正为ASM路径 - 若ASM路径存在但
asmcmd报ORA-15032 / ORA-15040,先检查crsctl check css和ASM实例状态 - 注意大小写:ASM中文件名区分大小写,
spfileorcl.ora≠spfileORCL.ora
ORA-00093、ORA-00844这类内存参数报错,必须用pfile绕过spfile加载
像pga_aggregate_limit、sga_target、memory_target等参数一旦设得超出物理限制或违反约束(如memory_target ),数据库在nomount阶段就卡死,根本不会读到控制文件——此时任何<code>ALTER SYSTEM都无效,必须跳过spfile。
操作顺序不能颠倒:
1. 用asmcmd cp +DATA/ORCL/spfileORCL.ora /tmp/spfile.bak把spfile从ASM拉到本地
2. 用strings /tmp/spfile.bak > /tmp/pfile.ora转成可编辑文本(注意:不要用vi直接打开二进制spfile)
3. 编辑/tmp/pfile.ora,修正违规参数(例如把pga_aggregate_limit=1G改成pga_aggregate_limit=4G)
4. 启动:sqlplus / as sysdba → startup nomount pfile='/tmp/pfile.ora'
- 若提示
ORA-01078: failure in processing system parameters,说明pfile里还有非法语法(比如多了一个逗号、引号不闭合),逐行检查 -
create pfile from spfile在实例未启动时不可用,只能靠strings硬解 - 改完后务必用新pfile重建spfile:
create spfile='+DATA/ORCL/spfileORCL.ora' from pfile='/tmp/pfile.ora',否则下次仍走旧spfile
srvctl启动失败但SQL*Plus能启,大概率是srvctl注册的spfile路径没更新
srvctl start database -d ORCL失败,而手动sqlplus / as sysdba + startup能成功,说明数据库本身参数没问题,问题出在CRS资源元数据里记录的spfile路径与实际不符。
查当前注册值:srvctl config database -d ORCL | grep "Spfile"
若输出是Spfile: +DATA/ORCL/spfileORCL_old.ora这种已删除或重命名的路径,就得强制更新:
- 用
srvctl modify database -d ORCL -p '+DATA/ORCL/spfileORCL.ora'同步路径 - 修改后执行
srvctl stop database -d ORCL && srvctl start database -d ORCL验证 - 注意:-p参数必须是完整ASM路径,不能省略磁盘组名(如
+DATA)
两个节点spfile内容不一致,RAC会静默忽略差异但启动行为不可控
RAC不校验各节点spfile内容一致性。如果节点1的spfile里cluster_database=true,节点2却漏了这行,节点2可能启动到mount状态就停住,且crsctl stat res -t显示资源为OFFLINE而非FAILED——这种“半启动”状态最难排查。
验证方式:
在节点1执行:sqlplus / as sysdba → show parameter cluster_database
在节点2同样执行,对比输出是否完全一致;
更彻底的做法:分别导出两节点spfile为pfile,用diff比对。
- 修复原则:统一用一个节点生成最终spfile,再通过
create spfile from pfile覆盖所有节点 - 切勿在节点2上手动改
$ORACLE_HOME/dbs/init<sid>.ora</sid>指向本地pfile,这会让该节点脱离RAC管理 - 真正麻烦的是参数冲突类问题(如一个节点设
_gc_policy_time=0,另一个没设),这类隐式差异往往要等到高并发DML才暴露











