ORA-00245错误本质是RAC中snapshot controlfile未置于共享存储,导致多实例无法一致访问;必须将其配置为ASM磁盘组路径(如+DATA/dbname/snapcf_dbname.f),并确保所有节点对该ASM组挂载且权限一致。
ora-00245 不是备份失败,而是 rman 备份控制文件时无法创建快照副本 —— 根本原因是 rac 中控制文件路径未在所有节点间共享,导致 snapshot controlfile 无法被所有实例一致访问。
为什么 RMAN 备份会触发 ORA-00245
RMAN 在执行 BACKUP DATABASE 或 BACKUP ARCHIVELOG 时,默认会先尝试对控制文件做一致性快照(即 snapshot controlfile),这个快照文件由 control_file_record_keep_time 和 RMAN 自动管理,但它的物理位置由参数 snapcf_<code>db_name.f 决定,默认写在本地 $ORACLE_HOME/dbs/ 下。在 RAC 中,每个节点的 $ORACLE_HOME 是本地的,而 snapshot controlfile 必须被所有实例同时读写 —— 否则一个节点写入、另一个节点读不到或读到旧版本,就会报 ORA-00245: control file backup failed; target is not connected to recovery catalog(注意:该错误信息有误导性,“not connected to recovery catalog” 是干扰项,实际与 catalog 无关)。
- 错误本质是:snapshot controlfile 路径不是共享存储(如 ASM 或集群可见的 NFS)
- 即使你没显式指定
CONFIGURE CONTROLFILE AUTOBACKUP ON,RMAN 仍会在备份过程中隐式创建 snapshot - 该问题在单实例中不会出现,只在 RAC 中暴露
确认当前 snapshot 控制文件路径
用任意节点连接数据库后执行:
SQL> show parameter snapshot
你会看到类似输出:
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ snapshot_controlfile_name string /u01/app/oracle/product/19c/dbhome_1/dbs/snapcf_racdb.f
如果 VALUE 是本地路径(含 /dbs/、/database/ 或绝对路径指向本地文件系统),就必然出错。
- 必须改为 ASM 路径,例如:
+DATA/racdb/snapcf_racdb.f - 不能用 NFS 路径(除非经严格验证且所有节点 mount 选项完全一致,不推荐)
- 不能用相对路径或环境变量(如
$ORACLE_HOME),RAC 实例无法解析
修改 snapshot 控制文件路径(必须在所有节点生效)
该参数是动态可改的,但需在 所有实例都在线 的情况下执行(否则非当前实例会丢失同步):
SQL> ALTER SYSTEM SET snapshot_controlfile_name='+DATA/racdb/snapcf_racdb.f' SCOPE=BOTH SID='*';
-
SID='*'是关键:确保命令下发到所有实例,不是只改当前连接的实例 - 路径中的
racdb必须与你的 DB_NAME 完全一致(区分大小写,尤其在 ASM 中) - 执行前确认
+DATA磁盘组已挂载且所有节点均可访问:SELECT NAME, STATE FROM V$ASM_DISKGROUP; - 如果报错 “diskgroup not mounted”,说明某个节点没挂上该 DG,需先用
ALTER DISKGROUP DATA MOUNT;手动挂载
验证是否修复 & 容易忽略的坑
改完后不要立刻跑全备,先做最小验证:
RMAN> CONNECT TARGET / RMAN> BACKUP CURRENT CONTROLFILE;
若成功,说明 snapshot 路径已生效。但仍有三个隐蔽风险点:
- 如果之前
CONTROL_FILES参数里的控制文件本身不在共享存储(比如还残留着/u01/oradata/racdb/control01.ctl),虽然 ORA-00245 暂时消失,但 RAC 高可用已失效 —— 必须确保show parameter control_files返回的所有路径都在 ASM(如+DATA/.../controlfile/current.xxx) - 修改
snapcf_*.f路径后,旧的本地 snapshot 文件不会自动清理,建议手动删掉(如rm $ORACLE_HOME/dbs/snapcf_*.f),避免磁盘占满 - 某些老版本(如 11.2.0.3 及之前)存在 bug:即使设了 ASM 路径,RMAN 仍可能 fallback 到本地。此时必须打补丁或升级到 11.2.0.4+ / 12.1+
最稳妥的做法是:snapshot 控制文件路径 + 主控制文件路径,两者都落在同一 ASM 磁盘组,并且所有节点对该磁盘组的权限、挂载状态、UDEV 权限完全一致 —— 缺一不可。


















