ORA-19606是RMAN主动拒绝向快照控制文件路径写入的硬性保护机制,因该文件仅作备份期间静态视图使用,禁止覆盖或删除;触发操作包括delete obsolete、restore controlfile等目标路径匹配当前SNAPSHOT CONTROLFILE NAME时。
ora-19606 不是权限或磁盘满的直接报错,而是 rman 主动拒绝向快照控制文件路径写入数据——它把 snapcf_*.f 当作只读一致性快照,不是普通文件。
为什么 delete obsolete 或 restore controlfile 会触发 ORA-19606
RMAN 在执行 delete obsolete、restore controlfile 或 crosscheck controlfilecopy 时,若目标路径恰好是当前配置的快照控制文件(由 CONFIGURE SNAPSHOT CONTROLFILE NAME 指定),就会立即报 ORA-19606: Cannot copy or restore to snapshot control file。这不是权限问题,也不是文件被占用,是 RMAN 的硬性保护机制。
- 快照控制文件在备份任务启动时自动生成,用于提供控制文件的静态视图
- 它默认位于
$ORACLE_HOME/dbs/snapcf_<db_name>.f或 ASM 共享路径(RAC 环境必须共享) - RMAN 明确禁止任何操作覆盖或写入该路径——哪怕你只是想删掉一个旧的副本
检查并确认当前快照控制文件路径
先用 show all 查出实际生效的路径,别信文档默认值:
RMAN> show all; ... CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/u01/app/oracle/product/19c/dbhome_1/dbs/snapcf_cdb.f';
如果输出是 TO DEFAULT,说明用了 Oracle 默认路径,此时需手动查:
- Linux/Unix:
ls -l $ORACLE_HOME/dbs/snapcf_*.f - ASM:
asmcmd ls +DATA/<db_unique_name>/snapcf_*.f
注意:show snapshot controlfile name 命令在部分老版本(如 11.2)中不可用,show all 是最可靠方式。
修复步骤:临时切换路径 + 清理残留副本
核心思路是「绕开」原路径,让 RMAN 不再把它当快照目标,再清理旧副本:
- 执行
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/tmp/snapcf_temp.f';(路径需 Oracle 用户有写权限) - 在操作系统层删除原快照文件(如
/u01/app/oracle/.../snapcf_cdb.f),或重命名留痕 - 在 RMAN 中运行:
crosscheck controlfilecopy '/u01/app/oracle/.../snapcf_cdb.f';→ 状态会变EXPIRED - 再执行:
delete expired controlfilecopy '/u01/app/oracle/.../snapcf_cdb.f'; - 最后恢复原配置(可选):
CONFIGURE SNAPSHOT CONTROLFILE NAME CLEAR;或设回原路径
完成后,delete obsolete 和 backup database 就不会再撞上这个路径冲突。
RAC 环境下必须注意的共享路径问题
在 RAC 中,快照控制文件路径必须指向所有实例都能访问的共享存储,否则会出现部分节点备份成功、部分失败,且错误可能表现为 ORA-00234 或静默卡住:
- 绝对不能用本地文件系统路径(如
/u01/...),除非所有节点挂载同一 NFS - 推荐使用 ASM 路径:
+DATA/cdb/snapcf_cdb.f,确保asm_diskstring配置一致 - 修改后务必在所有节点上验证:
sqlplus / as sysdba -c "select name from v$controlfile;"是否包含该路径
最容易被忽略的是:即使你没手动改过 SNAPSHOT CONTROLFILE NAME,RMAN 也可能继承了某次手工配置的残留值,且该值在不同节点间未同步——所以每次遇到 ORA-19606,第一件事就是 show all 看真实配置,而不是猜默认值。


















