dbms_rolling.build报ora-16234说明源库版本低于12.1.0.2,属硬性限制而非配置问题;必须确保主库为12.1.0.2及以上、compatible≥'12.1.0'、禁用dg broker(12.2.0.1前)、启用闪回及强制日志。
dbms_rolling.build 报 ora-16234 怎么办
直接报 ora-16234: database version is not supported for rolling upgrade,说明源库版本低于 12.1.0.2。这个错误不是配置问题,而是硬性拦截——dbms_rolling 从设计上就拒绝 11g 或早期 12c(如 12.1.0.1)作为起点。
- 查当前版本:
SELECT * FROM v$version;,确认是否真为12.1.0.2或更高 -
COMPATIBLE参数必须 ≥'12.1.0',否则BUILD阶段直接失败 - 若主库是 11g,别折腾绕过检查——哪怕临时 patch 也无效,内部日志解析器不兼容,后续必卡在
PREPARE阶段 - 物理备库必须已启用闪回(
FLASHBACK ON),且归档、强制日志(FORCE LOGGING)均已开启
升级前必须禁用 DG Broker 吗
取决于 Oracle 版本:12.2.0.1 之前必须禁用,12.2.0.1 及以后可保留启用状态,但需确保 Broker 配置与 DBMS_ROLLING 操作不冲突。
- 禁用命令:
DISABLE DATABASE <primary_db_name>;</primary_db_name>(在 DGMGRL 中执行) - 升级完成后可重新启用,但不能在
START_PLAN到FINISH_PLAN之间操作 Broker - 若未禁用且版本 DBMS_ROLLING.START_PLAN 会报
ORA-16661或静默失败 -
LOG_ARCHIVE_DEST_n中的VALID_FOR必须包含(ONLINE_LOGFILES,PRIMARY_ROLE),否则切换后日志无法传输
为什么 DBMS_ROLLING.UPGRADE_DATABASE 卡在 PREPARE 阶段
常见于表结构不兼容或环境约束未满足,不是超时问题,而是校验失败后主动挂起。
- 含
LONG、LONG RAW字段的表,或无主键的表,会导致BUILD阶段失败,根本进不了UPGRADE_DATABASE - 逻辑备库同步受限字段(如
ROWID、UROWID、XMLTYPE)未提前清理,DBA_LOGSTDBY_UNSUPPORTED中有记录则升级后同步中断 - 目标 19c 安装目录下缺少
$ORACLE_HOME/OPatch,或权限不对(必须 oracle 用户可读写) - ASM 磁盘组未统一挂载、OCR/VOTEDISK 不在 ASM 中,也会在 PREPARE 阶段被检测并阻断
autoupgrade.jar 能混用吗
不能。19c 逻辑备库升级必须用 19c 自带的 autoupgrade.jar,混用 12c 或 18c 版本会触发字典校验失败或 MRP 进程崩溃。
- 路径必须是
$ORACLE_HOME/rdbms/admin/autoupgrade.jar(19c 安装介质自带) - 启动参数中必须加
-disable_implicit_log_archive=TRUE,否则 11g 生成的归档格式会让 19c 的 LogMiner 解析异常 - 升级前需手动清空逻辑备库上的
DBA_LOGSTDBY_LOG和V$LOGSTDBY_PROGRESS视图缓存,避免残留状态干扰 -
UPGRADE_DATABASE实际调用的就是autoupgrade,只是封装了参数传递和角色切换逻辑
跨代升级(如 11g→19c)永远不要尝试用 DBMS_ROLLING 强行推进——它不是开关,而是一套依赖底层日志语义一致性的自动化流水线。一旦版本越界,失败点不在某一步骤,而在整个执行模型的根基上。











