物理dg不能跨版本滚动升级,必须转逻辑dg:先执行dbms_logstdby.build、启用主键级补充日志、扫描并处理不兼容对象;停sql apply后运行autoupgrade;升级后重建逻辑dg并执行三次archive log current确保归档完整。

物理DG不能跨版本滚动升级,这是硬限制
Oracle 11g主库和19c备库无法共存于同一物理DG链路中——ORA-16700或ORA-16778不是配置错误,而是架构级不兼容。11g的redo块结构、SCN编码、数据字典格式与19c完全不同,备库根本无法解析主库生成的归档日志。官方文档明确禁止该组合,任何试图“边同步边升级”的操作都会导致MRP进程挂起或崩溃。
唯一可行路径:转逻辑DG再升级备库
逻辑DG用SQL Apply替代块重放,能跨版本运行,但前提是主库必须满足三要素:
- 执行
EXEC DBMS_LOGSTDBY.BUILD——否则备库缺少LogMiner字典,无法将11g redo反解为SQL - 开启主键级补充日志:
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS——仅ADD SUPPLEMENTAL LOG DATA不够,缺主键列日志会导致UPDATE/DELETE丢失 - 扫描不兼容对象:
SELECT * FROM DBA_LOGSTDBY_UNSUPPORTED和SELECT * FROM DBA_LOGSTDBY_NOT_UNIQUE WHERE BAD_COLUMN = 'Y'——遇到LONG、无主键表、含ROWID列的表,必须提前加RELY DISABLE约束或改表结构
autoupgrade不能在SQL Apply运行时执行
SQL Apply进程会持续持有数据字典锁,与autoupgrade争抢资源,极易触发ORA-00054: resource busy或升级中途卡死。正确顺序是:
- 停应用:
ALTER DATABASE STOP LOGICAL STANDBY APPLY - 确认
V$LOGSTDBY.STATE为APPLYING BATCH或IDLE后再启动升级 - 执行:
autoupgrade -mode UPGRADE -oracleHome /u01/app/oracle/product/19c - 升级完成后必须重建逻辑DG:用19c软件重新配置
LOG_ARCHIVE_DEST_2,并运行DBMS_LOGSTDBY.INSTANTIATE_TABLE补全差异对象,不能直接RESUME
切换前必须做三次ARCHIVE LOG CURRENT
从11g主库切到19c逻辑备库,ALTER DATABASE COMMIT TO SWITCHOVER只是表面动作。真正决定成败的是归档日志是否全部落盘传输。生产环境务必执行三次ALTER SYSTEM ARCHIVE LOG CURRENT,确保最后一批redo被强制归档并推送到备库。漏掉这一步,切换后大概率出现“备库已切为主但缺失末尾事务”的静默数据丢失——这种问题不会报错,但业务账务对不上。











