简介:Oracle 11.2.0.4补丁包(2022年10月18日更新,适用于Windows x64)面向仍在运行Oracle 11g R2的数据库管理员与运维人员,是保障数据库安全与性能的关键资源。作为11g R2最后的主要补丁集,该版本集中了安全修复、性能优化和缺陷修复,尤其适合尚未迁移到更高版本、需要维持系统稳定的生产环境。整个资源包共463个文件,约637.5MB,文件类型以jar、dll、properties、exe、pl、sh、bat为主,其中有可执行程序、动态链接库、配置属性和自动化脚本,能够支撑64位Windows平台上的完整补丁维护工作。压缩包内额外提供OPatch工具及其辅助脚本,并附有md、txt等说明文档,便于理解补丁验证和环境检查步骤;管理员可使用apply命令完成补丁应用,再用lsinventory核对安装结果,配合事前备份与先在非生产环境测试等做法,能显著降低升级风险。目前已有2257人学习下载,适合需要掌握Oracle 11g补丁管理、系统安全加固及性能调优的数据库技术人员。
1. 补丁包背后:11.2.0.4 在 2022 年 10 月之后还能怎么补
在 2025 年还能见到跑在 Windows 服务器上的 Oracle 11.2.0.4 生产库,这并不稀奇;真正稀奇的是,很多这类库的补丁状态还停留在两三年前。Oracle 11.2.0.4 的补丁包到 2022 年 10 月 18 日仍然在出正式的 Win64 版本,之后基本不再有统一的季度更新,这意味着 2022.10.18 这个包,是把老库补到官方最终状态的关键资源。它能解决的是:库还迁不走,但等保和安全扫描已经盯着漏洞不放;适合的是一线 DBA,以及运维手里还攥着一批 11g 老库的人。这篇文章照着拆包、预检、apply 和 datapatch 的顺序往下走,最后把翻车点一个个列清楚。
2. 拆包看货:PSU、OJVM 与客户端补丁的三种身份
2.1 先分清三类成分:同是补丁,后遗症差别很大
从补丁下载平台拿到的这个包,表面上看是一个压缩包,但里面通常不是单一补丁。11.2.0.4 在 Windows 64 位平台上,补丁包往往混着三类东西:数据库 PSU/RU、OJVM 补丁、Windows x64 客户端补丁。我先说结论:这三类补进 ORACLE_HOME 的机制不一样,回滚能力也不一样,搞混了会把环境补成半吊子。
下面这张表是我每次拆包先提醒自己的对照清单:
| 成分 | 影响范围 | 安装方式 | 回滚边界 | | 数据库 PSU / RU | 数据库内核、监听、SQL*Plus 等工具 | opatch apply | 可以回滚,但跨 datapatch 后有限制 | | OJVM 补丁 | Java 虚拟机、DBMS_JAVA、loadjava | 独立 opatch apply | 多数情况不能回滚 | | 客户端补丁 | 独立 client 的 ORACLE_HOME | 单独安装 | 视具体补丁版本而定 |
怎么快速识别?压缩包里补丁目录名一般是一个八位数字编号,真正的编号以你拿到的压缩包和 README 为准。文件名通常长得像 p<编号>_112040_MSWIN-x86-64.zip 这种格式,其中 112040 代表 11.2.0.4 平台基线,MSWIN-x86-64 代表 Windows 64 位。解压之后别急着动,先把每个子目录下的 README.html 或 README.txt 打开,上面会写明这个补丁是给哪个 Home 的、最低 opatch 版本、前置补丁要求。这一步花五分钟,能省后面三个小时。
2.2 为什么说 2022 年 10 月这个包值得单独留一份
Oracle 对 11.2.0.4 的延长支持在 2020 年前后已经进入尾声,到 2022 年 10 月这一批,基本是普通订阅用户能拿到的最后正式统一补丁。之后就算再出修复,也是定制补丁通道,不再走季度 CPU/PSU 的常规发布。对一线运维来说,这件事的实际意义是:
第一,这个时间点的补丁包适合作为老库的“最终基线”。以后排查故障,先确认环境是否已经在这个基线之上,能省掉一大类“是不是缺补丁导致”的怀疑。第二,不要再指望后续季度更新覆盖 11g 的洞,等保检查问补丁更新到什么时间,这个包就是对不齐的答案。第三,我给自己立了个习惯:凡是还在跑的 11.2.0.4,统一以这个最终批次之后的版本为基线,之后不追新,稳定优先。
2.3 校验完整性:先别急着双击解压
砸过一次哈希不完整导致 apply 到一半报文件校验失败的锅之后,我每次拿到补丁包都先做一件事:验证哈希。Windows 上不用装额外工具,系统自带 certutil 就能办到。
# 列出压缩包内容,确认目录结构与预期一致 7z l Oracle_112040_PSU_2022.10.18_Win64.zip # 计算 SHA256,和 Oracle 官方页面给出的值逐位核对 certutil -hashfile Oracle_112040_PSU_2022.10.18_Win64.zip SHA256逻辑说明:7z 列包是为了在解压前看清里面有几个补丁目录,防止下载到的是残缺包;certutil 校验哈希则用来确认文件没有被网络传输过程中的异常损坏。官方下载页面通常同时给出 MD5、SHA1、SHA256,我习惯对 SHA256,碰撞概率低到可以忽略。
参数说明:certutil 的-hashfile第一个参数是要校验的文件路径,第二个参数是算法名,大小写都行。如果服务器是 Windows Server 2008 R2 或 2012,certutil 同样可用;实在找不到就退回 7-Zip 自带的文件哈希功能,效果一样。校验通过后,我习惯把解压目录放到C:\oracle_patch,坚决不解压到 ORACLE_HOME 内部,免得后续目录遍历时把补丁目录里的旧文件扫进去。
3. 补丁前的三条硬规矩:opatch 版本、服务停干净与备份清单
3.1 opatch 版本太低,后面全部白搭
opatch 负责把补丁元数据写进 ORACLE_HOME 的 inventory,版本低了不识别新补丁的格式,轻则报警告,重则直接拒绝 apply。补丁包 README 里通常会写明最低 opatch 版本要求,但很多人跳过 README 直接执行,结果就是 opatch 在解析补丁描述文件时报错。先检查当前版本:
# 在 ORACLE_HOME 环境变量就绪后,查看当前 opatch 版本 opatch version正常输出类似OPatch Version: 11.2.0.3.x。如果版本低于补丁要求,需要先下载匹配的 opatch 包,解压后覆盖%ORACLE_HOME%\OPatch目录。覆盖之前把原 OPatch 目录改名备份,例如改成OPatch_bak_$(date),这样万一新 opatch 与当前环境不兼容还能倒回去。常见报错是 opatch 提示PRIF-0000无法读取 inventory,看到这类信息先别急着怀疑补丁包,八成是 opatch 版本与 inventory 结构不匹配。
3.2 环境对标:把服务停干净再谈打补丁
opatch apply 要求没有进程占用 ORACLE_HOME 下的文件,Windows 上最彻底的准备方式不是 shutdown immediate,而是直接把服务停掉。生产库如果允许停机窗口,我一般走完 shutdown immediate 之后再用 sc 停服务,双保险:
# 查看Oracle实例服务和监听服务的当前状态 sc query OracleServiceORCL sc query OracleOraDb11g_home1TNSListenersc query的关键是看 STATE 一列,RUNNING 就说明服务还活着。把这两个服务停掉后,别马上开始 apply,先去任务管理器确认没有 oracle.exe、tnslsnr.exe 残留。这类残留进程是 Windows 平台补丁失败的主因之一,文件被占用会导致 opatch 在复制阶段报错。如果进程杀不掉,用taskkill /F /IM oracle.exe /IM tnslsnr.exe强制结束后再看一遍。
3.3 备份清单:这张表上的东西不能省
打补丁通常不动数据文件,但补丁过程中如果出现意外中断,实例重启时可能触发实例恢复,所以备份习惯不能省。我给自己定的最低备份清单如下:
| 备份对象 | 路径示例 | 备份方式与目的 | | spfile |%ORACLE_HOME%\database\SPFILEORCL.ORA| 复制一份,防止回滚后参数不兼容 | | 密码文件 |%ORACLE_HOME%\database\PWDORCL.ORA| 复制一份,防止文件被覆盖 | | 网络配置 |%ORACLE_HOME%\network\admin下 tnsnames.ora、listener.ora | 出问题可快速还原监听配置 | | 数据文件 | 数据文件完整路径 | RMAN 全备或冷备,归档模式下最低也做一次全备 |
有没有例外?如果环境很小、本来就没有开归档,冷备是唯一靠谱的选择:关库后用操作系统复制把所有数据文件、控制文件、redo log 复制出去,然后再打补丁。备份结束后顺手查一下注册表里的 ORACLE_HOME 路径,Windows 上如果当初装到了带空格的路径(比如C:\Program Files\...)或者中文目录,opatch 在路径解析时很容易翻车。遇到这种环境,我的建议是先骂一遍当初装机的人,然后把补丁包放到短路径下执行,否则后面排查补丁路径问题的成本会非常高。
4. 手工apply完整路径:从 opatch prereq 到 datapatch 收尾
4.1 目录归类和 README 对照:执行前先分好兵
把压缩包解压出来后,第一件事是把补丁目录按身份分开:数据库 PSU/RU 归一组,OJVM 归一组,客户端补丁归一组。同一套补丁包里,DB 和 OJVM 通常目录编号不同,README 里也会标明安装顺序。常见做法是先装数据库 PSU,再装 OJVM;如果 README 写了特殊顺序,以补丁包自带说明为准,不要拿其他环境的经验硬套。
顺带提一个容易忽略的点:有些下载名称为 PSU 的包其实已经包含了前置补丁,是 bundle 格式,不再需要自己凑前置条件;有些则严格要求先装一个旧补丁再装新补丁。判断依据就是 README 里“Pre-requisite”一节。这一节没看清楚就开跑,往往是 opatch 在预检阶段报“missing prerequisite patch”停住。
4.2 设置环境变量并跑预检查
Windows 下最容易出问题的是环境变量不干净。我每次开一个新的 cmd 窗口,都把这些变量重新敲一遍,不依赖系统全局配置:
set ORACLE_HOME=C:\app\oracle\product\11.2.0\dbhome_1 set ORACLE_SID=ORCL set PATH=%ORACLE_HOME%\OPatch;%PATH% cd /d C:\oracle_patch\<补丁目录> opatch prereq CheckSystemSpace -ph .这段命令的逻辑:前三行把 Oracle 环境变量收紧到当前会话,避免和其他版本的 Oracle 客户端冲突;cd进入补丁目录;opatch prereq CheckSystemSpace -ph .中的-ph表示补丁目录路径,.表示当前目录,作用是检查磁盘空间、依赖组件和补丁冲突。我在多套 Oracle 共存的环境上吃过PATH混乱的亏——PATH里既有 12c 的 bin 又有 11g 的 bin,opatch 执行时调用的 sqlplus 版本不对,直接报“SQL*Plus could not be loaded”。从那以后,凡是手工操作 Oracle 补丁,一律不开全局环境,只用当前窗口设置。
4.3 正式 apply:交互式执行比静默更可控
预检通过后进入正式安装阶段:
cd /d C:\oracle_patch\<补丁目录> opatch applyapply 过程中 opatch 会读取补丁描述文件,逐步替换二进制文件,最后把补丁信息写入 inventory。耗时取决于补丁大小和机器性能,通常几分钟到半小时不等。我在第一次给生产库打补丁时试过opatch apply -silent,结果中途某个环节失败,日志信息被吞掉一大半,反而更难排查。现在一律用交互模式,虽然多按一次回车,但每一步的输出都看得到。
期间如果卡住,先别急着判断死机。opatch 的日志落在%ORACLE_HOME%\cfgtoollogs\opatch\目录下,文件名格式是opatch2022-xx-xx_xx-xx-xx.log。打开日志看最后几行,如果停在文件复制阶段,多半是被杀毒软件扫描拖慢;如果停在Invoking SQL*Plus这行,说明数据库没有完全关闭。Windows 上保险做法是再敲一遍sc query OracleServiceORCL确认服务是 STOPPED,然后再重跑。
4.4 datapatch 收尾:忽略这步等于白打
opatch apply 只完成了二进制层面的更新,数据库内部的 SQL Patch 通常不会自动注册。启动数据库后用 datapatch 把补丁中的 SQL 脚本应用进去:
set ORACLE_HOME=C:\app\oracle\product\11.2.0\dbhome_1 set ORACLE_SID=ORCL cd /d %ORACLE_HOME%\OPatch datapatch -verbose用-verbose是为了看到每一步 SQL 应用细节,文档里参数释义是输出详细日志。不带它也能执行,但排错时缺少上下文,所以我一直带着。datapatch 执行完毕后,才能查到 dba_registry_sqlpatch 视图里的补丁记录。
select patch_id, patch_uid, status, description from dba_registry_sqlpatch order by patch_id;这条查询用于确认 SQL patch 的注册状态,status字段为APPLY_APPLIED才算成功。patch_id对应补丁编号,patch_uid是补丁在数据库内的唯一标识。这一步经常被跳过一个坑:opatch 显示成功,但应用层还是连不上或用不了新特性,查了半天才发现 SQL patch 没落地。以后凡是我经手的补丁,opatch 成功和 datapatch 成功这两条缺一不可。
4.5 监听与客户端补丁:同一个包里的另一个战场
如果机器上还装有独立的 Oracle Client 11.2.0.4,补丁包里针对 client 的部分要单独安装。很多 DBA 只给服务端打了补丁,应用服务器上的 client 还是旧版,结果连库时报ORA-28040: No matching authentication protocol,这大概是我见过最多的补丁后遗症之一。
处理方式:解压客户端补丁目录,在 client 的 ORACLE_HOME 下同样执行 opatch 流程,环境变量换成 client 的路径,别和服务端混用同一个 HOME。业务侧如果用的还是 ojdbc6.jar 这类 11g 时代驱动,系统继续跑 11.2.0.4 没大毛病,但打完补丁后最好用一次真实连接测试,确认 JDBC 驱动与数据库补丁后的协议版本兼容。
5. 避坑排查:五个翻车现场的记录
5.1 OJVM 补丁装完发现不能回滚
现象:打 OJVM 补丁前没备份,后来库出现异常,想 opatch rollback,结果列补丁清单里根本看不到 OJVM,或者直接提示该补丁不支持回滚。 原因:OJVM 属于 Java 虚拟机层面的维护补丁,Oracle 为 11.2.0.4 之后的 OJVM 补丁设计了不可回滚的安装方式,inventory 里就没有登记可回滚信息。 解决:装 OJVM 之前先把 ORACLE_HOME 下javavm目录和lib目录做文件级备份。真出问题,最快的办法是从备份整体还原 ORACLE_HOME,不要指望 opatch 单独把 OJVM 摘出去。我现在的习惯是:凡生产库要动 OJVM,先做一次虚拟机快照或整个 Home 目录的文件级复制,再进补丁流程。
5.2 Windows 上照抄 Linux 的 opatch auto 命令
现象:网上教程写着用opatch auto -apply打补丁,拿到 Windows 环境一跑,提示找不到 clusterware,或者 opatch 工作目录根本没有 auto 子目录。 原因:opatch auto面向 RAC/集群环境设计,单实例单节点的 Windows 安装包不包含对应的自动化调用目录,自然无法识别。 解决:Windows 单机直接用手工opatch apply流程。如果是 RAC for Windows,那就先启动 CRS 服务,按节点逐个执行,别把 Linux 的自动化命令照抄过来。这类问题的本质是平台边界没看清,我一般会在操作单上先核对“环境是单实例还是 RAC”,再决定走哪条安装路径。
5.3 datapatch 卡住不动,日志停在一条 SQL 上
现象:datapatch -verbose 跑很久,日志停在某一条 insert/update 上,最后报 ORA-04021 或 ORA-04031。 原因:字典缓存被大量无效对象占住,或者 shared pool 内存不足,再或者是上一次补丁中断留下了未完成的残留状态,SQL 脚本重放时死锁。 解决:先查无效对象,再决定是否清共享池。
-- 查看无效对象规模,数量巨大时先处理它们 select owner, object_name, object_type, status from all_objects where status <> 'VALID';有大量无效对象先确定是不是补丁前就存在的,补丁前就有的就声明在前,补丁新产生的才需要处理。再不行就alter system flush shared_pool;后重跑 datapatch。这条命令在 11g 生产库上会影响所有会话的 SQL 解析性能,必须放到业务低峰执行。我最开始不懂这个,白天施工时 flush 了一下,回话马上变慢,被业务方追着问了俩小时。
5.4 监听服务起不来卡在 TNS-12541
现象:补丁打完后 lsnrctl start 起不来,报 TNS-12541、TNS-01196,或监听一直停在 starting 状态。 原因:监听端口被其他进程占用;listener.ora 里的路径还指向旧的 Home;或者监听服务对应的可执行文件路径在补丁后变了。 解决:按顺序排查。第一,lsnrctl status看监听日志;第二,netstat -ano | findstr 1521看端口占用,占用方不是 oracle 就杀进程;第三,确认 listener.ora 里LISTENER节点的目录确实指向当前 Home。监听这类问题有时候很玄学,但九成逃不出这三个方向,按顺序走一遍能收敛。
5.5 打补丁后应用连不上,账号密码过期
现象:补丁装完,应用连库报 ORA-28002 或 ORA-28001,销售开始怀疑补丁出了问题。 原因:补丁本身不会主动改密码策略,但环境在补丁前已经配置了默认口令生命期,停机窗口恰好跨过了密码过期时间点,库一启动就弹出密码过期提示。 解决:用 sys 登录,把业务账号对应的 profile 口令策略放开:
alter profile default limit password_life_time unlimited password_lock_time unlimited;什么时候该骂补丁、什么时候该查配置文件,这里是个典型例子。补丁只是压死骆驼的最后一根稻草,真正的雷是之前就埋下的。
6. 打完之后:验证习惯与回滚的边界
6.1 一张验证清单,替换“看着像没事”
补丁打完之后,我按固定顺序做四件事。第一步,opatch lsinventory -detail输出里有目标补丁号,状态是 APPLIED。第二步,用 6 里的 SQL 查 dba_registry_sqlpatch,确认 SQL patch 状态是 APPLY_APPLIED。第三步,用 dbeaver 或 PL/SQL Developer 做一次业务账号的真实查询,不是查 sys 表,而是走业务侧的同一条 SQL 路径。第四步,打开 11g 的 alert 日志,从补丁后启动时间点扫到当前,确认没有 ORA-600、ORA-7445 之类内部错误。这套流程走完,我才会在维护记录上签字。
6.2 后悔药能吃多少
回滚边界这个问题,我的教训很直接:数据库补丁的 rollback 不是万能的。PSU/RU 部分可以用opatch rollback -id <补丁号>滚回,但前提是数据库没有跨过 datapatch 之后的长时间运行;如果已经跑了一天,生产数据在补丁后的代码路径下发生了写入,rollback 之后再跑datapatch -rollback也未必能完全恢复原来状态。OJVM 就更不用指望,基本只能前滚修复或还原 Home。所以,真正可执行的后悔药是备份,不是 rollback 命令。打补丁前把 RMAN 备份或冷备做完,发现问题直接还原,比在 rollback 边界上抠半天靠谱。
从那以后,我给每一台正式环境的 11.2.0.4 都保留一份补丁包、一份打完后的 opatch 输出和 datapatch 日志,按库名归档。再遇到环境疑神疑鬼,先对这三样,问题立刻收敛一半。这个习惯救过我很多次,希望帮到你。
本文还有配套的精品资源,点击获取