升级RMAN恢复目录前必须确认:目标数据库已升级至新版本且COMPATIBLE≥最低要求;使用新版本rman客户端连接;恢复目录用户已显式授予RECOVERY_CATALOG_OWNER角色。
升级RMAN恢复目录前必须确认的三件事
升级 rman 恢复目录不是执行一条命令就能完事的事——它本质是把旧版本的目录 schema 迁移到新版本 oracle 数据库兼容的结构,一旦出错,list backup、report schema 等依赖目录的操作会直接失败。
- 目标数据库(即存放恢复目录的库)必须已升级到新 Oracle 版本(比如从 19c 升到 23ai),且
COMPATIBLE参数 ≥ 新版本最低要求(如 23ai 要求COMPATIBLE >= 23.0.0) - 连接 RMAN 时必须用新版本的
rman客户端(不能混用旧客户端连新库),否则UPGRADE CATALOG命令根本不可见或报RMAN-00571 - 恢复目录用户(如
RMANCAT)必须有RECOVERY_CATALOG_OWNER角色,且该角色在新版本中未被降权(Oracle 23ai 对该角色权限做了微调,需运行GRANT RECOVERY_CATALOG_OWNER TO rmanuser显式重授)
UPGRADE CATALOG 实际执行流程和关键参数
这个命令不接受任何参数,但执行路径和上下文极其敏感:它只在 RMAN 连接到恢复目录后生效,且必须由目录拥有者(非 SYS)连接。
- 先用新版本
rman连接:rman catalog rmanuser/password@catalog_db(不是target /或connect target) - 执行前务必手动备份目录表空间(如
SYSTEM或自定义的RMAN_TS),因为UPGRADE CATALOG会修改 20+ 张核心表(RC_BACKUP_SET、RC_DATABASE等),中途失败无法回滚 - 输入
UPGRADE CATALOG后,RMAN 会提示 “enter YES to confirm”,这里输YES(大小写敏感,输yes或回车都会跳过) - 升级耗时取决于目录大小;10 万条备份记录通常需 3–8 分钟,期间所有注册的 target 数据库不能执行
RESYNC CATALOG
升级后立即验证的三个硬指标
别信“命令没报错就成功了”——目录升级后 schema 变更可能让某些老脚本静默失效。
- 查
RCVER表确认版本:SELECT * FROM RCVER;输出的VERSION字段必须匹配目标数据库版本(如23.0.0.0.0),不是 RMAN 客户端版本 - 运行
LIST INCARNATION OF DATABASE,如果返回 ORA-19922(“no incarnation found”)或空结果,说明RC_DATABASE和RC_DATABASE_INCARNATION关联异常,需用RESYNC CATALOG强制刷新(注意:这步必须等所有 target 库完成一次全量 resync 才安全) - 检查
V$RMAN_BACKUP_JOB_DETAILS是否能关联到目录数据:在 target 库执行SELECT SESSION_KEY FROM V$RMAN_BACKUP_JOB_DETAILS WHERE START_TIME > SYSDATE-1,再在 catalog 库查SELECT * FROM RC_BACKUP_SET WHERE SESSION_KEY = <value>,两边 key 必须对得上
容易被忽略的兼容性断点
Oracle 21c 起引入了元数据压缩和分区优化,23ai 进一步调整了 RC_BACKUP_PIECE 的 LOB 存储策略——这些改动不会导致升级失败,但会让旧版 RMAN 客户端(如 19c 的 rman)连接新目录后,LIST BACKUP SUMMARY 报 ORA-00904 “invalid identifier”。
- 只要还有旧客户端在用,就必须在目录库上运行:
ALTER TABLE RC_BACKUP_PIECE MODIFY (COMPRESSION ALGORITHM 'BASIC');(仅限 23ai,21c/23ai 兼容模式下必需) - 如果 target 数据库是 Oracle 12.1 以前的老版本(如 11.2.0.4),升级目录后首次
REGISTER DATABASE会失败,需先在 target 库执行:EXEC DBMS_RCVCAT.SET_DATABASE_COMPATIBILITY('11.2.0.4'); -
UPGRADE CATALOG不处理跨平台字符集问题:若目录库从 AL32UTF8 升级到 Unicode 23ai 默认的 UTF8MB4,RC_COMMENT字段超长会被截断,建议升级前导出RC_DATABASE和RC_BACKUP_SET的 comment 列做校验










