RMAN 不能直接将11g备份还原到19c实例并启动,必须执行升级流程,否则因版本不匹配触发ORA-00704/ORA-00702/ORA-01222错误;还原的数据文件、控制文件及SYSTEM表空间仍为11g格式,19c启动时校验版本号失败;RMAN仅复制字节,结构升级依赖catupgrd.sql重写字典、调整SCN逻辑和注入元数据;需在11g源库运行19c preupgrade.jar预处理、清空回收站、编译无效对象、禁用自动任务、确认归档模式;目标19c实例须以NOMOUNT启动,用19c RMAN还原SPFILE和控制文件,MOUNT后RESTORE DATABASE并RECOVER,再SHUTDOWN IMMEDIATE后STARTUP UPGRADE执行catupgrd.sql;须确保备份集为BACKUPSET类型、OS/glibc/JDK符合19c认证、RAC环境部署GI且实例名一致,升级中禁止用户连接及后台任务。

RMAN 不能直接把 11g 备份还原到 19c 实例并正常启动——必须走升级流程,否则必然报 ORA-00704 / ORA-00702 / ORA-01222。
为什么 restore 后 startup 就失败
还原出来的数据文件、控制文件、SYSTEM 表空间头仍是 11g 格式,19c 实例启动时会校验内部版本号。不匹配就中断:
-
ORA-00704:bootstrap 过程失败,obj$等核心字典对象无法加载 -
ORA-00702:SYSTEM 表空间版本低于 19c 要求(如块头字段语义变更) -
ORA-01222:控制文件版本高于当前实例能识别的上限
RMAN 只搬字节,不改结构;版本跃迁靠 catupgrd.sql 重写数据字典、调整 SCN 解析逻辑、注入新特性元数据。
必须在 11g 源库执行的 preupgrade 预处理
跳过这步,后续 STARTUP UPGRADE 很可能卡在编译无效对象或参数冲突上,且错误日志极难定位:
- 用 19c 的
preupgrade.jar扫描源库:/u01/app/oracle/product/19.3.0/dbhome_1/jdk/bin/java -jar /u01/app/oracle/product/19.3.0/dbhome_1/rdbms/admin/preupgrade.jar TERMINAL TEXT -
PURGE DBA_RECYCLEBIN—— 回收站对象会阻塞升级过程中的字典清理 - 运行
@?/rdbms/admin/utlrp.sql编译所有无效对象(尤其 PL/SQL 包体) -
EXEC DBMS_AUTO_TASK_ADMIN.DISABLE—— 关闭自动维护任务,避免升级中触发冲突作业 - 确认
LOG_ARCHIVE_DEST_1可写,且归档模式已启用(ARCHIVELOG)
目标端 19c 实例的最小必要操作序列
全程必须使用 19c 的 ORACLE_HOME,且目标实例初始状态为 NOMOUNT:
- 用 19c 的
rman target /连接空实例 -
RESTORE SPFILE FROM '<backup_location>'</backup_location>;再RESTORE CONTROLFILE FROM '<backup_location>'</backup_location> -
ALTER DATABASE MOUNT—— 此时控制文件仍是 11g 版本,但挂载可成功 -
RESTORE DATABASE;RECOVER DATABASE—— 依赖完整归档链,缺一个SEQUENCE#就失败 -
SHUTDOWN IMMEDIATE;STARTUP UPGRADE(不是STARTUP MOUNT) - 执行
@?/rdbms/admin/catupgrd.sql(或调用dbua)—— 真正的逻辑迁移发生在此步
容易被忽略的硬性兼容点
很多故障源于没验证这些细节:
- 备份集必须是
BACKUPSET类型,不能含IMAGE COPY(XTTS 场景下尤其注意) - 目标端操作系统内核、glibc、JDK 版本需满足 19c 官方认证矩阵(RHEL 6 → RHEL 7 是常见跨代坑)
- 如果源库是 RAC,目标端必须先部署好 19c Grid Infrastructure,且
ORACLE_SID和实例名需与升级脚本预期一致 -
catupgrd.sql运行期间,不能有用户连接数据库,也不能有 job 或 scheduler 任务运行


















