ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Oracle 11.2.0.4补丁:Linux环境识别与opatch运维指南

Oracle 11.2.0.4补丁:Linux环境识别与opatch运维指南 简介面向Linux x86-64平台的Oracle 11.2.0.4补丁包适合数据库管理员、运维工程师及需要维护Oracle系统的技术人员使用用于修复安全漏洞、性能缺陷与其他已知问题保障企业级数据库环境的稳定与安全。压缩包共103个文件整体大小约40.49MB内部以class字节码、SQL脚本、XML配置、JAR包为主同时包含系统库文件、证书文件与安全策略文件等覆盖补丁预检、离线部署与问题排查所需的核心内容。已有264人学习/下载可作为Oracle补丁应用与故障处理的参考。资源附有补丁元数据与核心二进制文件便于配合OPatch工具识别环境匹配情况SQL与XML内容可辅助了解补丁改动细节class与JAR文件则可用于版本校验和回归验证适合Oracle DBA在维护窗口内高效完成升级操作。1. 读懂 p26635834_112040_Linux-x86-64.zip补丁号、版本与平台一次看清当下载目录里出现 p26635834_112040_Linux-x86-64.zip 这个文件名它既不是操作系统镜像也不是数据库安装介质而是 Oracle 数据库补丁包。p 后面的 26635834 是补丁唯一编号112040 压缩自数据库版本号 11.2.0.4.0Linux-x86-64 指定了目标平台是 Linux 上的 x86-64 架构。如果你负责维护一台 Linux 系统上的 Oracle 11.2.0.4 数据库这个文件名决定了一次标准补丁操作的起点。整个流程可以概括为确认匹配、解压、apply、验证、必要时回滚。难点从来不在命令本身而在环境匹配和前后依赖这篇笔记把每一步的判定依据和常见翻车点按顺序写清楚供 DBA 和专职运维直接参照。2. 拆解补丁包命名版本、平台与补丁号怎么对号入座2.1 p编号基准版本平台三段字段代表什么遇到任何 Oracle 补丁包不要急着解压先按表格里的三要素把身份信息读出来字段示例值含义补丁前缀ppatch 的缩写表示这是一个补丁包补丁编号26635834My Oracle Support 上唯一对应的补丁标识基准版本112040Oracle 版本号去掉小数点的压缩写法即 11.2.0.4.0平台Linux-x86-64目标操作系统与 CPU 架构扩展名.zip打包格式内部包含补丁文件、README、etc 目录112040 这五个数字最容易看错。Oracle 把带点的版本号按顺序去掉小数点保留前五位因此 11.2.0.4.0 变成 112040。用同样的规则11.2.0.3.0 在补丁包里会写作 11203011.2.0.1.0 写作 112010。有些新手会在 11.2.0.4 与 11.2.0.3 之间纠结其实只看第三位数字就能分辨040 和 030 只差一位但两者对应的补丁包完全不能互换。平台字段没有太多花样Linux-x86-64 指的就是运行在 x86-64 架构上的 Linux 系统覆盖大多数 RHEL、Oracle Linux、CentOS 以及部分 Debian/Ubuntu 服务器。需要注意Oracle 数据库的正式支持列表对不同发行版有差异但补丁的平台字段只用架构区分不会细分到某个 libc 版本。真正要被替换的二进制在解压之后的 lib 目录、bin 目录里能看到端倪。补丁包内的目录结构通常包含补丁号子目录、etc/config 目录、README.html 和一份文件清单。opatch apply 时读取的不是 zip 根目录而是与补丁号同名的子目录。拿到手之后如果发现里面没有这个子目录大概率是下载文件不完整或者解压过程出错。我一般会把解压目标放在数据库软件所在文件系统下并把文件属主设为 oracle:oinstall与数据库软件安装权限保持一致可以省掉后面莫名奇妙的权限报错。2.2 先确认环境匹配11.2.0.4 与 Linux x86-64 的识别方法补丁包放在服务器上到执行 apply中间夹着一个容易被跳过的环节环境匹配确认。我一般用三条 linux 常用命令解决这个确认不需要任何图形界面# 确认机器架构是否为 x86_64 uname -m # 确认发行版信息补丁 README 偶尔会引用内核或发行版版本 cat /etc/os-release # 确认当前 oracle 用户生效的 ORACLE_HOME echo $ORACLE_HOMEuname -m 输出 x86_64 时平台匹配成立输出 aarch64 或其他架构时这个补丁包不能应用需要去找对应的 ARM 或 SPARC 版本。cat /etc/os-release 输出的发行版信息用于确认是否在支持范围内它不是决定性条件但值得记录到补丁操作日志里。echo $ORACLE_HOME 是最关键的一步如果输出为空说明你还没有切到 oracle 用户或没有正确加载环境变量直接往下执行 opatch 会找不到 ORACLE_HOME。确认了路径之后还需要核对数据库软件版本# 用 sqlplus 查看数据库软件版本期望输出 11.2.0.4.0 sqlplus -v-- 以 sysdba 登录查询 v$version 确认版本的完整信息 SQL SELECT banner FROM v$version WHERE ROWNUM 2;版本号和补丁包的基准版本必须完全一致。11.2.0.4 环境可以打 11.2.0.4 的补丁11.2.0.3 环境不行不要尝试跨版本使用Oracle 的补丁包只在相同基准版本上有效。RAC 环境的每个节点都要做同样的匹配检查不能只确认一个节点就开始操作。提示一台服务器上常有多个 ORACLE_HOME务必在补丁操作前一次性确认当前 shell 属于哪个数据库主目录避免把补丁装进错误的环境。2.3 区分 PSU 与一次性补丁部署前先弄清依赖关系文件名不会直接告诉你这是补丁集更新PSU还是单 Bug 修复补丁但两者的部署策略差异很大。PSU 是 Oracle 按季度发布的累积补丁包含安全修复和大量已知问题修复特点是依赖链较深通常要求先安装比它更早的 PSU 或基础补丁才能正常 apply。一次性补丁则针对单个 Bug往往可以直接打在任意合法版本上但需要检查它与已安装补丁是否冲突尤其是那些在同一个文件上改动的修复。拿到补丁后的第一个动作不是 apply而是把当前环境已装补丁列出来再与补丁包内的 README.html 对照依赖关系# 列出当前 ORACLE_HOME 上已安装的所有补丁 $ORACLE_HOME/OPatch/opatch lsinventory输出结果按补丁编号排列与 README 中 Prerequisites 章节列出的前提补丁做比对。如果 README 要求某个前置补丁已存在而 lsinventory 里没有对应编号apply 会在前置检查阶段被拦截。另一种情况是 README 声明与已有补丁冲突此时需要先卸载冲突补丁或向 MOS 申请合并补丁不能硬打。我建议把 README.html 中关于补丁描述、前置条件、应用方式和回滚说明的段落复制出来保存到补丁目录里作为一个独立文本。这个文件在几个月后排查问题时就是第一手依据比翻下载历史可靠得多。3. 在 Linux x86-64 上打补丁从解压到 opatch apply 的完整操作3.1 解压与前置检查OPatch 版本、ORACLE_HOME 目录与空间补丁操作的第一步是解压但解压位置决定了你会不会踩进第一个坑。很多人图省事把补丁包直接解压到 /tmp而 /tmp 往往是独立小分区补丁解压后动辄数百 MB可能在 apply 过程中把文件系统写满连带影响数据库临时文件。正确做法是选择与 ORACLE_HOME 相邻的文件系统建立专用目录目录名带上补丁号方便以后回溯# 建补丁目录选择与 ORACLE_HOME 同文件系统的路径 mkdir -p /u01/app/oracle/patch/26635834 # 切换到该目录再解压-q 参数只显示解压错误 cd /u01/app/oracle/patch/26635834 unzip -q p26635834_112040_Linux-x86-64.zip # 解压完成后查看目录结构重点检查补丁号子目录是否出现 ls -la解压完成后不要只看一眼文件数量要确认补丁号子目录存在且 etc/config 目录有读权限。如果解压后的文件属主是 root 而不是 oracleopatch apply 会因为没有写权限而失败此时用 chown 修正# 将整个补丁目录归位到 oracle 用户和 oinstall 组 chown -R oracle:oinstall /u01/app/oracle/patch/26635834接下来还要确认 OPatch 工具自身版本。补丁 README 会写明最低 OPatch 版本要求这个是前置检查中的硬门槛# 查看 OPatch 版本与补丁 README 要求的最低版本比较 $ORACLE_HOME/OPatch/opatch version如果输出显示版本过低先升级 OPatch。升级方法是从 MOS 下载对应工具包解压后覆盖 $ORACLE_HOME/OPatch覆盖前把原目录改名备份。这一步经常被忽略尤其是一些老 11.2.0.4 环境里 OPatch 还是 11.2 时代的旧版本直接 apply 会遇到各种无法解析的报错而报错信息跟真正的补丁问题混在一起排查起来非常头痛。3.2 opatch apply 的实际命令与参数环境检查通过后进入补丁子目录执行 apply。以单实例最常见的场景为例# 先确保环境变量正确指向目标数据库主目录 export ORACLE_HOME/u01/app/oracle/product/11.2.0/dbhome_1 export PATH$ORACLE_HOME/OPatch:$ORACLE_HOME/bin:$PATH # 进入补丁子目录解压后生成的与补丁号同名的目录 cd /u01/app/oracle/patch/26635834/26635834 # 执行 opatch apply-oh 显式指定 ORACLE_HOME不依赖环境变量 $ORACLE_HOME/OPatch/opatch apply -oh $ORACLE_HOME-oh 是 opatch 的通用参数用于显式指定应用补丁的目标主目录。当服务器上同时存在多个 ORACLE_HOME 时环境变量可能指向旧实例或另一个版本-oh 参数能确保 opatch 操作的对象与你的预期一致。opatch 在 apply 过程中会先运行前置检查和冲突检测输出中列出检查项与结果正常应用的耗时从几分钟到几十分钟不等取决于补丁大小和服务器 IO 性能。如果中途中断不要急着重新 apply。先执行opatch lsinventory查看补丁是否部分写入。某些 PSU 包含多个修复条目中断后 lsinventory 会显示部分子补丁已注册此时直接重跑 apply 会误报冲突需要按 README 的故障恢复章节处理。RAC 环境的操作方式不一样README 的 RAC 章节会明确说明是整体停机还是滚动方式。滚动方式的常见命令形式如下# 滚动补丁-rolling 1 表示当前节点是第一个应用节点 $ORACLE_HOME/OPatch/opatch apply -rolling 1 -oh $ORACLE_HOME-rolling 参数的准确含义以当前补丁 README 为准不能跨补丁套用。有些 PSU 要求所有节点停止集群资源后统一操作此时没有 -rolling 参数有些支持在线滚动还有一些要求按固定节点顺序操作。这些细节不读文档直接猜是 RAC 补丁翻车的主要原因。注意滚动模式下各节点执行顺序要严格按 README 标注的序号不要自己调整节点顺序。顺序错乱会导致补丁依赖路径不一致回滚时非常难处理。3.3 补丁应用后的数据库对象失效处理补丁的二进制替换完成后重启数据库几乎是必经步骤尤其在包含 SQL 修复的补丁场景中。补丁更新了内部包和视图后数据库中会出现一批状态为 INVALID 的对象处理办法是执行 Oracle 自带的 utlrp.sql 重编译脚本-- 以 sysdba 连接执行重启并重编译失效对象 SQL SHUTDOWN IMMEDIATE; SQL STARTUP; SQL ?/rdbms/admin/utlrp.sql这里的 ? 是 sqlplus 中的通配符会被替换为当前 ORACLE_HOME。utlrp.sql 会逐个重编译失效的 PL/SQL 包与对象执行过程中输出每个对象的编译结果。脚本可能运行数分钟结束后用视图检查剩余失效对象数量-- 统计当前失效对象正常结果应接近 0 SELECT COUNT(*) FROM dba_objects WHERE status INVALID;执行 utlrp.sql 的时机需要讲究。单实例环境在 startup 完成后立即执行RAC 环境通常要求所有节点补丁都完成后逐个实例启动并运行脚本。不要把这个动作拖到业务高峰期因为重编译过程会占用一定系统资源做变更窗口时就应预留这段时间。我的经验是大部分业务系统打上补丁后失效对象数量会从几百降到几十剩下的多为数据库内置包这类对象在首次调用时会自动重新编译不需要反复处置。真正需要警惕的是某个应用 schema 下出现大量失效表或索引这种情况多半不是重编译能解决的而是补丁与应用兼容性出了问题需要回到 MOS 查看补丁的已知问题列表。4. 补丁应用避坑5 个常见翻车场景与排查方法4.1 opatch apply 报 Prerequisite check failed明明条件已满足现象opatch apply 刚开始就报前置检查失败提示缺少某个前置补丁但自己从 lsinventory 查到的列表里明明有该补丁。原因多数情况不是补丁真缺而是当前 shell 的 ORACLE_HOME 环境变量指向了别的数据库主目录opatch 检查的是另一套环境此外用非 oracle 用户执行 opatch环境变量不完整同样会误报。解决先执行echo $ORACLE_HOME和which opatch确认当前会话语境再su - oracle切换用户后重试。对比 lsinventory 和 apply 时保持两次命令使用相同的 -oh 参数确保两个动作针对的是同一个数据库主目录。4.2 RAC 补丁滚动方式选择错误导致节点补丁不一致现象两节点 RAC 各自打补丁后一个节点 lsinventory 显示已装另一个节点未装集群资源启动异常或实例无法拉起。原因不同补丁包对 RAC 的操作顺序要求不同README 中明确区分的整体停机与滚动两种模式很容易被混淆。整体停机要求在两个节点全部应用完毕后再启动集群滚动则按顺序逐节点操作。不按文档执行就会产生一个节点已打、另一个未打的不一致状态。解决先打开 README 里的 RAC 章节记录要求的是 all-node 还是 rolling。整体停机模式就两节点全部应用完再拉起集群滚动模式按文档指定的节点顺序逐台执行。打完补丁后在每个节点分别运行opatch lsinventory把输出做 diff任何一处补丁列表差异都说明操作没有完成。4.3 打补丁后应用端报 ORA-04068 / ORA-04063SQL 无法执行现象补丁应用后的次日应用端大量报 existing state of packages has been discarded 或 package body is in an invalid state业务查询中断。原因补丁实际改变了数据库内对象的实现方式但数据库没有重启数据字典里的对象状态仍处于失效状态已建立的会话中缓存的旧包状态无法刷新应用端自然抛出异常。解决按 3.3 的步骤执行 shutdown immediate、startup再运行 utlrp.sql 完成重编译。随后的验证需要新开一个会话执行关键 SQL因为已打开的旧会话还在使用缓存状态容易误判修复没有生效。更稳妥的做法是把补丁安排在变更窗口内打完后立即重启并完成应用回归测试。4.4 解压到 /tmp 导致磁盘空间不足补丁解压中断现象unzip 解压到一半提示 No space left on device补丁包内容残缺apply 时找不到文件。原因/tmp 在 Linux 上往往是独立的小分区Oracle 11.2.0.4 补丁包解压后数百 MB 甚至更大加上 ORACLE_HOME 备份很容易超过 /tmp 剩余空间。解决补丁操作前用df -h查看文件系统使用情况确认目标目录可用空间至少为压缩包的 2 到 3 倍然后在与 ORACLE_HOME 同一文件系统的路径下建补丁目录。解压后立即用du -sh /u01/app/oracle/patch/26635834核对实际占用做到心里有数。空间这件事没有玄学提前看一眼就能避免。4.5 解压报 CRC 错误或补丁目录缺少关键文件现象unzip 解压时报 CRC 校验错误或者解压结束没有报错但进入补丁子目录后执行 apply 提示找不到某些文件。原因补丁包在下载过程中损坏比如文件传输被中断或使用非二进制安全的方式复制也有可能是存储设备故障导致文件本身不完整。解决补丁包下载完成后先做校验# 计算补丁包 MD5 值与 MOS 页面给出的官方校验值对照 md5sum p26635834_112040_Linux-x86-64.zip不一致就重新下载。传输时使用 scp 或 sftp 等二进制安全通道不要用文本模式或在线解压预览工具。这个动作每次都要做成本极低一旦漏掉后续的 apply 报错会非常难定位。5. 验证补丁生效与回滚给数据库留好后悔药5.1 用 opatch lsinventory 验证补丁状态补丁 apply 成功之后验证至少做两层。第一层确认补丁编号进入了已安装列表第二层确认补丁对应的修复 Bug 出现在已修复列表中# 第一层验证补丁编号出现在已安装清单 $ORACLE_HOME/OPatch/opatch lsinventory | grep -i 26635834 # 第二层验证检查修复的 bug 列表输出会同时显示补丁编号与 bug 编号 $ORACLE_HOME/OPatch/opatch lsinventory -bugs_fixed | grep 26635834第二层验证很关键。一个 PSU 可能包含几十个 Bug 修复条目只确认补丁编号存在不能证明所有修复内容都已写入软件。grep 输出同时包含补丁编号和若干 Bug 编号时说明修复内容已进入当前环境。如果只看到补丁编号而没有 Bug 条目考虑是不是 OPatch 版本过老或补丁描述符不完整这种情况需要检查补丁目录是否被移动过。补丁列表验证通过后还要从操作系统层面确认数据库进程与监听状态# 确认实例进程存在 ps -ef | grep pmon | grep -v grep # 确认监听器状态正常 lsnrctl status补丁验证不只限于补丁清单数据库实例和监听同样要纳入验证范围。如果实例没有起来lsinventory 输出再正常数据库也是不可用状态。RAC 环境记得在每个节点上分别执行上述验证两个节点输出一致才算最终完成。5.2 从 opatch rollback 到目录备份恢复的时机选择回滚补丁的时机比命令本身更需要经验。opatch rollback 只适合在满足两个前提时使用没有后续补丁依赖它ORACLE_HOME 未被后续活动覆盖。一旦不满足rollback 会失败或留下不完整状态。因此回滚路线应分为三级opatch rollback、ORACLE_HOME 目录备份恢复、数据库备份还原。如果走 opatch rollback# 回滚指定补丁先切到 ORACLE_HOME 目录再执行 cd $ORACLE_HOME $ORACLE_HOME/OPatch/opatch rollback -id 26635834 -oh $ORACLE_HOMErollback 成功后同样用 lsinventory 确认补丁已消失。如果 rollback 失败依靠打补丁前制作的 ORACLE_HOME 备份恢复。备份要在 apply 前完成包含 lib、bin、rdbms 等关键目录# 打补丁前备份 ORACLE_HOME 的关键二进制目录速度远快于全量备份 tar -czf /u01/app/oracle/backup/oracle_home_before_26635834.tar.gz \ -C $ORACLE_HOME lib bin rdbms恢复时以 oracle 用户执行 tar 解压回原目录再用opatch lsinventory确认结构完整# 恢复备份到 ORACLE_HOME注意保持文件属主 tar -xzf /u01/app/oracle/backup/oracle_home_before_26635834.tar.gz -C $ORACLE_HOME第三级是数据库备份还原通常用于补丁导致数据字典损坏或数据问题的场景代价最大但只要保留 RMAN 全备和归档日志仍然能回到打补丁前的时间点。前两级能解决的问题不要轻易走到第三级因为数据库还原会影响所有业务而不仅仅是补丁本身。6. 把补丁管理变成例行公事三个能救命的细节习惯补丁操作不是一次性的冒险它应该成为数据库生命周期里最可预期的那类工作。我自己的经验里真正让补丁变得可控的是三个看起来不起眼的习惯。第一所有补丁存放路径统一带日期和补丁号。比如 /u01/app/oracle/patch/20240115/26635834解压前就想好这个路径补丁打完后把完整输出重定向到同目录的日志文件命名与补丁号对应。半年后需要回答“这台机器上次补丁什么时候打的、打了什么”时翻目录就解决了不需要再回溯命令历史或翻 MOS 记录。第二每个季度导出一份 lsinventory 快照RAC 环境再做节点间 diff。两台节点的补丁列表差异往往是集群故障的隐藏诱因。执行opatch lsinventory inv_$(hostname).txt把结果落到统一目录用 diff 命令比较两个文件任何补丁编号上的出入立刻显示出来。这个习惯执行成本很低但能在集群状态异常之前提前发现隐患。第三在虚拟机或测试环境完整演练一遍补丁流程再上生产。这一步足以过滤掉至少一半以上的依赖和路径问题。我自己经历过在生产上因前置补丁缺失导致的 apply 中断后来同样场景在测试环境预先跑过几分钟内就发现了问题源头生产再也没有出现过类似翻车。演练时连环境变量、目录权限、回滚路线一起验证不是只跑一遍 opatch apply 就算数。补丁应用本身不复杂复杂的是上下文环境变量、依赖关系、RAC 顺序、备份策略、验证习惯。把这些变成例行公事让打补丁不再靠临场发挥。希望帮到你让每一个补丁都能安安稳稳落在该落的位置。本文还有配套的精品资源点击获取
返回列表