简介:一份面向具备一定运维能力数据库管理员的 Oracle 11g 到 19C 升级指导手册,内容围绕 DBUA 数据库升级助手工具展开,旨在解决生产环境从旧版本平稳迁移至新版本的核心问题。手册根据官方文档与实际运维经验,系统梳理了升级前备份与恢复、升级路线选择、具体执行流程及必要的配置调整,并特别提醒检查脚本生成的日志和警告,帮助读者规避常见误区。其中不仅说明了直接升级与间接升级的适用版本,还明确指出 19C 对操作系统版本的最低要求,以及源库备份、RMAN 恢复、参数文件调整等关键环节的操作参考。书内附有多种异常故障的解决方案,覆盖升级过程中可能遇到的各种情形。资源包共 1 个文件,类型为 PDF 格式手册文档,压缩包总体积约 3.18MB,手册内容组织严谨,适合按章节逐步查阅。目前已有 1342 人学习下载。对于正在规划 19C 升级的数据库管理员,这份手册能提供从环境评估、数据恢复到升级后验证的完整参考路径,帮助提升升级成功率与数据库安全性。
1. Oracle 11g 到 19C 升级:先想清楚路径,再动手
把一套稳定跑了七八年的 Oracle 11g 数据库迁到 19c,最怕的不是技术难度,而是“升级前觉得简单、升级后才发现回不去”。我见过太多团队卡在同一个地方:11g 到 19c 没有直接原地升级路径,必须走中间版本,很多人不知道这一点,上来就对着 19c 的安装包发呆。这篇笔记写给两类人:一是被领导点名负责升级、但还没完整走过一遍的 DBA,二是正在评估“到底该不该升、升了有什么好处”的技术负责人。我会把升级路径、预检项、正式执行步骤、回滚方案和升级后的验证方法按顺序拆开讲,每个环节都给出可复用的命令和参数。先给结论:11g 升 19c 最稳的常规路线是 11.2.0.4 → 12.2.0.1 → 19c,如果是 11.2.0.3 或更低版本,还要先补到 11.2.0.4。下面从路径选型开始。
2. 升级路径选型:为什么 11g 不能直接跳到 19c
2.1 官方支持矩阵与三条可行路线
Oracle 的升级路径不是随便跳的,数据库版本之间存在“直接升级路径”和“间接升级路径”之分。19c 作为长期支持版本,其直接升级路径只接受 12.2.0.1 和 18c,换句话说,11.2.0.4 不能一步到位升到 19c。常见做法是先升到 12.2.0.1,再从 12.2.0.1 升到 19c,这两段都有官方支持的升级路径,不用跑 catupgrd 之外的额外脚本。
如果你的源版本是 11.2.0.3 或更早,那要先升到 11.2.0.4。这一步通常用补丁集完成,11.2.0.3 到 11.2.0.4 是一个例外路径,官方支持直接应用 Patch Set Update。升到 11.2.0.4 之后再走 12.2.0.1 → 19c 的路线。整个过程看起来多了一步,但每一步都有官方文档兜底,比尝试不支持的捷径可靠得多。
还有一条路线是 Data Guard 逻辑升级:搭建一套 19c 的物理备库,然后做 switchover。这种方式停机时间极短,适合对可用性要求极高的核心系统,但配置复杂度高出不少,而且物理备库在切换前不能做软件升级验证。我一般建议第一次升级的用户走传统原地升级路线,等流程跑熟之后,再考虑 Data Guard 方案。
如果源库是 12.1 或 12.2,升级路径会短一些:12.1 可以升到 12.2 再升 19c,或者 12.1 通过直接路径升到 19c(前提是补丁版本满足要求)。但咱们这篇讨论的是 11g,所以主路线锁定在 11.2.0.4 → 12.2.0.1 → 19c。
2.2 直接升级与 Data Guard 逻辑升级的取舍
直接升级的操作对象是原库本身,执行 catupgrd.sql 脚本把数据字典从旧版本提升到新版本。这个过程的优点是步骤清晰、可控性强,缺点是升级期间数据库必须停机,停机时间取决于数据库大小和 CPU 性能。一个 2TB 的库,跑 catupgrd 脚本可能需要 1 到 3 小时,加上前后准备和验证,半天时间是要预留的。
Data Guard 逻辑升级则是用 19c 的软件搭建一套新环境,通过 Data Guard 从 11g 主库同步数据过来,等备库追平之后做角色切换。这个方案的停机时间可以压到分钟级,但维护成本高:备库需要独立的服务器资源、监听配置和网络环境,而且物理备库用的是 redo 日志同步,数据文件格式和数据库版本必须兼容,所以对源库版本同样有要求。走这条路,源库 11.2.0.4 是硬性前提,版本更低的话备库同步都无法启动。
无论选哪条路,有两点是共通的:升级前的备份必须做全量备份,而且不能只备份数据文件,控制文件、参数文件和密码文件也要一起备份;升级前要在测试环境完整演一遍,连应用连接串、JDBC 驱动版本、存储过程报错都要记录。这两点我在后面每个环节都会反复强调。
2.3 主备机硬件与操作系统兼容性预检
很多升级事故其实不是数据库本身的问题,而是底层操作系统和硬件不满足 19c 的要求。19c 对 Linux 内核版本、glibc 版本、共享内存参数都有最低要求。比如 Red Hat Enterprise Linux 7 需要内核 3.10.0-514.el7 以上,glibc 需要 2.17 以上;如果你还在用 RHEL 6,那要先升级操作系统才能装 19c。
检查操作系统版本和内核参数,用下面这组命令:
cat /etc/redhat-release uname -r ldd --version | head -1 sysctl -a | grep -E 'kernel.sem|kernel.shmall|kernel.shmmax'参数说明:
kernel.shmall和kernel.shmmax决定共享内存上限,19c 安装时要求/dev/shm至少 1GB,建议给到内存的 50% 以上。kernel.sem四个值分别对应信号量数组最大值、系统级信号量最大值、每数组信号量操作数和系统级信号量标识符最大值,Oracle 11g 时代很多系统把这几个值调得比较保守,19c 安装前的runcluvfy.sh会直接报错。- 如果参数不达标,用
sysctl -w临时修改验证,确认没问 题再写进/etc/sysctl.conf永久生效。修改共享内存参数之后要重启数据库实例,不能只改完就装软件,否则安装检测阶段会检查失败。 - 还有一点很容易忽略:磁盘空间。19c 的 Oracle Home 安装目录大约需要 8GB,数据文件所在的文件系统要额外预留 30% 的余量,因为升级过程中数据字典会新增很多基表,SYSTEM 表空间会明显膨胀。我建议升级前用
df -h把所有相关挂载点看一遍,特别留意ORACLE_HOME和ORACLE_DATA是否在同一个文件系统上——如果是,空间预检要按两者之和来算。
3. 升级前的预检作业:把问题暴露在测试环境
3.1 跑通 Upgrade Advisor 与预处理脚本
升级前最重要的一步不是备份,而是跑 Oracle 提供的升级预检工具。11.2.0.4 的安装介质里带了一个PreUpgrade.jar工具,17c 之后改名为 Upgrade Advisor,但 11g 时代用的还是前者。这个工具会在升级前扫描当前库的字典信息,生成一份预处理脚本和一份预检报告,报告里会列出所有可能导致升级失败或升级后异常的问题。
生成预处理脚本的方法是用 11g 的 ORACLE_HOME 里自带的 Java 去执行 PreUpgrade.jar,命令如下:
cd $ORACLE_HOME/rdbms/admin $ORACLE_HOME/jdk/bin/java -jar $ORACLE_HOME/rdbms/admin/preupgrade.jar -term YES运行完之后,当前目录下会生成一个preupgrade_<SID>_<时间戳>.log报告文件和一个preupgrade_fixups.sql脚本。报告文件会用 WARNING 和 ERROR 两个级别列出问题,比如某些内置包的状态为 INVALID、某些表空间的默认属性不兼容、时区版本过旧等等。处理建议是把preupgrade_fixups.sql放到数据库里执行:
sqlplus / as sysdba @preupgrade_fixups.sql这段脚本做的事情包括:更新时区版本到 19c 支持的版本、重置部分失效对象的状态、调整字典表的属性。执行完再重新跑一遍 preupgrade.jar,直到报告里不再出现 ERROR 级别的问题。WARNING 级别的问题不一定都必修,但每条都要记录原因和决定。
我自己的习惯是:升级前把这份报告打印出来,一条一条签字确认。升级团队里如果有人说“这个 WARNING 应该没事”,我会专门回一句“它出现在报告里,就已经说明升级后可能会翻车”,因为这类问题在 11g 里是隐性的,到了 19c 才会暴露成显性的报错。
3.2 失效对象与组件健康检查
升级前要查所有失效对象,这一步很多人会跳过,但恰恰是升级后跑不完utlrp.sql的根源。11g 库里长期积压的失效对象不会因为升级自动变好,有些甚至会因为字典迁移而产生连锁失效。查失效对象的 SQL 如下:
set linesize 200 col owner format a20 col object_type format a30 col object_name format a40 SELECT owner, object_type, object_name, status FROM dba_objects WHERE status = 'INVALID' ORDER BY owner, object_type;另一个需要检查的对象是数据库组件。每个组件在字典里都有对应的注册记录,升级前要把dba_registry_sqlpatch和dba_registry两个视图都看一遍:
SELECT comp_id, comp_name, version, status FROM dba_registry ORDER BY comp_id;如果某个组件状态不是VALID,升级前就要处理掉。比如 Oracle Text 组件如果之前被误删过,升级时catupgrd.sql会试图重建它,但缺少基础组件会导致升级中断。这种问题在测试环境会最先暴露,所以预检不只是看报告,还要在测试库里真实跑一遍完整升级,把每一步报错都记录下来。生产库升级时,同样的问题就不会再让人措手不及。
3.3 时区文件版本与字典统计信息
时区文件不匹配是 11g 升 19c 的老大难。11g 默认的时区版本可能是 14 或 18,而 19c 要求 32 以上。如果不处理,升级脚本会自动尝试更新时区文件,但更新过程有个坑:时区版本升级后,历史数据里TIMESTAMP WITH LOCAL TIME ZONE类型的列需要转换,而转换过程不能在线执行,必须在升级脚本执行前完成。
检查当前时区版本:
SELECT version FROM v$timezone_file;如果版本低于 32,建议在正式升级前用DBMS_DST包提前做时区升级。常见做法是分三步:先BEGIN DBMS_DST.BEGIN_UPGRADE; END;,再执行utltz_u.sql脚本,最后DBMS_DST.END_UPGRADE。这一步如果在测试环境做一遍,生产执行时基本就是照搬命令,不会有意外。
字典统计信息同样要提前收集。升级脚本在运行过程中会根据字典表的统计信息决定执行计划,旧的统计信息可能让catupgrd.sql里的 SQL 走错执行计划,导致升级脚本跑好几个小时都不结束。提前收集统计信息的命令:
EXEC DBMS_STATS.GATHER_DATABASE_STATS(degree => 8, granularity => 'ALL');跑完统计信息后,升级前最后一次全量备份的时间点要放在这个动作之后,这样万一升级失败回滚,还能恢复到统计信息已就绪的状态。
3.4 归档日志与临时表空间预估
升级脚本会生成大量的 redo 日志和归档日志,如果归档目录空间不足,升级会在中途卡住。常见做法是升级前检查归档空间使用率,并保证至少留出 50GB 的空闲空间。另外一个常被忽略的点是临时表空间:catupgrd.sql执行过程中会做大量排序操作,临时表空间的当前大小最好不低于在线重做日志总大小的 10 倍,否则可能遇到ORA-01652: unable to extend temp segment。
临时表空间扩容的常用命令:
ALTER TABLESPACE temp ADD TEMPFILE '/u01/app/oracle/oradata/ORCL/temp02.dbf' SIZE 20G AUTOEXTEND ON NEXT 1G MAXSIZE 40G;参数说明:AUTOEXTEND ON NEXT 1G表示每次自动扩展 1GB,MAXSIZE限制最大增长到 40GB。临时表空间不像数据文件那样需要做备份,所以扩容无风险,但升级完成后如果空间占用明显,要及时清理多余的临时文件。
4. 正式执行升级:从 11.2.0.4 到 12.2.0.1 再到 19c
4.1 用 DBUA 还是命令行?两种方式的选择
升到 12.2.0.1 这一步,Oracle 提供了两种方式:DBUA(Database Upgrade Assistant)图形化工具和手动命令行方式。DBUA 适合第一次做升级的团队,因为它把所有预检、备份、执行脚本、后处理打包在一起,界面会明确显示“准备”“升级”“完成”三个阶段。但 DBUA 有个缺点:出问题的时候日志分散,定位困难,而且它默认会做一些额外的配置变更,比如重置日志文件大小、调整部分参数,这些变更对有些生产环境来说不一定合适。
手动命令行方式的核心是执行catupgrd.sql脚本。12.2.0.1 安装介质解压后,脚本位于$ORACLE_HOME/rdbms/admin/catupgrd.sql。执行前要按顺序完成下面这些准备动作:
su - oracle sqlplus / as sysdba SHUTDOWN IMMEDIATE; STARTUP UPGRADE;进入UPGRADE模式后,数据库会禁用部分功能并切换到升级状态,然后执行:
SPOOL /u01/app/oracle/upgrade/catupgrd.log @$ORACLE_HOME/rdbms/admin/catupgrd.sqlcatupgrd.sql会调用一系列子脚本,包括把数据字典从 11.2.0.4 版本提升到 12.2.0.1 版本、更新内置包和视图定义、重建部分索引和同义词。整个过程的日志会输出到 spool 文件里,如果执行过程中报错,catupgrd.sql不会自动停止,而是把错误记录下来继续执行后续脚本。所以执行完之后不能只看最后有没有回到 SQL 提示符,要检查 spool 文件里有没有ORA-、PLS-、Error关键词:
grep -E "ORA-|PLS-|Error" /u01/app/oracle/upgrade/catupgrd.log | grep -v "ORA-0"ORA-00000是正常消息,ORA-00942有时也是合法的(比如某个视图引用的表还不存在),所以 grep 出来的内容要逐条人工确认。建议把 grep 到的所有错误行导出来,交给有经验的 DBA 逐一判断,而不是直接判定失败。
4.2 升级后立即执行的字典编译与统计信息收集
不论用哪种方式完成升级,重启数据库后的第一件事是执行utlrp.sql重编译失效对象:
sqlplus / as sysdba ALTER SYSTEM SET CLUSTER_DATABASE=FALSE SCOPE=SPFILE; SHUTDOWN IMMEDIATE; STARTUP; @$ORACLE_HOME/rdbms/admin/utlrp.sqlutlrp.sql会编译所有状态为INVALID的对象,包括存储过程、函数、包、视图、同义词和物化视图。它不是一次编译全部对象,而是默认启动多个并行会话逐个编译,并自动跳过依赖关系未满足的对象,在第一轮结束后再次检查未编译成功的对象。所以通常要把utlrp.sql连续执行两到三遍,直到查询dba_objects中失效对象数量不再减少为止。
编译完成后收集系统统计信息和字典统计信息。这一步不能省,因为升级过程中大量基表的数据被修改或重建,旧的统计信息已经失效。常见做法是:
EXEC DBMS_STATS.GATHER_DICTIONARY_STATS; EXEC DBMS_STATS.GATHER_FIXED_OBJECTS_STATS;GATHER_DICTIONARY_STATS收集 SYS、SYSTEM 等字典 schema 的统计信息,GATHER_FIXED_OBJECTS_STATS收集 X$ 内部视图的统计信息,这些视图记录的是内存结构而不是磁盘表,但优化器生成执行计划时会用到它们的统计信息,收集以分钟计,物超所值。
4.3 从 12.2.0.1 升到 19c 的差异点
12.2.0.1 升 19c 的过程和 11g 升 12.2 大同小异,但有几个差异点值得注意。19c 执行catupgrd.sql时要求数据库的兼容性参数compatible不能低于 12.2.0.0;如果你的参数文件里写了compatible='11.2.0.4',必须先改掉再启动升级模式,否则脚本会直接拒绝执行。
执行前确认参数:
SHOW PARAMETER compatible; ALTER SYSTEM SET compatible='12.2.0' SCOPE=SPFILE;第二个差异是 19c 的catupgrd.sql会自动检测临时表空间大小并发出警告,如果临时表空间不够,脚本会建议先手动扩容再继续。第三个差异是,19c 升级脚本对TIMESTAMP WITH TIME ZONE数据的验证更严格,时区版本低于 32 的话会直接报ORA-01882。
从 12.2 升 19c 的常规步骤如下:
sqlplus / as sysdba SHUTDOWN IMMEDIATE; STARTUP UPGRADE; SPOOL /u01/app/oracle/upgrade/catupgrd_19c.log @$ORACLE_HOME/rdbms/admin/catupgrd.sql SPOOL OFF SHUTDOWN IMMEDIATE; STARTUP; @$ORACLE_HOME/rdbms/admin/utlrp.sql这套流程和 11g 升 12.2 的流程几乎一样,区别在于中间少了一次utlrp.sql的重复执行次数——因为 12.2 升 19c 的字典变化比 11g 升 12.2 小,失效对象数量通常少一个量级。
4.4 参数文件迁移与内存参数重估
升级不能只盯着字典脚本,参数文件也要跟着版本走。11g 时代的很多参数在 19c 里已经失效或被替代,比如memory_target和sga_target的默认策略发生了很大变化。如果你原来的参数文件是 pfile,升级前要先用CREATE PFILE FROM SPFILE生成一份文本备份,防止catupgrd.sql修改SPFILE参数后无法还原。
升级到 19c 后,记忆参数建议改用MEMORY_TARGET或SGA_TARGET + PGA_AGGREGATE_TARGET的组合。11g 时代很多系统把SGA_TARGET和PGA_AGGREGATE_TARGET分别设成固定值,19c 的自动内存管理做得更好,给MEMORY_TARGET设定一个合理总值,让 Oracle 自行分配,更省心。
检查当前内存参数:
SHOW PARAMETER memory; SHOW PARAMETER sga; SHOW PARAMETER pga;如果memory_target为 0,说明当前用的是手动内存管理模式,建议升级到 19c 之后改成自动管理。注意:MEMORY_TARGET的生效需要重启数据库,而且修改sga_target和pga_aggregate_target时要先确认当前物理内存的可用量,不能贪多,留出足够的操作系统缓存空间给 I/O 用。
5. 回滚方案与升级后的稳定期:别让升级变成一次性的赌博
5.1 为什么升级失败时恢复原库比补丁回滚更靠谱
11g 升 19c 不像打小补丁那样可以一键回滚,因为数据库字典结构已经变了,旧的二进制文件无法直接读取新版字典。绝大多数情况下,回滚动作是“用备份恢复原库”,而不是“把升级脚本倒着跑一遍”。所以我强调升级前必须有全量备份,而且备份之后不能有新的业务写入——如果备份后还有增量数据进来,恢复出来的库会丢失这部分数据,这是灾难性的。
备份方案要分两层:一层是RMAN全量备份,一层是数据文件级的冷备份。RMAN 备份用于恢复,冷备份用于最极端的情况(比如磁盘故障同时发生)。RMAN 备份命令如下:
rman target / BACKUP DATABASE PLUS ARCHIVELOG FORMAT '/u01/app/oracle/backup/full_%U.bkp'; BACKUP CURRENT CONTROLFILE FORMAT '/u01/app/oracle/backup/ctl_%U.bkp';参数说明:PLUS ARCHIVELOG会先备份当前所有归档日志再备份数据文件,保证备份集可用于一致性恢复。%U是 Oracle 自动生成唯一文件名,避免覆盖。备份完成后把备份集和归档日志复制到独立存储或者另一台机器上,不要和生产库在同一块磁盘上,否则升级失败后磁盘也坏了,就没有后悔药了。
有了备份,升级失败恢复的流程就非常机械:重新安装 11g 软件(如果原环境还在就直接用)、恢复控制文件和数据文件、用RECOVER DATABASE追平归档、打开数据库。这个过程在测试环境连续演练两遍,确保时间可控、步骤不会出错,再正式执行生产升级。
5.2 升级中的失败点:空间不足、失效对象卡死、监听端口冲突
升级过程中最常见的失败原因有三个。第一个是归档日志空间被写满。这个前面提过,但实际操作中还是有人只预留了 20GB,结果catupgrd.sql跑到一半ORA-00257直接中断。解决方法是升级前把归档目录放到独立文件系统,并动态监控空间使用率,建议升级过程中每 15 分钟检查一次。
第二个是失效对象导致后置编译挂起。utlrp.sql在执行过程中如果遇到一个大包体编译超时,整个会话会一直等待。解决办法是不要在一个会话里干等,直接另开会话查询v$session_longops,定位到卡住的 SQL 和对象,判断是死锁还是单纯的编译耗时。死锁就杀掉会话重跑编译,耗时问题可以增大并行度:ALTER SESSION SET PARALLEL_DEGREE_POLICY = AUTO;。
第三个是监听端口冲突。11g 时代监听端口 1521 几乎独占,但 12c 和 19c 的安装过程会自动启动新的监听,如果系统上已经有一个监听占用了 1521,新监听会尝试 1522 或 1526,应用连接串如果没改,连上去的还是旧库。升级前把监听配置确认好,lsnrctl status看清楚当前监听端口,规划好新库的监听端口就写在升级方案里。
5.3 升级后的首周:需要盯着的 5 个关键指标
升级刚完成的第一周,数据库不会立刻暴露所有问题,但一些指标会给出早期信号。我一般会盯五个东西:数据库告警日志有没有新报错、AWR 报告里 top 事件是否有变化、应用的连接池是否频繁报连接超时、关键 SQL 的执行计划有没有退化、以及归档日志生成速度是否异常。
检查告警日志的命令:
tail -200 $ORACLE_BASE/diag/rdbms/orcl/ORCL/trace/alert_ORCL.log11g 的告警日志在$ORACLE_BASE/diag/rdbms/<db_name>/<SID>/trace/目录下,19c 沿用同一套结构,不用换路径习惯。重点看有没有ORA-00600、ORA-07445、ORA-04031这几种经典问题,其中ORA-04031表示共享池内存不足,多半是SGA_TARGET设得太小。
AWR 报告用下面的命令生成快照对比:
EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT;升级前和升级后各生成一个快照,然后执行awrrpt.sql脚本生成报告,对比两个时间段的DB Time、Top 5 Timed Events和Buffer Cache Hit Ratio。如果DB Time翻倍,说明 SQL 执行计划已经退化,需要用 SQL Tuning Advisor 重新调优重点 SQL。
5.4 保留原环境:降级窗口与数据保留期限
升级结束后,原 11g 环境不能急着清掉。常见做法是保留一段时间,具体期限取决于业务对稳定性的要求,我一般建议至少保留一个月。保留原环境期间,有两件事要做:一是定期用原 11g 库查询最新数据,验证备份恢复流程仍然有效;二是如果应用侧升级后出现性能问题,还能随时把流量切回原库,不用临时搭环境。
保留原环境不只是保留数据库文件,还包括原库的密码文件、监听配置、tnsnames.ora 和 Oracle 软件安装目录。很多人只备份了数据文件,到降级的时候才发现密码文件和参数文件也过期了。我习惯把整个$ORACLE_HOME/dbs目录打包备份一份,这个目录里包含参数文件、密码文件、spfile 文件和 key 文件,虽然不一定全用得上,但需要的时候能省一小时。
6. 升级后的专项验证:把“看起来正常”变成“确认正常”
升级完成后,最怕听到的一句话是“应该没问题了”。我会系统性地跑一遍验证清单,确认每个环节都拿到明确结果。这个验证分四层:基础连通性、数据完整性、功能正确性、性能对比。
第一层是基础连通性。先确认监听状态:
lsnrctl status再检查实例状态:
sqlplus / as sysdba SELECT instance_name, status, database_status FROM v$instance;然后从应用服务器上用 JDBC 或 sqlplus 做一次真实登录:
sqlplus system@//192.168.1.10:1521/ORCL这一步要用与生产一致的连接字符串,不要用sqlplus / as sysdba绕开网络。如果应用服务器没有 sqlplus,就用一个简单的 Java 或 Python 连接脚本,只要能执行SELECT 1 FROM dual就算通过。
第二层是数据完整性。拿升级前备份时的DBMS_ROWID或者关键业务表的记录数做对比。常用做法是升级前把每一张关键表的行数记录到一张统计表里,升级后再跑一遍同样的 SQL,做差值对比。核心表的校验 SQL:
SELECT COUNT(*) FROM orders; SELECT COUNT(*) FROM users; SELECT COUNT(*) FROM account_transactions;如果有差距不是零,先查差异比例,不要急着下结论。需要确认是否有 DML 操作在备份之后持续写入,如果有,这个差异是正常的。
第三层是功能正确性。把应用涉及的存储过程、函数和包各跑一遍,重点关注有无INVALID状态。同时测试几个典型的业务场景,比如登录、下单、查询报表、跑批任务。跑批任务尤其重要,因为升级后定时任务的时间调度和存储过程的执行计划都可能变化,跑批慢了不算功能问题,但跑批直接报错就是大问题。测试时记录每个场景的耗时,和升级前的历史值对比。
第四层是性能对比。升级前在测试环境采集过的 AWR 报告和 SQL 执行计划,升级后在同等工作负载下再采集一份。对比维度包括:单条 SQL 的逻辑读、物理读、执行时间;Top 事件是否有db file sequential read变成library cache load lock之类的变化;以及 PGA 内存消耗是否异常。这一步需要测试环境的数据分布和生产环境尽量接近,如果测试环境只有生产数据的十分之一,那性能对比的意义会打折扣。
最后留一个我自己的习惯:升级完成后,我会在数据库里建一个只读用户,专门用来跑巡检 SQL,每天定时检查失效对象、表空间使用率、告警日志中的新错误。持续一周,每天只看 5 分钟。一周下来没发现问题,再通知业务侧把升级正式关闭。这个习惯帮我拦下过三次升级后的隐患,一次是失效对象在第 3 天才冒出来,一次是临时表空间增长异常,一次是归档日志目录权限被意外修改。
希望这篇笔记能帮你把升级这件事从“心里没底”变成“步骤在手”。数据无价,备份先行,祝你升级顺利。
本文还有配套的精品资源,点击获取