简介:本资源是一份面向Oracle数据库管理员(DBA)的实战型升级指南,聚焦使用Database Upgrade Assistant(DBUA)将生产环境中的Oracle 11g(特别是11.2.0.4)安全、可控地升级至长期支持版Oracle 19c,解决老旧版本停服、安全补丁缺失及架构演进等核心运维痛点。资源为单文件PDF手册,共3.18MB,内容结构完整,涵盖升级前检查清单、RHEL7环境下源库备份与目标库恢复实操(含SPFILE还原、PFILE定制、归档追加等关键步骤)、DBUA图形/静默双模式操作流程、兼容性验证要点,以及基于MOS官方文档(如Doc ID 2545064.1)提炼的典型故障应对方案。已有1354人学习下载,适合具备Linux系统基础与Oracle基本运维能力的中高级DBA,在真实升级项目中作为可信赖的操作蓝本与排错参考。
1. “RMAN-06054: media recovery requesting unknown archived log”——这个报错一出现,升级就卡死在最后一步,90% 的 DBA 都会懵:归档明明在目录里,DBUA 却说“找不到”,重跑 recover 命令反复报错,日志里翻不出线索,备份集 list 得清清楚楚,时间点也对得上……更玄学的是,read only 打开能成功,但只要一执行RECOVER DATABASE就崩;手动追到某个 SCN 能过,再往前推半分钟又失败。这不是配置漏了、权限错了那种低级问题,而是 Oracle 升级黑匣子最典型的「时序幻觉」:控制文件里的 SCN 视图、归档日志的物理命名、备份集元数据三者之间存在毫秒级错位,而 DBUA 在静默模式下根本不暴露这些细节。如果你正被这个报错堵在 Oracle 11g 到 19C 升级的最后一公里,别急着删库重来——这本《Oracle 11g 到 19C 数据库升级详尽指导手册》就是为这种血泪现场写的:它不讲理论,只复现你刚敲完recover database后看到 RMAN-06054 的那一刻,然后带你一层层剥开 control file、archivelog header、backup piece metadata 之间的隐式依赖关系,最终用三行命令+一个参数修正,让恢复流程稳稳落到目标 SCN 上。适合所有已做完 RMAN 全备、已建好 19C ORACLE_HOME、却卡在“恢复后无法 open upgrade”的运维工程师。
2. 控制文件版本错位:为什么REPORT SCHEMA显示数据文件路径全是 +ASM,而你的实际环境是文件系统?
2.1 根因:控制文件残留 11g ASM 元数据,与 19C 文件系统路径不兼容
这是整个升级流程中最隐蔽、最容易被忽略的“第一颗地雷”。从你执行RESTORE CONTROLFILE FROM '...'开始,RMAN 恢复的不是一张白纸,而是源库(11g)最后一次BACKUP CONTROLFILE时的快照。如果源库运行在 ASM 上(如文档中+DATA/bsoftsb/datafile/system.270.979224249),那么控制文件里所有数据文件路径都以+DATA/...形式硬编码。而你的目标环境是传统文件系统(/oradata/BSOFTSB/datafile/),但 DBUA 启动时读取的仍是这份带 ASM 路径的控制文件——它不会自动做路径映射,也不会报错,只是默默把REPORT SCHEMA输出成一堆***(表示“路径不可访问”),并导致后续RESTORE DATABASE时 RMAN 试图去+DATA/...下找文件,自然失败。
提示:
RMAN-06139: WARNING: control file is not current for REPORT SCHEMA这条警告不是废话,它是 Oracle 在悄悄告诉你:“我手里的控制文件已经过期,别信它输出的路径”。
2.2 解决:强制重建控制文件并重写路径映射
必须在RESTORE CONTROLFILE后、RESTORE DATABASE前,用CREATE CONTROLFILE手动重建一份纯文件系统的控制文件。关键不是“重建”,而是显式声明所有数据文件的新位置:
-- 1. 先确认当前控制文件状态 SQL> SELECT NAME, STATUS FROM V$CONTROLFILE; -- 输出应为 /oradata/bsoftsb/controlfile/control01.dbf,且 STATUS=ONLINE -- 2. 生成 trace 文件(获取当前控制文件结构) SQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS '/tmp/controlfile_trace.sql'; -- 3. 编辑 /tmp/controlfile_trace.sql,将所有 +DATA/... 替换为 /oradata/BSOFTSB/datafile/ -- 并修改 CREATE CONTROLFILE 语句: CREATE CONTROLFILE REUSE DATABASE "BSOFTSB" NORESETLOGS ARCHIVELOG MAXLOGFILES 192 MAXLOGMEMBERS 3 MAXLOGHISTORY 292 MAXLOGGROUPS 20 MAXINSTANCES 8 LOGFILE GROUP 1 '/oradata/BSOFTSB/redo01.log' SIZE 200M, GROUP 2 '/oradata/BSOFTSB/redo02.log' SIZE 200M, GROUP 3 '/oradata/BSOFTSB/redo03.log' SIZE 200M -- 注意:这里必须列出所有 ONLINE 日志组,不能省略 DATAFILE '/oradata/BSOFTSB/datafile/system01.dbf', '/oradata/BSOFTSB/datafile/sysaux01.dbf', '/oradata/BSOFTSB/datafile/undotbs01.dbf', '/oradata/BSOFTSB/datafile/users01.dbf' -- ⚠️ 重点:此处必须按实际 restore 后的文件名逐个列出,不能写通配符 CHARACTER SET AL32UTF8;2.3 执行重建并验证
关闭数据库,用新脚本重建:
SQL> SHUTDOWN IMMEDIATE; SQL> STARTUP NOMOUNT; -- 执行上面编辑好的 /tmp/controlfile_trace.sql(注意去掉注释) SQL> @/tmp/controlfile_trace.sql; -- 验证是否生效 SQL> SELECT FILE_NAME FROM DBA_DATA_FILES; -- 输出应全为 /oradata/BSOFTSB/datafile/xxx.dbf,无 +DATA 字样 SQL> SELECT NAME FROM V$DATAFILE; -- 必须与 DBA_DATA_FILES 一致逻辑说明:CREATE CONTROLFILE不是从备份恢复,而是从零构建一份新的控制文件元数据。它强制覆盖了旧控制文件中所有 ASM 路径,把V$DATAFILE、DBA_DATA_FILES的底层视图彻底刷新为文件系统路径。DBUA 后续调用RESTORE DATABASE时,RMAN 才会真正按/oradata/...去定位文件,而不是徒劳地搜索+DATA/...。
参数说明:
NORESETLOGS:因为你是从完整备份恢复,且归档连续,无需重置日志序列;若选RESETLOGS,会导致后续RECOVER DATABASE无法衔接归档。ARCHIVELOG:必须保持归档模式,否则 DBUA 升级校验会失败。DATAFILE列表:必须与RESTORE DATABASE后实际生成的文件名完全一致(可通过ls -l /oradata/BSOFTSB/datafile/确认),少一个或名字错一个,ALTER DATABASE OPEN时直接报ORA-01157: cannot identify/lock data file。
3. 归档日志断链:RMAN-06054 不是“没归档”,而是“归档头信息不匹配”
3.1 根因:归档日志的NEXT SCN与控制文件CURRENT SCN存在跨版本解析偏差
RMAN-06054: media recovery requesting unknown archived log for thread 1 with sequence 25197 and starting SCN of 18157927920这条报错,表面看是缺归档,实则是 Oracle 11g 和 19C 对归档日志头(header)中NEXT SCN字段的解析逻辑不同。11g 备份的归档日志,在 19C 的 RMAN 中读取时,其NEXT SCN可能被解析为一个“理论上存在但物理上未生成”的值(比如 18157927920),而实际归档日志sequence 25197的NEXT SCN是 18157927919 —— 差 1。这种微小偏差在 11g 内部自洽,但 19C 的 recover 引擎更严格,要求NEXT SCN必须严格等于下一个归档的FIRST SCN,否则拒绝衔接。
验证方法:
-- 查看报错所指归档的实际 header $ oradub -v /hisbak/BSOFT_arch_562120512_20220831_40473 -- 关键字段:LOW SCN, NEXT SCN, SEQUENCE# -- 对比控制文件当前 SCN SQL> SELECT CURRENT_SCN FROM V$DATABASE; -- 若 CURRENT_SCN = 18157927919,而报错要 18157927920,则差 13.2 解决:用SET UNTIL SCN精确锚定恢复终点,绕过 NEXT SCN 校验
当SET UNTIL TIME因时区/精度问题失效时,SET UNTIL SCN是唯一可靠方案。它不依赖归档日志头的NEXT SCN,而是直接告诉 RMAN:“恢复到这个 SCN 就停,不管下一个归档是否存在”。
RMAN> RUN { ALLOCATE CHANNEL C1 DEVICE TYPE DISK; ALLOCATE CHANNEL C2 DEVICE TYPE DISK; -- 关键:用实际存在的 SCN,而非报错提示的 SCN SET UNTIL SCN 18157927919; -- 此值来自 V$DATABASE.CURRENT_SCN 或上一个归档的 NEXT SCN RECOVER DATABASE; RELEASE CHANNEL C2; RELEASE CHANNEL C1; }逻辑说明:SET UNTIL SCN让 RMAN 完全跳过归档日志链的“无缝衔接”校验,转而采用 SCN 数值比较。只要归档日志中包含SCN <= 18157927919的所有变更,RMAN 就会应用它们并停止,不再尝试读取sequence 25197。这相当于把“恢复过程”从“按日志序列流式衔接”降级为“按 SCN 区间批量应用”,规避了版本间 header 解析差异。
参数说明:
SCN值必须来自可信源:优先用SELECT CURRENT_SCN FROM V$DATABASE(在源库正常运行时查),次选用LIST BACKUP OF ARCHIVELOG ALL输出中最后一个归档的NEXT SCN。- 绝对不要用报错信息里的
starting SCN of 18157927920直接减 1,因为该值本身可能是 11g 解析错误的结果;必须用V$DATABASE或LIST BACKUP的真实输出反推。
3.3 补充:修复归档日志物理命名不一致问题
有时LIST BACKUP OF ARCHIVELOG显示归档存在,但RECOVER仍报unknown archived log,原因是归档日志文件名与控制文件期望的LOG_ARCHIVE_FORMAT不匹配。例如控制文件中设置*.log_archive_format='%t_%s_%r.dbf',但备份的归档是arch_1_25197_1040307001.arc。
解决:在RESTORE CONTROLFILE后、RECOVER前,强制重设归档格式并 catalog:
SQL> ALTER SYSTEM SET LOG_ARCHIVE_FORMAT='arch_%t_%s_%r.arc' SCOPE=SPFILE; SQL> SHUTDOWN IMMEDIATE; SQL> STARTUP MOUNT;然后重新 catalog 归档目录:
RMAN> CATALOG START WITH '/hisbak/'; RMAN> LIST ARCHIVELOG ALL; -- 确认输出的文件名与磁盘实际文件名一致4. DBUA 静默升级失败:dbua -silent报 ORA-00600 或挂起,根本原因不在参数
4.1 根因:DBUA 静默模式强制校验compatible参数,而 11g pfile 中compatible='11.2.0.4.0'与 19C 不兼容
DBUA 在启动时会读取源库的pfile或spfile,检查compatible参数是否 ≥ 目标版本最低要求。Oracle 19C 要求compatible >= 11.2.0.4(满足),但 DBUA 的静默校验逻辑更激进:它要求compatible必须显式设为19.0.0或更高,否则直接报ORA-00600: internal error code(实际是校验失败的伪装错误)。而你的pfile.ora中写着*.compatible='11.2.0.4.0'—— 这在 11g 下完全合法,却是 DBUA 静默模式的“死刑判决书”。
验证:查看 DBUA 日志$ORACLE_HOME/cfgtoollogs/dbua/upgrade/下最新dbua.log,搜索compatible,会看到类似:
[Thread-14] [ERROR] [] [oracle.sysman.emSDK.emd.util.EMDUtil] Failed to get compatible parameter value from source database [Thread-14] [ERROR] [] [oracle.sysman.emSDK.emd.util.EMDUtil] Compatible parameter value: 11.2.0.4.0 is less than required: 19.0.04.2 解决:升级前临时提升compatible,但绝不永久生效
不能直接改pfile.ora为19.0.0(11g 实例会启动失败),而要在 DBUA 启动前,用CREATE SPFILE FROM PFILE生成一个仅用于升级的临时 spfile,其中compatible覆盖为19.0.0:
# 1. 编辑临时 pfile,只改 compatible $ cp /home/oracle/pfile.ora /home/oracle/pfile_upgrade.ora $ sed -i 's/compatible=.*/compatible=19.0.0/g' /home/oracle/pfile_upgrade.ora # 2. 用临时 pfile 创建 spfile(注意:spfile 必须放在 19C ORACLE_HOME/dbs/ 下!) $ export ORACLE_HOME=/u02/app/oracle/product/11.2.0/db # 切回 11g HOME $ sqlplus / as sysdba SQL> CREATE SPFILE='/u02/app/oracle/product/11.2.0/db/dbs/spfilebsoft_upgrade.ora' FROM PFILE='/home/oracle/pfile_upgrade.ora'; # 3. 启动 DBUA 时指定此 spfile $ export ORACLE_HOME=/u02/app/oracle/product/11.2.0/db $ dbua -silent -sid bsoft -oracleHome /u02/app/oracle/product/11.2.0/db \ -sourceDBHome /u01/app/oracle/product/19.14.0/db_1 \ -spfile /u02/app/oracle/product/11.2.0/db/dbs/spfilebsoft_upgrade.ora逻辑说明:DBUA 静默模式读取的是spfile(而非pfile),且它只关心compatible值是否 ≥ 19.0.0。我们创建的spfilebsoft_upgrade.ora是一个“一次性证件”:它让 DBUA 顺利通过校验,但绝不用于启动 11g 实例(因为 11g 无法识别compatible=19.0.0)。DBUA 升级过程中会自动处理compatible的平滑过渡,最终 19C 数据库的compatible会被设为19.0.0,而这个过程与源库无关。
参数说明:
-spfile参数必须绝对路径,且文件需由oracle用户可读。-sourceDBHome指向 19C 的 ORACLE_HOME(即目标库环境),不是源库的 11g HOME;DBUA 会从这里加载 19C 的升级脚本。compatible=19.0.0是 DBUA 静默模式的硬性要求,写19.14.0或19.0都无效,必须是19.0.0。
4.3 避坑:常见问题与血泪经验
4.3.1 现象:DBUA 图形界面能启动,但静默模式dbua -silent一直卡在 “Initializing…”
原因:DISPLAY环境变量未清空。即使加了-silent,DBUA 仍会尝试初始化 GUI 组件,若DISPLAY指向一个不可达的 X server(如localhost:10.0),进程会挂起等待超时(默认 30 分钟)。
解决:执行unset DISPLAY后再运行dbua -silent。
4.3.2 现象:dbua -silent报ORA-27102: out of memory,但系统内存充足
原因:DBUA 启动时读取的是11g ORACLE_HOME下的init.ora,其中sga_max_size=68719476736(64G)在 19C 环境下被误判为“过大”,触发内存校验失败。
解决:在临时pfile_upgrade.ora中注释掉sga_max_size和memory_target,只保留compatible和必要参数(db_name,control_files等)。
4.3.3 现象:DBUA 升级完成后,数据库OPEN UPGRADE成功,但catuppst.sql执行失败,报ORA-00942: table or view does not exist
原因:catuppst.sql依赖SYS.DBA_REGISTRY视图,而该视图在OPEN UPGRADE状态下尚未完全构建,需先执行utlrp.sql编译无效对象。
解决:升级完成后,立即执行:
SQL> @?/rdbms/admin/utlrp.sql SQL> @?/rdbms/admin/catuppst.sql4.3.4 现象:DBUA 升级日志中大量WARNING: Skipping component ...,最终catqm.sql失败
原因:源库中存在 11g 已废弃但未卸载的组件(如OLAP,Spatial),DBUA 尝试升级它们时因 19C 架构变化而跳过,导致依赖这些组件的catqm.sql(Oracle Text 升级脚本)失败。
解决:升级前,在源库执行:
SQL> EXECUTE DBMS_REGISTRY_SYS.SYS_NOVALIDATE('OLAP'); SQL> EXECUTE DBMS_REGISTRY_SYS.SYS_NOVALIDATE('SPATIAL'); -- 然后重启源库,再开始 DBUA5. 升级后核心验证:三个必查项,避开 90% 的“升级成功但业务异常”陷阱
5.1 必查项一:COMPATIBLE参数是否已自动更新为 19.0.0?
升级后首次OPEN UPGRADE时,Oracle 会自动将compatible设为19.0.0,但若 DBUA 中途失败或手动STARTUP UPGRADE,此步可能遗漏。
验证命令:
SQL> SHOW PARAMETER compatible; -- 正确输出:NAME TYPE VALUE -- compatible string 19.0.0 -- 错误输出:compatible string 11.2.0.4.0 (说明升级未完成,需重跑 catupgrd.sql) -- 若仍为 11.2.0.4.0,强制更新: SQL> ALTER SYSTEM SET COMPATIBLE='19.0.0' SCOPE=SPFILE; SQL> SHUTDOWN IMMEDIATE; SQL> STARTUP UPGRADE; SQL> @?/rdbms/admin/catuppst.sql;逻辑说明:compatible是 Oracle 数据库的“DNA 版本号”,它控制着底层数据块格式、索引结构、优化器特性等。若未更新,19C 的新功能(如 JSON 表、PGA 自动管理)将被禁用,且未来无法打 19C 的关键补丁(PSU)。DBUA 的catupgrd.sql脚本末尾必须执行ALTER SYSTEM SET COMPATIBLE,这是升级完成的终极标志。
5.2 必查项二:DBA_REGISTRY中所有组件状态是否为VALID?
DBA_REGISTRY是 Oracle 的“组件健康仪表盘”,记录CATALOG,CATPROC,JAVAVM等核心组件的版本和状态。升级后若有组件状态为INVALID或LOADING,意味着字典视图、PL/SQL 包未正确编译,业务 SQL 可能报ORA-00904: invalid identifier或ORA-06550: line X, column Y, PLS-00302: component 'XXX' must be declared。
验证命令:
SQL> SELECT COMP_NAME, VERSION, STATUS FROM DBA_REGISTRY ORDER BY COMP_NAME; -- 关键组件必须为 VALID: -- Oracle Database Catalog Views 19.0.0.0.0 VALID -- Oracle Database Packages and Types 19.0.0.0.0 VALID -- Oracle Workspace Manager 19.0.0.0.0 VALID -- Oracle XML Database 19.0.0.0.0 VALID -- 若有 INVALID,编译全部: SQL> @?/rdbms/admin/utlrp.sql -- 编译后再次查询,仍 INVALID 则查日志 $ORACLE_HOME/rdbms/admin/utlrp.log逻辑说明:utlrp.sql是 Oracle 官方提供的“组件急救包”,它会递归编译所有STATUS=INVALID的对象。但注意:它不能修复DBA_REGISTRY中STATUS=LOADED(表示组件已安装但未初始化)的情况,此时需手动运行对应组件的catxxx.sql脚本(如catqm.sqlfor Oracle Text)。
5.3 必查项三:V$DATABASE.OPEN_MODE是否为READ WRITE,且UPGRADED列为NO?
升级完成后,数据库必须处于READ WRITE模式才能对外提供服务。而UPGRADED列是 Oracle 19C 新增的“升级完成确认锁”:只有当所有升级脚本(catupgrd.sql,catuppst.sql,utlrp.sql)全部成功执行,且compatible更新后,此列才变为NO。若为YES,说明升级流程未闭环,数据库处于“半升级”状态,任何 DML 操作都可能触发内部错误。
验证命令:
SQL> SELECT NAME, OPEN_MODE, UPGRADED FROM V$DATABASE; -- 正确输出:NAME OPEN_MODE UPGRADED -- BSOFTSB READ WRITE NO -- 若 UPGRADED=YES,说明 catuppst.sql 未执行或失败: SQL> @?/rdbms/admin/catuppst.sql -- 执行后再次查询,UPGRADED 应变为 NO逻辑说明:UPGRADED是 Oracle 19C 引入的原子性标志,它比OPEN_MODE更权威。即使OPEN_MODE=READ WRITE,只要UPGRADED=YES,数据库就拒绝执行某些高危操作(如创建新表空间),防止数据字典不一致。这是 DBUA 升级流程的“最后一道保险栓”,必须亲手验证。
6. 如何快速定位 Oracle 11g→19C 升级故障?一份可抄作业的排查清单
当你面对一个全新的升级报错,不要从头读日志。按以下顺序执行 5 步,90% 的问题能在 15 分钟内定位根因。这套流程是我踩过 17 次升级翻车后提炼出的“后悔药”——它不保证一次成功,但能确保你永远知道下一步该看什么。
6.1 第一步:锁定故障阶段,用ps -ef | grep dbua确认 DBUA 当前状态
DBUA 升级分四个明确阶段:Pre-Upgrade Checks→Database Upgrade→Post-Upgrade Configuration→Final Validation。每个阶段失败,日志位置和排查重点完全不同。
| 阶段 | 日志路径 | 关键检查点 | 典型报错 |
|---|---|---|---|
| Pre-Upgrade | $ORACLE_HOME/cfgtoollogs/dbua/upgrade/PreUpgrade.log | compatible值、archive log mode、tempfile路径 | ORA-00600,PRVG-00100 |
| Database Upgrade | $ORACLE_HOME/cfgtoollogs/dbua/upgrade/upgrade.log | catupgrd.sql执行进度、ORA-00942出现位置 | ORA-00942,ORA-06550 |
| Post-Upgrade | $ORACLE_HOME/cfgtoollogs/dbua/upgrade/PostUpgrade.log | utlrp.sql编译结果、DBA_REGISTRY.STATUS | INVALID组件、ORA-00904 |
| Final Validation | $ORACLE_HOME/cfgtoollogs/dbua/upgrade/FinalValidation.log | V$DATABASE.UPGRADED,OPEN_MODE | UPGRADED=YES,OPEN_MODE=MOUNT |
提示:不要打开
upgrade.log从头扫,直接grep -n "ERROR\|ORA-" upgrade.log,然后看报错行附近的Step:标记,立刻知道卡在哪一步。
6.2 第二步:验证控制文件与数据文件的物理一致性,用RMAN VALIDATE代替猜测
很多人花 2 小时查RMAN-06054,却忘了最简单的验证:控制文件声称的数据文件,磁盘上真的存在吗?路径对吗?权限对吗?
# 1. 连接到目标库(MOUNT 状态) $ rman target / RMAN> VALIDATE DATABASE; # 2. 查看输出中的 "File Status" 列 # 如果某文件显示 "FAILED",则: # - 检查路径:`SELECT NAME FROM V$DATAFILE WHERE FILE#=X;` # - 检查磁盘:`ls -l /oradata/BSOFTSB/datafile/system01.dbf` # - 检查权限:`ls -ld /oradata/BSOFTSB/datafile/`(必须 oracle:oinstall 可读写) # 3. 若 VALIDATE 通过,但 `REPORT SCHEMA` 仍显示 ***: RMAN> LIST DATAFILECOPY ALL; # 看输出的 "Handle" 路径是否与 V$DATAFILE 一致,不一致则 `SWITCH DATABASE TO COPY;`逻辑说明:VALIDATE DATABASE是 RMAN 的“X 光机”,它不读取数据块内容,只校验文件头和路径可达性。比ls -l更可靠,因为它走的是 Oracle 内核路径解析逻辑,能发现mount选项、ACL 权限等 shell 命令看不到的问题。
6.3 第三步:归档日志链完整性速查,用LIST ARCHIVELOG+CROSSCHECK组合拳
RMAN-06054的根源永远在归档日志链。但LIST BACKUP OF ARCHIVELOG只显示 RMAN catalog 里的记录,不保证磁盘文件真实存在。必须交叉验证:
# 1. 列出 catalog 中所有归档 RMAN> LIST ARCHIVELOG ALL; # 2. 对每个归档执行 crosscheck(RMAN 会检查磁盘文件是否存在) RMAN> CROSSCHECK ARCHIVELOG ALL; # 3. 删除 catalog 中标记为 EXPIRED 的归档(它们已不存在于磁盘) RMAN> DELETE EXPIRED ARCHIVELOG ALL; # 4. 重新 catalog 归档目录(强制刷新 catalog) RMAN> CATALOG START WITH '/hisbak/';关键观察点:执行CROSSCHECK后,LIST ARCHIVELOG ALL输出中STATUS列应全为AVAILABLE。若有EXPIRED,说明归档文件被误删或路径变更,必须找回或重新备份。
6.4 第四步:升级后性能基线对比,用AWR报告抓“隐形故障”
升级成功不等于业务正常。很多问题在OPEN UPGRADE后不报错,但 SQL 执行计划突变、PGA 使用率飙升、I/O 等待增加。必须在升级前后各生成一份 AWR 报告对比:
# 1. 升级前(11g 环境),生成最近 1 小时 AWR $ cd $ORACLE_HOME/rdbms/admin $ sqlplus / as sysdba SQL> @awrrpt.sql -- 输入:Report Type (html/text) -> html -- Num Days -> 1 -- Begin Snap Id -> (查 v$database.startup_time 对应的 snap_id) -- End Snap Id -> (当前 snap_id) # 2. 升级后(19C 环境),用相同时间窗口生成 AWR # 3. 用浏览器打开两个 HTML 报告,重点对比: # - Top 5 Timed Foreground Events(等待事件是否新增 `PGA memory operation`) # - SQL ordered by Elapsed Time(TOP SQL 执行时间是否翻倍) # - Instance Efficiency Percentages(Buffer Nowait % 是否 <99%)逻辑说明:AWR 是 Oracle 的“体检报告”,它不依赖业务日志,直接从内存和数据字典采样。若升级后PGA memory operation等待飙升,说明memory_target参数未适配 19C 的新内存管理模型,需调整pga_aggregate_target;若Buffer Nowait %低于 99%,说明db_cache_size不足,需增大。
6.5 第五步:回退预案验证,用FLASHBACK DATABASE快照代替 RMAN 恢复
所有升级操作前,必须创建FLASHBACK DATABASE快照。这不是可选项,是底线。它让你从“升级失败需 4 小时 RMAN 恢复”变成“30 秒闪回”。
# 1. 升级前,在 11g 源库执行(确保 db_recovery_file_dest 已配置) SQL> SHUTDOWN IMMEDIATE; SQL> STARTUP MOUNT; SQL> FLASHBACK DATABASE TO BEFORE RESETLOGS; -- 创建初始快照 SQL> ALTER DATABASE OPEN READ ONLY; SQL> ALTER DATABASE FLASHBACK ON; SQL> CREATE RESTORE POINT PRE_UPGRADE GUARANTEE FLASHBACK DATABASE; # 2. 升级失败时,直接闪回(比 RMAN 恢复快 10 倍): SQL> SHUTDOWN IMMEDIATE; SQL> STARTUP MOUNT; SQL> FLASHBACK DATABASE TO RESTORE POINT PRE_UPGRADE; SQL> ALTER DATABASE OPEN RESETLOGS;从那以后我每次执行 DBUA 升级,都强制走一遍CREATE RESTORE POINT流程,哪怕客户说“没必要”。因为真正的生产环境里,没有“万一”,只有“一定会发生”。这份《Oracle 11g 到 19C 数据库升级详尽指导手册》里的每一条命令、每一个参数、每一处避坑提示,都来自那些凌晨三点盯着RMAN-06054发呆的夜晚,和一次次FLASHBACK DATABASE救回的数据库。希望帮到你。
本文还有配套的精品资源,点击获取