简介:面向具备一定运维基础的数据库管理员,这份Oracle 11g至19C升级指导手册聚焦DBUA工具在真实迁移场景中的落地应用,帮助读者在版本更替、补丁停止更新的背景下规划安全可控的升级路径。文档围绕升级前备份与恢复、DBUA执行流程、必要参数与配置调整展开,并强调检查脚本日志、识别警告信息以及故障回退思路,对单机环境升级尤其具有参考价值。内容从环境说明、备份恢复延伸到升级后验证,形成较完整的操作脉络,并对版本兼容性、回退准备与日志审查给出细致提醒。压缩包仅含1个PDF文件,大小约3.18MB,便于随查随用。目前已有1361人学习,内容涵盖版本支持矩阵、直接与间接升级路线、图形化与静默升级方式,以及升级中常见异常的应对方案,适合DBA对照实际环境梳理检查清单、评估风险并沉淀运维记录。
1. 把 11g 单机搬上 19C:DBUA 升级这件事到底难在哪
手上还有 11.2.0.4 单机库在跑业务的人,最近两年多半都被问过同一个问题:补丁停了,漏洞扫描过不去,新上的中间件又只认 19C,什么时候升。真要动手时才发现,难的不是点几下 DBUA 的下一步,而是升级前那一堆前置条件——源库版本是否落在直升级通道里、主机是不是还在 Linux 6、字符集和时区有没有埋雷、升级失败怎么退回去。这份 Oracle 11g 到 19C 数据库升级指导手册,讲的就是一条最朴素的落地路径:先用 RMAN 把生产库恢复到一台独立的 19C 主机上,把它当"替身"跑通 DBUA,成功之后再回头处理生产端。适合有一定运维底子的 DBA,尤其是那种"库不能停太久、但也不敢直接在生产上试"的场景。下面按我实际拆这套流程的顺序讲:环境怎么摆、备份怎么恢复、DBUA 怎么跑、哪些坑会让人半夜爬起来。
2. 升级路线与环境预检:先确认你的库走的是直升级通道
很多人拿到手册第一反应是翻到 DBUA 那章,结果卡在第 0 步:源库版本根本不在直升级列表里。Oracle 对 19C 的升级通道划得很死,11.2.0.4 及以上可以直接上,11.2.0.1 到 11.2.0.3 必须先补到 11.2.0.4,10.2 系列要经过 11.2.0.4 或 12.1.0.2 中转,9.2.0.8 及更早同样得先落到 11.2.0.4。这一步没确认清楚,后面所有操作都是白做。
2.1 版本通道与主机版本的硬门槛
先看源库版本。用下面这条查,输出里的版本号精确到第四位,别只看v$version里的前三位:
-- 查源库精确版本与补丁集,决定是否走直升级 select version_full from v$instance; -- 11.2.0.4 之后的小版本也要看,部分 PSU 影响升级脚本行为 select * from registry$history order by action_time desc;version_full在 11g 上可能不存在,那就退回select * from v$version;配合opatch lspatches看补丁号。这一步的意义在于:如果结果是 11.2.0.3,你的第一件事不是升级到 19C,而是先在这个库上打 11.2.0.4 的补丁,再谈后面的事。
主机版本是第二个门槛。19C 对操作系统的支持底线是 Linux 7,源库如果还跑在 Linux 6 上,就没有"原地升级"这个选项——必须准备一台 Linux 7 的新主机,装好 19C 软件,再把数据搬过去。手册里的做法正是如此:源库留在原主机不动,当回退保险;目标端另起一台 RHEL 7.9,装 19.14.0 的 ORACLE_HOME,通过 RMAN 把生产实例的备份恢复过来,在这份"副本"上跑 DBUA。这个思路我一般会推荐给所有不敢拿生产库试错的人,代价只是多一台机器和一份存储。
2.2 目标端目录规划与 ORACLE_HOME 隔离
目标主机上最容易出事的是目录混用。手册里源库和目标库的路径写得很清楚,源库 ORACLE_HOME 是/u02/app/oracle/product/11.2.0/db,目标端是/u01/app/oracle/product/19.14.0/db_1,数据文件统一落在/oradata,归档落到/arch。这里有个反直觉的点:恢复过来的 11g 库,它的数据文件目录不一定要和生产端一模一样,SET NEWNAME可以整体重定向,但audit_file_dest、diagnostic_dest、db_recovery_file_dest这些参数指向的路径必须在目标主机上真实存在,否则startup nomount都过不去。
我的习惯是先建目录再恢复,顺序不能反:
# 目标端目录预建,注意属主必须是 oracle:oinstall mkdir -p /u02/app/oracle/admin/bsoftsb/adump mkdir -p /oradata/bsoftsb/controlfile mkdir -p /arch chown -R oracle:oinstall /u02/app/oracle/admin /oradata /archadmin/<db_unique_name>/adump这个路径和db_unique_name强绑定,如果你在参数文件里改了 unique name 却没同步改目录名,实例启动时会报ORA-48132之类的审计目录错误。这种错不致命但很烦,因为报错信息不会直接告诉你"目录名不对"。
2.3 用检查脚本把隐患提前挖出来
19C 的 ORACLE_HOME 下自带升级预检脚本,路径是$ORACLE_HOME/rdbms/admin/preupgrd.sql,11g 端也可以从 19C 的 home 里拷过去跑。它的输出会生成在$ORACLE_BASE/cfgtoollogs/<dbname>/preupgrade/下,主要看两个文件:preupgrade.log里的 ERROR 列表和preupgrade_fixups.sql。
常见做法是先把 fixup 脚本跑一遍,再重新执行 preupgrd,直到没有 blocking 级别的错误。手册里反复强调"检查脚本生成的日志和警告",说的就是这个环节。我见过有人跳过这步直接开 DBUA,结果在升级到 80% 时因为一个已废弃的SEC_CASE_SENSITIVE_LOGON参数或一个无效的物化视图卡死,回退重来一遍,时间成本远高于提前跑脚本。参数文件里*.sec_case_sensitive_logon=FALSE就是 11g 时代留下的典型配置,19C 里这个参数已被弃用,preupgrade 会把它标出来,提前处理掉能省一轮。
3. RMAN 恢复出升级副本:把生产库"搬"到 19C 主机上
这一步的定位要摆正:不是做迁移,是造一个可以随便折腾的靶子。生产库继续对外服务,目标端恢复出来的库以只读方式打开做验证,等 DBUA 在副本上跑通、应用侧验证通过,再安排正式停机窗口。手册把恢复拆成参数文件、控制文件、数据文件、追归档四段,逻辑很清晰,但每段都有细节。
3.1 参数文件恢复与关键参数改写
从备份里还原 spfile 之后,第一件事是转成 pfile 再改。原因很直接:spfile 是二进制,很多路径参数在目标主机上必须改,直接改 spfile 做不到。
# 还原 spfile 并转 pfile rman target / RMAN> startup nomount; RMAN> restore spfile from '/hisbak/spfile_BSOFT_562120512_20220830_40444.ora';-- 转成可编辑的 pfile create pfile='/home/oracle/pfile.ora' from spfile;拿到 pfile 后重点改这几类:audit_file_dest、diagnostic_dest、control_files、db_recovery_file_dest指向目标主机真实路径;db_unique_name改成新名字避免与生产端冲突;db_name保持原样,因为 DBUA 认的是 db_name,改了会出问题。手册里*.db_name='bsoft'而*.db_unique_name='bsoftsb',就是这个道理。
还有一个容易被忽略的参数是compatible。恢复过来的库还写着*.compatible='11.2.0.4.0',这个在升级前不要动,等 DBUA 跑完、验证稳定后再手动往上调。提前改会让 11g 实例启动失败。
-- 用改好的 pfile 启动,再生成目标端的 spfile startup nomount pfile='/home/oracle/pfile.ora'; create spfile='/u02/app/oracle/product/11.2.0/db/dbs/spfilebsoft.ora' from pfile='/home/oracle/pfile.ora';注意这里生成 spfile 用的是源库版本的 ORACLE_HOME,也就是目标主机上装的那套 11.2.0.4 软件。DBUA 升级要求源库以 11g 的 home 正常启动,升级过程结束才会切到 19C 的 home,所以目标主机上两套软件都得装,环境变量来回切。
3.2 控制文件恢复与 catalog 加载
控制文件从备份还原后,RMAN 是"不认识"后续备份片的,必须 catalog 一遍。
RMAN> restore controlfile from '/hisbak/BSOFT_CONT_562120512_20220830_40443.ctl'; RMAN> sql 'alter database mount'; RMAN> catalog start with '/hisbak/';catalog start with会扫描目录下所有备份片并注册,输出里如果出现大量skipping是正常的,表示已经注册过。加载完立刻跑一次report schema,看数据文件清单是否齐全。手册里那份 report 输出有个细节值得注意:数据文件路径还是+DATA/bsoftsb/datafile/...的 ASM 格式,说明备份来自 ASM 存储,而目标端是文件系统。这时候不用慌,后面的SET NEWNAME会统一重定向,report 只是告诉你"备份里有什么",不代表恢复目标。
如果report schema报RMAN-06139: WARNING: control file is not current,说明控制文件不是最新的,但只要备份片里的归档足够追到目标时间点,就不影响恢复。这一步真正要确认的是数据文件数量和临时文件清单,漏掉一个 tempfile 到后面 open 阶段会报错。
3.3 数据文件重定向恢复与归档追赶
恢复段落的核心是SET NEWNAME加时间点。手册里把数据文件统一定向到/oradata/BSOFTSB/datafile/%b,%b是原文件名,这样恢复出来的文件名和原来一致,只是目录变了,后期排查方便。
run { ALLOCATE CHANNEL C1 DEVICE TYPE DISK; -- 通道数按目标主机 CPU 和 IO 能力给,16 个是偏激进的值 SET NEWNAME FOR DATABASE TO '/oradata/BSOFTSB/datafile/%b'; SET UNTIL TIME "TO_DATE('2022-08-30:02:00:00','YYYY-MM-DD:HH24:MI:SS')"; RESTORE DATABASE; RELEASE CHANNEL C1; }通道数量的选择有讲究。手册给了 16 个通道,在机械盘或低配虚机上这么开反而会因为 IO 争抢变慢,我一般按min(CPU 核数, 8)起步,恢复过程中看v$session_longops的进度再决定要不要加。SET UNTIL TIME是第一个时间锚点,控制恢复的起点,后面的RECOVER再用更晚的时间点往前追,这种"分段推进"的做法很实用:先恢复到凌晨 2 点,确认能起来,再追到 7 点、12 点,每一步都可控。
恢复完成后必须执行SWITCH DATABASE TO COPY,否则控制文件里记录的还是旧路径,open 时会去找 ASM 上的文件。
RMAN> switch database to copy;追赶归档阶段如果报RMAN-06054: media recovery requesting unknown archived log,含义是归档链断了,缺某个 sequence。手册里就遇到了这个:请求 thread 1 的 sequence 25197,但备份里只到 25192。解决办法有两个,一是从生产端把缺失的归档拷过来再catalog,二是接受当前能追到的最新 SCN,以只读方式打开做验证。升级验证场景下,第二种完全可以接受,只要业务验证的数据范围覆盖到了就行。
3.4 只读打开做升级前验证
追到满意的时间点后,用只读方式打开:
alter database open read only;这个状态下库可以查、不能写,足够跑一遍应用的关键查询、比对几张核心表的行数、确认字符集和时区没有问题。如果还要继续追归档,就shutdown abort再startup mount,然后重新recover。手册里演示了两轮追赶,第二轮追到归档耗尽报错为止,这个"能追多远追多远"的思路在验证环境里是对的,正式升级前则要在停机窗口内追到与生产完全一致。
只读打开时顺手查几个东西,能提前暴露 DBUA 阶段的问题:
-- 查无效对象、组件版本、时区版本 select count(*) from dba_objects where status='INVALID'; select comp_name, version, status from dba_registry; select * from v$timezone_file;无效对象数量如果上千,升级后重编译会很慢,建议在副本上先跑一遍utlrp.sql看看耗时。dba_registry里如果有Oracle Database Catalog Views之类组件状态不是 VALID,DBUA 会直接拒绝升级。时区文件版本低的话,19C 升级后需要跑dbms_dst做时区升级,这是一块独立的工作量,别等到升级完才发现应用里的时间字段全乱了。
4. DBUA 图形化升级全过程:从 preupgrade 到 postupgrade
副本准备好之后,才轮到 DBUA 上场。它的本质是一个包装脚本,背后调用的还是catupgrd.sql那一套,价值在于把检查、备份、升级、编译、汇总串成流水线,并在每一步失败时给你明确的日志位置。理解这一点,出问题时才知道去哪个目录翻日志,而不是盯着图形界面干等。
4.1 启动前的环境变量与监听确认
DBUA 要在 19C 的 ORACLE_HOME 下启动,但升级的源库是由 11g 的 home 启动的实例。这个"两套 home 并存"的状态是 DBUA 的标准姿势,环境变量切换必须干净:
# 切到 19C 环境,确认 ORACLE_HOME 与 PATH 都对 export ORACLE_HOME=/u01/app/oracle/product/19.14.0/db_1 export PATH=$ORACLE_HOME/bin:$PATH export ORACLE_SID=bsoft which dbua echo $ORACLE_HOMEwhich dbua输出必须是 19C 路径下的,如果还是 11g 的,说明 PATH 没刷干净,这时候启动 DBUA 会报版本不匹配。另一个必查项是监听:19C 的 listener 要在跑,且lsnrctl status里能看到实例注册。DBUA 需要通过监听连库,走的是本地 IPC 或 TCP 都行,但监听没起就一定连不上,报错还比较隐晦。
启动命令就是dbua,图形界面依赖 X11 转发。服务器上没装图形环境的话,用ssh -X或者 VNC 连过去,纯字符终端是起不来的。手册里提到了 DBUA 支持静默模式(对应 MOS 文档 2548985.1),批量场景下静默确实更省事,但首次升级我建议还是走图形界面,因为每一步的选项和警告都能看清,静默模式的响应文件写错一个参数,排查成本更高。
4.2 升级向导的关键选项
DBUA 的向导页数不多,但有两三个选项决定成败。
第一页选要升级的数据库,列表里会显示实例名、版本、ORACLE_HOME。如果列表是空的,多半是监听或环境变量的问题,不是 DBUA 坏了。
第二页是升级选项,重点有三项:是否创建备份(Create Backup)、是否启用并行升级(Parallel Upgrade)、是否只升级而不更新时区。备份选项建议勾上,DBUA 会用 RMAN 打一份 guaranteed restore point 或者全备,出问题能快速回退,磁盘空间够就别省这一步。并行升级要填并行度,一般给 CPU 核数的一半到相等,给太高会让 shared pool 吃紧。时区那个选项,如果之前查出来时区文件版本低,这里可以先不勾"升级时区",等库升到 19C 稳定后再单独跑dbms_dst,两件事混在一起做,出了问题分不清是谁的锅。
第三页是 EM 相关配置,没有在用的话直接跳过,勾了反而会因为 EM 仓库配置失败导致升级中断。
再往后是移动数据文件的选项。如果副本的存储路径规划在升级后要变,可以在这里让 DBUA 一并做,但我的建议是升级和迁移分开做,一次只改一个变量,回退时才好判断。
4.3 升级执行与日志定位
点下升级之后,界面上会显示进度条和各阶段状态。真正有用的信息在日志里,路径固定在:
# 升级日志三大件,出问题先看这里 ls -l $ORACLE_BASE/cfgtoollogs/dbua/<dbname>/<dbname>是你要升级的库名,目录下有时间戳命名的子目录,里面最关键的三个文件:dbua.log记录工具本身的操作流,postupgrade.log是升级后脚本的输出,还有一个preupgrade目录存着预检结果。卡住的时候不要盲等,直接tail -f这几个文件,DBUA 在跑catupgrd.sql时会往日志里不断写阶段标记,看到Phase字样就说明还在推进。
升级期间有几个正常但吓人的现象:CPU 打满、shared pool使用率飙高、大量对象显示 INVALID、界面上长时间停在某个百分比不动。这些多半是catupgrd.sql在重编译系统对象,属于正常范围。真正要警惕的是日志里出现ORA-开头的错误连续刷屏,或者 progress 超过一小时后完全没有新日志写入,那时候去查v$session看有没有会话被阻塞。
4.4 升级后的收尾与验证清单
DBUA 跑完会弹出一个汇总页,列出升级结果、被置为 INVALID 的对象数、需要手动处理的建议。别急着点完成,先把日志里的 WARNING 扫一遍,有些警告是"某个组件没有升级到新版本",得单独处理。
收尾动作按顺序来:
-- 1. 重编译无效对象,耗时可能很长 @?/rdbms/admin/utlrp.sql -- 2. 重新收集字典统计信息 execute dbms_stats.gather_dictionary_stats; -- 3. 检查组件状态是否全部 VALID select comp_name, status, version from dba_registry; -- 4. 检查时区文件版本 select * from v$timezone_file;utlrp.sql在对象多的库上跑一两个小时很常见,跑完再查一次无效对象数,正常情况下应该是个位数。dba_registry里除了Oracle Database Server之外的组件,如果有 INVALID 的,按组件名找到对应的升级脚本补跑。时区如果升级时选了更新,这里版本号应该和 19C 匹配,没选的话就要安排单独窗口做dbms_dst。
最后才是把compatible参数往上调。这个动作不可逆,调之前确认没有回退需求,调整完重启实例。手册里没有展开这一步,但它是升级真正"完成"的标志,compatible还停在 11.2 的话,19C 的很多新特性根本用不上。
5. 四个把升级拖进深夜的坑:现象、原因与解法
这段是血泪经验的集中区。下面四条都是 11g 到 19C 走 DBUA 这条路上高频出现的,每条按"看到什么、为什么、怎么处理"的顺序写,方便对上号。
5.1 升级到一半报 ORA-04063 或组件无效
现象:DBUA 进度到 60%~80% 时中断,日志里出现ORA-04063: package body ... has errors,或者汇总页显示某个组件状态是 INVALID。
原因基本是 preupgrade 阶段的 fixup 没跑干净。11g 里存在失效的 PL/SQL 对象、旧版本组件残留、或者dba_registry里有组件注册了但实际不存在,这些在预检时是 WARNING 级别,容易被忽略,升级到重编译阶段就变成硬错误。
解决:回到副本上先跑preupgrd.sql,重点处理 ERROR,然后手工跑utlrp.sql把无效对象清零,再重新启动 DBUA。已经升级失败一次的库,不要在上面的残留状态继续,直接重新从备份恢复一份干净的副本,比在残局上修复省时间。
5.2 归档链断裂导致 recover 无法继续
现象:recover database报RMAN-06054,提示缺少某个 thread 的 sequence,生产端的归档已经删了或者还没拷过来。
原因:备份策略里归档保留期短于恢复所需的时间跨度,或者跨平台拷归档时漏了某个节点。手册里就卡在 thread 1 的 25197 这个 sequence 上。
解决:首选从生产端把缺失归档补拷过来,catalog start with注册后继续 recover。补不到的话,接受当前 SCN 以只读打开,验证数据范围是否满足升级验证需求。如果这是正式升级窗口,缺失归档意味着数据不一致,宁可重做一次全备恢复,也不要在断链的库上升级——升级后的库数据是错的,这个后果比多花几小时严重得多。
5.3 DBUA 图形界面连不上实例
现象:启动dbua后,选择数据库那一页列表为空,或者选中后报连接失败,但用 sqlplus 明明能连上。
原因通常有三个:环境变量还是 11g 的 home,dbua启动的是旧版本;19C 监听没起或实例没注册;X11 转发有问题导致界面显示不全误判。还有一种隐蔽情况,源库是open read only状态,DBUA 要求源库以 mount 或 open 状态存在且能读写,只读状态下某些检查过不去。
解决:按顺序排查echo $ORACLE_HOME、which dbua、lsnrctl status、select status from v$instance。副本验证阶段如果一直是只读打开,正式升级前记得shutdown后以正常状态启动,别拿着只读实例去跑 DBUA。X11 的问题用xdpyinfo确认 DISPLAY 变量生效。
5.4 升级完成后应用报字符集或时区相关错误
现象:DBUA 显示成功,库能连,但应用一跑报表就报时间差 8 小时,或者中文出现乱码。
原因:时区文件没升级,或者nls_*参数在升级过程中被重置。19C 的默认时区版本比 11g 新,如果升级时没勾选时区更新,也没有单独做dbms_dst,涉及TIMESTAMP WITH TIME ZONE的字段就会出偏差。字符集问题则多见于恢复阶段参数文件里nls_language、nls_territory没带过来。
解决:升级前后各查一次select * from v$timezone_file;和select * from nls_database_parameters;,做对比记录。时区单独安排窗口按dbms_dst的标准流程做,先prepare_window再upgrade,不要和 DBUA 混在一起。字符集参数补回原值后重启实例即可,但字符集本身(nls_characterset)在 19C 里不允许随意更改,恢复阶段就要确认参数文件里没丢。
6. 回退预案与升级后的验证套路
升级这件事,成功路径只有一条,失败路径有无数条,所以真正的技术含量在于"失败了怎么办"。手册里那个"生产库保留不动、在副本上升级"的设计,本身就是最大的回退预案,但副本升级成功之后到生产正式切换之间,仍然要有一套可执行的回退动作。我一般会在 DBUA 开始前做三件事:记录当前dbid和controlfile的 SCN、用create restore point打一个 guaranteed restore point(闪回日志空间够的话)、把源库的 spfile 和密码文件单独备一份到别的目录。这三样东西加起来,能把"升级失败"的恢复时间从小时级压到分钟级。
Flashback Database 是这个场景里性价比最高的后悔药。DBUA 过程中如果中断,且之前打过 restore point,直接flashback database to restore point before_upgrade就能回到升级前状态,不用重新恢复备份。前提是 11g 阶段就开了闪回区并留够空间,db_recovery_file_dest_size给到几百 G 是常见配置,手册里那 200G 就是干这个用的。闪回不成的兜底就是 RMAN 重新恢复,所以升级前的全备永远不能省。
升级后的验证不建议只跑"库能启动"这种最低标准。我习惯分三层查:第一层是结构,dba_registry组件全 VALID、dba_objects无效对象在个位数、所有数据文件online;第二层是数据,抽核心表比对升级前后行数、查几个关键业务视图的返回是否一致、确认序列的last_number没有异常回退;第三层是应用,让业务方在只读副本上跑一段真实查询,重点看执行计划和响应时间有没有突变。19C 的优化器对统计信息更敏感,dbms_stats.gather_dictionary_stats跑完再让应用连,能少一批"升级后变慢"的投诉。
还有一个容易漏的动作:升级完成后把compatible参数调上去再重启一次,然后用select * from v$parameter where name='compatible';确认生效。这个参数不调,库虽然显示是 19C,但很多新特性默认关闭,等于升了个寂寞。调之前和执行dbms_dst时区升级一样,都要确认没有回退需求。
从那以后我每次做这种跨大版本升级,都强制自己走一遍"预检日志逐条看完、副本只读验证跑通、restore point 打完"这三步,一步没做完就不点 DBUA 的开始按钮。这套流程从外面看慢,实际是把返工概率压到了最低。希望帮到你。
本文还有配套的精品资源,点击获取