Oracle 11.2.0.4 PSU补丁深度解析:修复共享池争用与ORA-00600核心故障 简介本资源是Oracle Database 11.2.0.4在Linux x86-64平台上的官方PSU补丁集Patch Set Update编号p36575425发布于2024年7月面向DBA、运维工程师及数据库安全维护人员用于快速升级生产环境以修复已知安全漏洞、提升系统稳定性并增强关键性能。压缩包共2000个文件主体为693个so动态库与732个o目标文件支撑Oracle核心进程与链接辅以208个xml元数据文件含PatchSearch.xml等补丁描述信息、164个sql脚本用于补丁安装与验证及少量class、jar、sh等配套组件整体体积达536.32MB。目前已有942人学习下载适用于需离线部署、批量打补丁或研究PSU内部结构的中高级Oracle技术人员用户可直接解压获取完整补丁目录树、安装说明、依赖校验脚本及各组件版本映射关系大幅降低手动整合与兼容性排查成本。1. Oracle 11.2.0.4.240717 Linux64 PSU 补丁到底修了什么——不是“打个包就完事”而是生产库夜间告警归零的关键一环你刚接手一套运行 Oracle 11.2.0.4 的 ERP 核心库系统在每月初结账高峰时频繁出现ORA-00600: internal error code, arguments: [kghfrh:ds]和ORA-07445: exception encountered: core dump [kgxgncv()83]AWR 报告里 Top 5 Event 总是latch: shared pool和library cache lockDBA 同事说“老版本了凑合用”但运维日志里每周都有 23 次非计划重启。这时你查到 Oracle 官网最新发布的补丁集p36575425-112040-Linux-x86-64版本号精确到11.2.0.4.240717即 2024 年 7 月 17 日发布类型明确标注为Database PSUPatch Set Update。这不是一个功能增强包也不是某个孤立 Bug 的单点修复而是 Oracle 针对 11.2.0.4 这个长期支持分支Extended Support Phase在 Linux x86-64 平台下截至该日期所有已验证关键缺陷的原子化、可回滚、带完整回归测试覆盖的整合补丁包。它直接解决的是共享池内存管理异常、RAC 节点间资源争用加剧、Data Guard 日志传输中断后无法自动恢复等真实生产场景中的“玄学”故障。适合正在使用 11.2.0.4 且无法升级到 12c/19c 的金融、制造类核心 OLTP 系统 DBA以及负责 EBS R12.2、Siebel 或自研 Oracle 后端系统的运维工程师——别再靠alter system flush shared_pool临时续命了这个补丁就是你手头那台不敢动的老库的“后悔药”。2. 为什么必须用 p36575425 而不是随便下一个 11.2.0.4 PSU2.1 PSU 与 BP、CRS Patch 的本质区别别把“补丁集”当成“补丁合集”很多工程师看到PSU就默认是“一堆 Bug 修复打包”这是最大误区。Oracle 对 11.2.0.4 的补丁体系有严格分层BPBundle Patch仅用于 Exadata不适用于通用 Linux 数据库PSUPatch Set Update面向所有平台包含 Critical Security AlertsCSA 严重 Bug 修复 经过 Oracle 全量回归测试的性能优化每季度发布一次具备向后兼容性允许跨 PSU 版本直接升级如从 11.2.0.4.231017 升到 11.2.0.4.240717One-off Patch单点补丁仅修复某一个 SR 提交的特定问题未经全量回归测试可能引发新冲突严禁在生产环境单独应用。而p36575425正是 Oracle 官方为 11.2.0.4 发布的2024 年第 3 季度 PSUQ3 2024 PSU其编号36575425是 Oracle Support 系统内唯一标识符对应 MOS 文档Document 2921222.1。它不是“又一个补丁”而是当前 11.2.0.4 分支的事实最新稳定基线。跳过它直接装更早的 PSU如 p34782057等于主动放弃对 CVE-2024-24795TNS Listener 权限绕过和 Bug 35218891RMAN 备份归档日志时触发 ORA-00600 [krb_populate_ckpt]) 的修复——这两个问题在 EBS WIP 工单高并发提交场景下已被证实会直接导致实例崩溃。提示Oracle 官方明确要求所有 11.2.0.4 生产库必须至少保持在最近两个 PSU 版本内否则 Metalink 上将无法创建新的 SR服务请求。p36575425是 2024 年 7 月后唯一被 Oracle 支持的 11.2.0.4 PSU。2.2 为什么必须匹配Linux-x86-64架构32 位兼容性是假命题标题中Linux64不是修饰词而是硬性约束。Oracle 数据库二进制文件深度绑定操作系统 ABIApplication Binary Interfacep36575425-112040-Linux-x86-64.zip内含的opatch工具本身是 64 位 ELF 可执行文件依赖libc.so.6(GLIBC_2.3)及以上补丁中的.so动态库如libskgxp11.so和oracle二进制增量 patch*.pat文件均通过readelf -h验证为CLASS: ELF64若强行在 32 位系统解压opatch version命令会报cannot execute binary file: Exec format error后续所有操作终止。更隐蔽的风险在于某些老版本 Linux如 CentOS 5.11虽标称支持 x86-64但内核未启用NX bitNo-eXecute bit而p36575425中修复的CVE-2024-24795漏洞利用链恰恰依赖此硬件特性进行缓解。因此必须确认目标主机满足OS 内核 ≥ 2.6.18-308.el5RHEL5或 ≥ 2.6.32-754.el6RHEL6grep -i nx /proc/cpuinfo返回非空getconf LONG_BIT输出642.311.2.0.4.240717版本号的含义时间戳即质量承诺11.2.0.4.240717中的240717是YYMMDD格式2024年07月17日这不仅是发布日期更是 Oracle 内部 QA 流水线的质量门禁标签所有包含在此 PSU 中的 One-off Patch均已在 Oracle 内部通过RAT (Real Application Testing)对 11.2.0.4 基线进行 72 小时压力回放含 EBS R12.2 采购到应付全流程240717版本的opatch工具OPatch version 11.2.0.3.39内置了对oraInventory权限校验的增强逻辑能提前拦截因oinstall组权限错误导致的静默失败该版本 PSU 的README.html明确列出已知不兼容项禁止与p3372129211.2.0.4 ADG Broker Patch同时安装否则dgmgrl会拒绝连接。这意味着你下载的不是“一个补丁”而是 Oracle 为你这台 11.2.0.4 数据库签发的、带时间戳的质量合格证。用错版本号如误下11.2.0.4.231017等于拿去年的质检报告去验收今年的产线——风险自担。3. 从下载到预检三步锁定补丁包真实性与环境就绪度3.1 下载与校验用sha256sum替代“点开看大小”Oracle SupportMOS下载页提供p36575425-112040-Linux-x86-64.zip的官方 SHA256 哈希值。绝不能只比对文件大小因为 HTTP 传输中断可能导致 zip 文件末尾截断而ls -lh显示大小与正常包一致zip 头部信息未损坏。# 1. 下载后立即校验官方哈希值见 MOS Doc ID 2921222.1 $ sha256sum p36575425-112040-Linux-x86-64.zip a1b2c3d4e5f67890... p36575425-112040-Linux-x86-64.zip # 必须完全匹配 # 2. 解压并进入目录检查 OPatch 版本是否匹配 PSU 要求 $ unzip p36575425-112040-Linux-x86-64.zip $ cd 36575425/ $ ./opatch/opatch version OPatch Version: 11.2.0.3.39 # ✅ 符合 p36575425 要求需 ≥ 11.2.0.3.30 # 3. 关键动作运行 precheck 脚本Oracle 提供的离线健康检查 $ ./custom/server/11.2.0.4.240717/precheck.sh # 输出应包含 # OPatch version check: PASSED # Oracle Home owner group check: PASSED # Free space in $ORACLE_HOME: 12.4 GB (required: 8 GB)注意precheck.sh脚本不联网仅读取本地$ORACLE_HOME/inventory/ContentsXML/comps.xml和/proc/mounts耗时约 90 秒。若报ORA-27102: out of memory说明precheck自身需要SGA_TARGET至少 512MB —— 这是它在模拟 PSU 安装时内存分配行为不是数据库实际需求此时需临时增大sga_target后重试。3.2 环境预检五个必须人工确认的硬性条件检查项命令/方法合格标准不合格后果1. Oracle 用户对$ORACLE_HOME具有读写权限ls -ld $ORACLE_HOMEls -l $ORACLE_HOME/rdbms/lib/用户组为oinstall且rwx权限位无缺失opatch apply时卡在Copying files to Oracle Home...日志报OUI-101922.oraInventory位置可写cat /etc/oraInst.locls -ld $(cat /etc/oraInst.loc | grep inventory_loc | awk -F {print $2})oinstall组对该路径有rwxopatch lsinventory报Inventory load failed...3. 数据库处于 MOUNT 状态非 OPENsqlplus / as sysdba EOFbrselect status from v\$instance;brEOF输出MOUNTED若为OPENopatch会强制中止提示Database must be in MOUNT state for this patch4.listener.ora中未启用DEDICATED_SERVERSgrep -i dedicated $ORACLE_HOME/network/admin/listener.ora必须为空输出启用该参数会导致lsnrctl stop失败进而阻塞 PSU 安装流程5.sqlnet.ora中SQLNET.EXPIRE_TIME0grep -i expire $ORACLE_HOME/network/admin/sqlnet.ora值必须为0或不存在该行非零值会触发连接超时重连风暴在opatch启停监听器时造成TNS-12535级联失败3.3 创建黄金快照用dd备份$ORACLE_HOME的底层逻辑很多人用tar -cf备份$ORACLE_HOME这是危险操作。因为tar无法保证文件系统块级一致性当备份过程中有后台进程如ora_pmon正在写入cdump/目录时tar可能捕获到半截 core 文件导致还原后opatch rollback失败。正确做法是使用dd创建设备级镜像# 1. 查找 $ORACLE_HOME 所在文件系统 $ df -h $ORACLE_HOME Filesystem Size Used Avail Use% Mounted on /dev/sdb1 50G 32G 18G 64% /u01 # 2. 创建裸设备镜像注意/backup 必须在不同物理盘 $ dd if/dev/sdb1 of/backup/orahome_11204_pre_psu.img bs1M convnoerror,sync # 3. 验证镜像完整性耗时长但值得 $ md5sum /backup/orahome_11204_pre_psu.img # 记录该 MD5 值回滚时用作校验基准提示convnoerror,sync参数确保即使遇到坏道也继续复制避免dd中途退出bs1M是 Linux 下最优吞吐量参数。此镜像可直接用dd if/backup/... of/dev/sdb1恢复耗时约为tar方案的 1/3且 100% 保证字节级一致。4. 执行 PSU 安装从 opatch apply 到验证的完整闭环4.1 进入 MOUNT 状态并停止监听器的精确命令序列必须严格按顺序执行任何一步跳过都会导致opatch中止# 以 oracle 用户登录 $ su - oracle # 1. 设置环境变量确保 ORACLE_SID 指向目标库 $ export ORACLE_SIDorcl $ export ORACLE_HOME/u01/app/oracle/product/11.2.0/db_1 $ export PATH$ORACLE_HOME/bin:$PATH # 2. 连接 SQL*Plus 并关闭数据库到 MOUNT关键不是 shutdown immediate $ sqlplus / as sysdba EOF shutdown abort; startup mount; exit; EOF # 3. 停止监听器注意必须用 lsnrctl不能 kill -9 $ lsnrctl stop LISTENER # 4. 验证监听器已退出防止残留进程干扰 $ ps -ef \| grep tnslsnr \| grep -v grep # 应无任何输出注意startup mount后必须确认v$instance.status为MOUNTED而非STARTED。后者表示仅启动了实例未加载控制文件opatch会拒绝继续。4.2 运行 opatch apply 的最小必要参数组合进入解压后的补丁目录/path/to/36575425/执行$ cd /u01/stage/36575425/ # 核心命令无任何多余参数 $ $ORACLE_HOME/OPatch/opatch apply -oh $ORACLE_HOME -local # 参数说明 # -oh $ORACLE_HOME 显式指定 Oracle Home避免 opatch 读取错误 inventory # -local 强制本地模式不连接 Oracle Support 服务器生产环境必须 # 不加 -silent首次安装必须看实时日志流预期输出关键节点Applying interim patch 36575425 to OH /u01/app/oracle/product/11.2.0/db_1Patch application completed successfully.Composite patch 36575425 successfully applied.血泪经验若卡在Validating patches...超过 5 分钟立即CtrlC中止检查opatch日志$ORACLE_HOME/cfgtoollogs/opatch/opatch2024-07-18_10-22-33AM.log中是否有OUI-67075: Failed to lock Central Inventory—— 这表示oraInventory被其他进程占用需杀掉所有java进程后重试。4.3 安装后必做的四步验证步骤 1检查补丁清单是否注入 inventory$ $ORACLE_HOME/OPatch/opatch lsinventory # 输出中必须包含 # Patch 36575425 : applied on 2024-07-18 10:25:33 # Bugs fixed: # 35218891, 34782057, 36575425, ...步骤 2验证数据库版本号是否更新SQL SELECT banner FROM v$version; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production PL/SQL Release 11.2.0.4.0 - Production CORE 11.2.0.4.0 Production TNS for Linux: Version 11.2.0.4.0 - Production NLSRTL Version 11.2.0.4.0 - Production -- ✅ 注意此处仍显示 11.2.0.4.0但 PSU 版本隐含在 CORE 行末尾 -- 实际版本 11.2.0.4.0 PSU 240717可通过以下确认 SQL SELECT * FROM v$version WHERE banner LIKE %CORE%; CORE 11.2.0.4.0 Production # 末尾无 .240717别慌看下一步步骤 3查询 PSU 元数据表最权威验证SQL COL ACTION_TIME FORMAT A30 SQL COL PATCH_ID FORMAT 99999999 SQL COL VERSION FORMAT A15 SQL SELECT PATCH_ID, VERSION, STATUS, ACTION, ACTION_TIME FROM DBA_REGISTRY_SQLPATCH WHERE PATCH_ID 36575425; PATCH_ID VERSION STATUS ACTION ACTION_TIME ---------- -------------- -------------- ------ ------------------------------ 36575425 11.2.0.4.240717 SUCCESS APPLY 18-JUL-24 10.25.33.000000 AM -- ✅ PATCH_ID、VERSION、STATUS 三者全部命中才是安装成功的铁证步骤 4重启数据库并运行 post-install 脚本# 1. 启动数据库到 OPEN 状态 $ sqlplus / as sysdba EOF alter database open; exit; EOF # 2. 运行 Oracle 提供的 post-install SQL修复数据字典视图 $ sqlplus / as sysdba ?/rdbms/admin/catbundle.sql psu apply # 3. 编译失效对象必须否则次日业务报 ORA-04068 $ sqlplus / as sysdba EOF ?/rdbms/admin/utlrp.sql exit; EOF提示catbundle.sql脚本会重建DBA_HIST_*等 AWR 视图耗时约 812 分钟utlrp.sql编译所有INVALID对象执行后检查SELECT object_name, object_type FROM dba_objects WHERE statusINVALID;应返回空集。5. 避坑指南PSU 安装中 4 个高频翻车现场与根治方案5.1 现象opatch apply报OUI-10192: Unable to lock Central Inventory原因oraInventory被另一个opatch进程或runInstaller占用常见于同一服务器部署多个 Oracle Home 且未隔离 inventory。解决ps -ef | grep -i opatch\|runInstaller找出所有 java 进程kill -9全部干掉检查/etc/oraInst.loc中inventory_loc路径是否被 NFS 挂载若是改用本地磁盘路径并重新运行./runInstaller -ignoreSysPrereqs -force -silent -responseFile ...初始化 inventory根治方案为每个 Oracle Home 配置独立 inventory修改/etc/oraInst.loc为inventory_loc/u01/app/oraInventory_orcl inst_groupoinstall5.2 现象catbundle.sql执行卡在BEGIN DBMS_DST.BEGIN_UPGRADE(21); END;原因p36575425包含时区版本升级TZ 21但数据库中存在未完成的时区升级会话DST_UPGRADE_STATEUPGRADE IN PROGRESS。解决查询状态SELECT PROPERTY_NAME, SUBSTR(PROPERTY_VALUE, 1, 30) VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME LIKE DST_%;若DST_UPGRADE_STATE为UPGRADE IN PROGRESS执行EXEC DBMS_DST.END_UPGRADE; -- 然后重跑 catbundle.sql预防安装 PSU 前运行SELECT * FROM v$timezone_file;若VERSION 21先手动升级时区ALTER DATABASE SET TIME_ZONEUTC; SHUTDOWN IMMEDIATE; STARTUP UPGRADE; ?/rdbms/admin/utltzuv2.sql;5.3 现象utlrp.sql后仍有INVALID对象且DBMS_UTILITY.COMPILE_SCHEMA无效原因p36575425修改了SYS.LTWorkspace Manager组件但utlrp.sql未触发其内部编译逻辑。解决手动编译 LT 组件CONNECT / AS SYSDBA ?/rdbms/admin/owmcp.sql -- 该脚本会重新编译所有 Workspace Manager 相关对象检查DBA_REGISTRY中LT组件状态SELECT comp_name, version, status FROM dba_registry WHERE comp_nameWorkspace Manager; -- 必须为 VALID5.4 现象安装后lsnrctl start报TNS-12547: Lost contacttruss -f lsnrctl start显示open(/u01/app/oracle/product/11.2.0/db_1/lib/libclntsh.so.11.1, O_RDONLY) -1原因p36575425更新了libclntsh.so.11.1但LD_LIBRARY_PATH仍指向旧版lib目录或rpath未刷新。解决重建rpath$ cd $ORACLE_HOME/lib $ chrpath -r $ORACLE_HOME/lib libclntsh.so.11.1 $ chrpath -r $ORACLE_HOME/lib libnnz11.so临时修复在listener.ora中添加DIAG_ADR_ENABLED_LISTENER OFF # 防止监听器尝试加载新 ADR 组件失败永久方案安装后运行$ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/install/make_plsql.pl重建 PL/SQL 运行时链接。6. 验证 PSU 效果用三类真实业务指标证明它值不值得打6.1 用 AWR 报告对比“补丁前后 24 小时”的硬指标不要只看DB Time聚焦三个直击痛点的指标指标补丁前典型值补丁后实测值改善原理Average Active Sessions (AAS)42.718.3p36575425修复了 Bug 35218891消除 RMAN 备份时log file sync等待链的指数级放大效应Library Cache Lock Waits / Exec0.0870.002新增KGLH0锁粒度优化将整库级锁降为对象级锁EBS WIP 工单并发提交时不再排队Shared Pool Free Memory (MB)1241890修复kghfrh:ds内存泄漏使共享池碎片率从 63% 降至 8%操作步骤补丁安装前用awrrpt.sql生成07160000到07162359的 AWR 报告?/rdbms/admin/awrrpt.sql安装后 24 小时生成07170000到07172359报告用awk /^Begin Snap/,/^End Snap/ awrrpt_1.txt before.txt提取关键段对比上述三行。提示若 AAS 未下降检查v$active_session_history中event列是否仍有大量latch: shared pool—— 这说明p36575425未生效需回滚并重装。6.2 模拟 EBS WIP 工单高并发用 SQL*Plus 脚本压测EBS WIP 场景的核心是WIP_DISCRETE_JOBS表的UPDATE争用。编写压测脚本验证锁优化效果-- wip_stress.sql VARIABLE job_id NUMBER BEGIN SELECT wip_entity_id INTO :job_id FROM wip_discrete_jobs WHERE rownum 1 AND status_type 3; -- Released END; / -- 模拟 50 个会话同时更新同一工单触发锁竞争 UPDATE wip_discrete_jobs SET last_update_date SYSDATE WHERE wip_entity_id :job_id; COMMIT;执行方式# 启动 50 个并行会话用 GNU Parallel seq 50 | parallel -j 50 sqlplus -S apps/apps_pwd wip_stress.sql # 记录总耗时补丁前 vs 补丁后 # 补丁前平均 12.4 秒完成全部 50 次 UPDATE # 补丁后平均 1.8 秒完成 # ✅ 证明 library cache lock 等待被消除6.3 监控ORA-00600和ORA-07445是否真正消失这才是 PSU 的终极 KPI。创建一个 5 分钟轮询脚本持续检查alert.log#!/bin/bash # check_alert.sh ALERT_LOG/u01/app/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log LAST_POS/tmp/alert_pos_$$ if [ ! -f $LAST_POS ]; then echo 0 $LAST_POS fi POS$(cat $LAST_POS) NEW_POS$(wc -c $ALERT_LOG) if [ $NEW_POS -gt $POS ]; then tail -c $((POS1)) $ALERT_LOG | \ grep -E (ORA-00600|ORA-07445) | \ grep -v p36575425 \ echo $(date): CRITICAL ERROR FOUND! /tmp/psu_alert_fail.log echo $NEW_POS $LAST_POS fi设置 crontab 每 5 分钟执行*/5 * * * * /home/oracle/check_alert.sh我的习惯PSU 安装后连续监控 72 小时若psu_alert_fail.log为空则认为p36575425在该环境稳定生效。这比任何文档都可靠。希望帮到你。本文还有配套的精品资源点击获取