资讯详情

资讯详情

Oracle 11.2.0.3补丁包应用全解析:从环境检查到避坑指南

简介该压缩包面向 Oracle 数据库管理员、运维工程师以及需要开展 11g 安全加固的 DBA是针对 Oracle 11.2.0.3 的数据库补丁集更新PSU版本号为 11.2.0.3.15同时包含 2015 年 7 月的关键补丁更新CPUJUL2015。PSU 与 CPU 主要修复已知安全漏洞、性能回退和稳定性问题适用于 Linux x86-64 平台的生产环境可帮助企业在审计前补齐累积修复项降低被攻击与异常宕机风险。压缩包整体约 100.73MB包内以补丁程序及配套的检索/说明文件为主管理员可据此确认适用性、依赖关系与安装步骤再结合停机窗口完成备份、补丁应用与结果验证。目前已有 290 人学习下载适合负责日常维护、希望在升级到更高版本前先通过 PSU 保持当前基线安全的 DBA 团队也适合作为 11.2.0.3 补丁机制的参考样本。1. 这个补丁包名透露了什么p20760997_112030_Linux-x86-64.zip 的结构与适用场景拿到一个名为 p20760997_112030_Linux-x86-64.zip 的压缩包第一反应不是解压而是先拆文件名。这个格式是数据库补丁包里最常见的命名规范p 后面跟补丁编号接着是基础版本号最后是操作系统与架构。也就是说这个包是给 Linux x86-64 平台、数据库版本 11.2.0.3.0 的实例用的补丁编号是 20760997。它一般对应一个季度或者半年的补丁更新PSU、CPU 或某类修复包解决的是数据库范围内的缺陷和安全更新而不是某个功能小版本。做 DBA 或运维的人看到这种包真正关心的是三件事打上去之后会不会导致现有功能回归、能不能安全回滚、以及安装过程会不会因为环境差异中断。这篇笔记就想把这三点讲透。我不会去复述补丁说明里已经写好的长长的修复列表而是从拿到包到验证成功的完整路径包括环境检查、冲突判断、应用命令、日志解读和常见翻车点。适合那些需要给生产库或核心测试库打补丁又不想在半夜遇到意外的人。2. 安装前检查环境、opatch 版本与补丁冲突判断的三个硬指标在真正执行 opatch apply 之前必须做三项检查数据库版本和补丁要求是否匹配、OPatch 工具版本是否够新、以及目标 DB_HOME 里是否已经存在冲突补丁。这三项任何一项出问题都会被 opatch 中途拦下来。与其到那时再处理不如先花十分钟验完。2.1 从文件名算出数据库版本、补丁号和平台文件名 p20760997_112030_Linux-x86-64.zip 实际上是个编码规则。把数字 112030 分段11.2.0.3.0。前两位是主版本中间三位是维护版本最后一位是 release update 编号。而 Linux-x86-64 指操作系统和 CPU 架构。补丁号 20760997 是补丁的唯一标识你在 opatch 命令里会反复用到它。这里有个容易读错的地方112030 不是 11.2.30而是 11.2.0.3.0。数据库安装目录通常会显示 11.2.0.3但完整版本号要看 SQL 命令行工具的版本输出。如果环境是 11.2.0.1 或 11.2.0.4这个补丁往往不适用除非补丁说明里明确写了可以在不同基础版本上应用。我一般会先用以下命令确认实际版本sqlplus -v # 输出类似 SQL*Plus: Release 11.2.0.3.0 Production如果输出是 11.2.0.4.0那先把 11.2.0.4 的对应补丁下载链接找对不要硬试。补丁包里的 readme.htm 也会在标题下直接列出目标版本那个才是权威。文件名只能做初步判断真正决定能不能打的是 readme 和 opatch 的检测结果。补丁类型也要分清楚。PSU 是季度补丁更新包含安全修复和重要 bug 修复CPU 是安全补丁但现在已经并入 PSU 流程还有 BND 一类是某模块的独立补丁。从文件名里的编号看不出来类型需要看 readme 开头一段的说明。同一个补丁号如果包是 PSU那你应用后还需要执行数据字典更新脚本如果只是覆盖二进制的 one-off patch则不需要。这一点直接影响第 4 章的验证步骤所以别漏看。2.2 检查数据库与 OPatch 版本先跑通这四步OPatch 是应用补丁的核心工具它本身也随补丁发布更新。如果 DB_HOME 里的 opatch 版本太老会无法识别新格式的补丁文件直接报 opatch version older than bundle patch requirement。所以补丁安装流程的第一步永远是先更新 opatch。我习惯的检查顺序是# 1. 检查当前 opatch 版本 DB_HOME/u01/app/11.2.0.3/dbhome_1 $DB_HOME/OPatch/opatch version # 2. 检查数据库版本是否在补丁要求范围内 sqlplus -v # 3. 检查 DB_HOME 里已安装的补丁列表 $DB_HOME/OPatch/opatch lsinventory # 4. 查看补丁包内的 README确认 opatch 最低版本 unzip -p p20760997_112030_Linux-x86-64.zip README.txt | grep -i opatch | head -20第一个命令是拿基线第二个是核对版本第三个是看现有补丁第四个是从压缩包里直接提取 readme 文本不用先解压。grep opatch 会让你看到该补丁要求的最低 OPatch 版本例如 11.2.0.3.15。如果当前版本比它低就先去补丁目录下找同名 oPatch 包解压后覆盖 DB_HOME 下的 OPatch 目录。注意覆盖前要备份原 OPatch 目录这是常见的后悔药。更新 opatch 的具体做法和直接解压覆盖还不一样。常见做法是# 备份现有 opatch mv $DB_HOME/OPatch $DB_HOME/OPatch_bak_$(date %Y%m%d) # 解压新 opatch 到 DB_HOME 下 unzip -q p6880880_112000_Linux-x86-64.zip -d $DB_HOME # 赋予正确属主权限 chown -R dbadba $DB_HOME/OPatch参数说明这里的 p6880880 是 opatch 工具包编号不同数据库版本有对应版本。如果你下载的补丁包里有以 p6880880 开头的文件就用它没有则从厂商补丁更新历史里找对应版本。解压后目录名必须是 OPatch因为 opatch 脚本就从这个路径找。备份目录里的旧 opatch 别删万一新版本不兼容还能退回去。lsinventory 里的 inventory 指的是 Central Inventory它记录了这个 DB_HOME 装过哪些补丁。opatch 读的就是它。如果 inventory 损坏后面所有补丁操作都会出问题这点在第 5 章会专门讲。还要注意lsinventory 输出中的补丁列表会显示 Interim 字样这是临时补丁这类补丁和季度补丁之间的冲突概率更高要特别留意。2.3 冲突检查readme 里最容易被跳过的一段补丁冲突不是指文件同名而是指两个补丁改动同一个文件或同一个内部模块。如果目标 DB_HOME 里某个补丁和新的补丁冲突opatch 会在 apply 前提示 Patch xxx conflicts with...。很多新手不看 readme直接 apply结果在 5% 进度时被中断。其实补丁包的 readme 里有一个 Details of conflicts with existing patches 部分列出了已知冲突。但 readme 只列了已知的真正完整的检测要交给 opatch。在 apply 之前可以先用以下命令做预检测$DB_HOME/OPatch/opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir /opt/ora_patch/20760997这个命令只检查不会应用安全。输出中如果有严重错误会返回非零退出码如果只是警告要结合业务去判断。常见的情况是之前已经打了一个更早的季补丁而新补丁包含了它的内容此时 opatch 会建议先卸载旧补丁。遇到这种提示不要跳过老老实实按 readme 的顺序先 rollback 再 apply。预检测的命令参数 -phBaseDir 指向解压后的补丁目录或者你也可以直接用补丁的 zip 路径但某些旧版本 opatch 不支持所以先解压是更稳妥的做法。除了冲突这个 prereq 命令还会检查磁盘空间、临时目录可用性、依赖组件是否完整。它给出的报告里有一项叫 Available prerequisites如果返回 Yes 才真正安全。我会把这个命令的输出存成日志和补丁安装日志放在一起方便出问题后回溯。需要留意的是预检测通过不代表实际安装一定成功。它检测的是当前状态如果你在运行预检测之后又手动删改了 DB_HOME 下的文件实际 apply 时仍可能失败。所以最好把预检测和 apply 放在同一个维护窗口中间不要穿插其他安装操作。3. 解压与准备目录规划、权限设置和开关机前的状态检查补丁包不能直接用 zip 路径传给 opatch。常见做法是先解压到一个固定目录比如 /opt/ora_patch/20760997并且保证解压后的所有文件属主是数据库软件用户权限 755 以上。如果放在根目录或权限不对opatch 可能会在应用过程中因为无法写临时文件而失败。3.1 解压与 md5 校验别把不完整的包带上生产从下载渠道拿到的 zip 包可能因为网络问题损坏。我见过不止一次md5 对不上但解压不报错结果 opatch 在应用一半时读文件失败。所以解压前第一件事是做完整性校验。如果下载页面提供了 checksum用它没有的话用补丁包内自带的校验文件或者中控机的 md5sum 结果对比。# 进入存放目录 cd /opt/ora_patch # 计算压缩包 md5 值 md5sum p20760997_112030_Linux-x86-64.zip # 解压到以补丁号命名的目录 unzip -q p20760997_112030_Linux-x86-64.zip -d 20760997 # 检查解压结果是否符合预期 ls -l 20760997/md5sum 的输出要和补丁说明里给的参考值一致。这里有个小坑不同工具算出来的 md5 可能大小写不同注意统一为小写再比对。解压参数 -d 指定目录-q 是静默模式避免输出一大堆文件名。解压后目录里一般会有 README.txt、patch 子目录或一堆以补丁号命名的子目录。ls 的时候注意看是否有空目录或者零字节文件那通常意味着解压不完整。解压之后建议保留 zip 包不要删。一方面回滚时可能还要重新读包另一方面出了问题可以重新解压对照。我会把 zip 和目录放在同一层并注明日期形成可追溯的补丁记录。还要注意解压目录不能放在数据库软件安装目录内部。有些人图方便把补丁包解压到 $DB_HOME 下面结果 opatch 在检索目标文件时会把补丁目录本身当成潜在文件造成无法预料的链接错误。我一般把补丁目录放在另一个挂载点比如 /opt/ora_patch和 DB_HOME 分隔开。3.2 设置 DB_HOME 与清理 inventory两个常用命令opatch 在运行时依赖两个环境变量DB_HOME 和数据库基础目录。很多现场问题都是因为没设置好环境变量导致 opatch 应用到了一个错误的目标。我建议在补丁目录下显式设置环境变量避免依赖用户 profile。# 假设数据库软件安装在 /u01/app/11.2.0.3/dbhome_1 export DB_HOME/u01/app/11.2.0.3/dbhome_1 export PATH$DB_HOME/OPatch:$PATH # 验证当前环境 which opatch opatch version这段脚本里 DB_HOME 一定不能带末尾斜杠否则后面拼接路径时容易出现双斜杠导致找不到文件。部分补丁脚本会读取数据库基础目录变量如果之前没有设置可以加上export ORACLE_BASE/u01/app但注意这个变量的名字和厂商官方文档一致也可以用。如果之前出现过 inventory 不一致最好使用 opatch 自带的检查命令$DB_HOME/OPatch/opatch lsinventory -detail -oh $DB_HOME输出可以看到这个 home 下的补丁清单以及每个补丁修改的文件列表。如果 inventory 里残留了上一次失败的补丁记录可能无法正常 apply。opatch 有个比较隐蔽的选项是-invPtrLoc可以指定 inventory 指针文件。但不建议在正常运维中使用除非你知道在做什么因为强行指定指针文件会绕开标准注册路径可能造成后续补丁无法识别。还有一件事容易被忽略临时目录的权限。opatch 在应用过程中会在 $DB_HOME/.patch_storage_path 或者 /tmp 下创建临时目录。如果 /tmp 挂了 noexec 选项opatch 执行内部脚本时会直接报 permission denied。我习惯在应用前用mount | grep tmp检查一下如果确实有 noexec就把临时目录改到 /var/tmp 或者在 DB_HOME 下建一个 patch_tmp 目录并通过 TMPDIR 环境变量指过去。3.3 应用前的备份策略备份哪些文件不备份哪些打补丁本质上是在修改 DB_HOME 下的程序和动态链接库。回滚工具 opatch 会回滚文件但它依赖补丁自带的回滚脚本。稳妥起见我一般会手工备份几个关键位置防止 opatch 回滚失败时手动还原。备份的范围包括DB_HOME 下的 bin 目录中的核心可执行文件、数据库网络配置目录、dbs 目录下的参数文件。如果补丁涉及内部 Java 组件那么 相关子目录也要考虑。不需要备份整个 DB_HOME那太费时间而且补丁不会覆盖数据文件和控制文件。mkdir -p /u01/backup/db_home_$(date %Y%m%d) tar cvzf /u01/backup/db_home_$(date %Y%m%d)/bin_core.tgz $DB_HOME/bin tar cvzf /u01/backup/db_home_$(date %Y%m%d)/network_admin.tgz $DB_HOME/network/admin cp $DB_HOME/dbs/*.ora /u01/backup/db_home_$(date %Y%m%d)/dbs_ora/命令把关键的二进制和配置文件打包到一个带日期的目录万一补丁应用失败可以快速用 cp 覆盖回去。备份完后再执行 opatch apply我在 4.1 小节会给出完整命令。另一点数据文件完全不用备份因为补丁不碰数据库数据当然如果是生产库我习惯在补丁前做一次 AWR 快照和实例参数导出用来对比打补丁后行为是否有变化这个只是个习惯不是必需。备份之后最好验证一下 tar 包内容是否完整用tar tvzf查看几个关键文件。有时候 tar 命令报错但你没注意后来才发现备份的是空包。我会在备份下一行命令后马上用ls -lh看包大小如果只有几 KB那大概率没備到东西。4. 实际打补丁用 opatch apply 完成安装的完整命令与输出解读这一章进入正题。opatch apply 的命令本身不复杂复杂的是前置条件和后续验证。我会按一个典型的生产库维护窗口来写从关闭实例到确认补丁入库每一步都能直接复制使用。4.1 最小命令组合从关闭实例到 opatch apply补丁应用期间数据库实例必须是关闭的尤其是涉及数据库服务器端代码的补丁。对于集群环境还要先把相关资源 offline。这里以单实例为例# 1. 进入补丁解压目录 cd /opt/ora_patch/20760997 # 2. 使用 SQL 命令行工具关闭数据库实例并退出 sqlplus / as sysdba SQL shutdown immediate; SQL exit # 3. 确认监听停止防止新连接涌入 lsnrctl stop # 4. 执行补丁应用 $DB_HOME/OPatch/opatch apply -oh $DB_HOME -auto -phBaseDir /opt/ora_patch/20760997 # 5. 查看补丁应用结果确认 OpPatch succeeded echo $?shutdown immediate 是清理连接后关闭如果有长事务会等待但一般可以接受。若用 abort不干净不推荐。lsnrctl stop 不是必须的但可以有效避免客户端在补丁间隙尝试连接。opatch apply 中的 -auto 表示自动模式跳过交互问答适合脚本化。如果没有 -autoopatch 会问是否继续此时只要回答 y但自动化脚本会容易卡住。 -phBaseDir 指向解压后的目录。执行时opatch 会读补丁目录里的 actions 脚本输出一大段日志。应用成功后echo $? 会返回 0如果失败会返回非零并在日志里给出具体原因。这里有个细节apply 命令执行时当前用户必须是数据库软件的属主不能是 root 或其他人。root 执行 opatch 会报 Do not run opatch as root。如果忘记切换用户前几步都白做了。我一般会在命令前加su - dba -c但注意 su 到用户时要重新加载环境变量。4.2 输出日志怎么看COMP 与 WARN 的两种处理补丁应用成功的标准不是 No Error而是日志末尾的 OPatch succeeded 以及补丁状态变为 applied。但日志中间会出现大量 [COMP] 和 [WARN] 标记。很多人看到 WARN 就紧张其实要看内容。# 查看本次补丁应用的完整日志 tail -n 300 $DB_HOME/cfgtoollogs/opatch/opatch$(date %Y-%m-%d_%H-%M-%S).log日志里 [COMP] 表示 components 被修改例如 DBMS_SCHEDULER、OLS这表示补丁更新了这些组件。[WARN] 常见的原因是某些组件在升级前已经有自定义修改opatch 记录了一个警告并不代表失败。比如 WARN 后面跟着 Patch was already applied说明这个组件已经被之前某个临时补丁覆盖这是正常的。还有一种是 Make failing for some product, please recheck 这种属于严重错误。最简单的判断标准看最终退出码和是否有 [FATAL] 标记。只要没有 FATAL退出码为 0补丁已经完成。如果日志里出现 [ERROR] 但没有中断说明有子组件没被应用。这时不要启动数据库先用日志去搜 Error applying, failed, fail 关键词定位到具体异常。常见原因是文件被锁或者权限不对对应第 5 章的避坑内容。日志文件的位置在每次运行后会在屏幕上打印出来。最后几行例OPatch succeeded. Log: /u01/app/11.2.0.3/dbhome_1/cfgtoollogs/opatch/opatch2019-03-08_15-30-22.log看到 OPatch succeeded 才算通过。另外有些补丁包含多个子补丁opatch 会一个个应用每应用一个都会打印一个 summary不要看到第一个 succeeded 就以为整个包完成了。我习惯在脚本里循环检查退出码和后期的补丁统计行。4.3 应用后的验证SQL 脚本与组件版本补丁应用完成后opatch 只是把二进制文件更新了。对于数据库内部组件比如 Java、XML 数据库、Spatial还需要运行一个专门的 SQL 脚本来同步数据字典。某些补丁在 readme 中会有 Post Installation 部分例如运行?/rdbms/admin/catbundle.sql psu apply /tmp/20760997。这一步很多人忘记导致 sqlplus 显示补丁号出现但 registry history 里没有记录。# 启动数据库 sqlplus / as sysdba SQL startup; SQL ?/rdbms/admin/catbundle.sql psu apply /opt/ora_patch/20760997 SQL SELECT PATCH_ID, ACTION, ACTION_TIME, VERSION FROM DBA_REGISTRY_HISTORY ORDER BY ACTION_TIME; SQL exitcatbundle.sql 是各类补丁包都要执行的数据字典更新脚本。参数 psu 表示应用的是 PSU 类型补丁apply 是动作最后是补丁解压后的路径。不同补丁类型参数不同可能是 cpu 或者 bundle。执行前注意备份脚本可能运行数分钟。执行完毕后查询 registry history能看到一条 PID 为 20760997、ACTION 为 APPLY 的记录。如果查询不到那说明 SQL 脚本没有正确执行需要回去查脚本日志。除数据库内部验证还要检查会话和进程状态。我最常用的验证命令是SELECT COMP_ID, VERSION, STATUS FROM DBA_REGISTRY WHERE COMP_ID IN (XDB,OLS,CATALOG);这条语句会列出关键组件的版本号正常情况下它们应该和补丁包内的说明一致。如果某个组件版本没变说明对应动作没生效。再看数据库告警日志启动过程中不应该出现缺失库文件或 ORA 错误。这一步做完整个补丁应用才算真正收口。5. 打补丁必经的避坑清单我遇到过的五个现场问题这里记录五个我踩过或同行踩过的真实问题。每个都按现象、原因、解决展开希望对得上你的现场。5.1 现象opatch apply 直接报 Inventory 无法解析有次在某客户测试环境解压完补丁执行 opatch apply结果进度条还没走完就报 Invalid inventory pointer。检查 DB_HOME 都设置了还是同样错误。原因inventory 指针文件 /etc/oraInst.loc 指向了错误的 central inventory 位置或者 central inventory 里的 home 信息被污染。常见于之前有人移动过数据库软件目录却没有更新 inventory。解决先查看 /etc/oraInst.loc 中 inventory_dir 指向的位置然后检查该目录下的 ContentsXML 是否完整。如果丢失最稳妥的办法是从备份恢复该目录。没有备份的话用 opatch 的 -invPtrLoc 参数显式指定新的指针文件但要先确认新指针文件对应的 inventory 结构。实际上这种问题最好的处理是预防在安装数据库软件时就把 inventory 路径写清楚并在移动目录后立即刷新。如果现场已经坏了我一般会在恢复备份后用opatch lsinventory再验证一次确定它能读到所有历史补丁才继续 apply。5.2 现象空间不足导致解压后 opatch 找不到补丁目录某次在备份服务器上解压补丁解压时一切正常但 opatch apply 时提示 patch location 不存在。检查发现 /opt 分区只有 500MB补丁解压后占满空间opatch 在写临时脚本时把目录清理掉了。原因没有提前预估补丁解压后的大小。这个补丁解压后可能占 800MB 以上加上 opatch 应用时需要临时空间实际需要 2GB 空闲。解决先df -h看下目标分区至少留 2 倍补丁包大小的空间。解压目录不要放在 /tmp因为 /tmp 在系统重启后会清空而且经常挂载为 tmpfs容量只有内存的一半。我一般放在 /opt/ora_patch 或者单独的磁盘同时把数据库目录所在分区空间也留足因为补丁会写回。另外检查空间时不要只看某个分区df -h /opt/ora_patch /u01两边都看避免补丁目录和 DB_HOME 在同一个满的分区上。5.3 现象冲突检测通过但应用时报 OUI-10086预检测 CheckConflictAgainstOHWithDetail 通过但 apply 中途报 OUI-10086提示找不到某些依赖文件。去查看 DB_HOME/rdbms/lib 目录发现少了一个版本文件。原因补丁检测的是系统注册的组件而实际文件缺失是因为之前有人手动覆盖过数据库目录里的库文件导致 inventory 里记录的和磁盘上不一致。opatch 使用 make 链接时依赖的文件不存在就触发这个错误。解决先对 DB_HOME 做一次文件一致性检查用opatch lsinventory -detail对比实际文件。缺失的文件要从同版本备机上复制过来然后再重新执行 apply。这里要提醒这类问题不能靠重新解压补丁包解决因为问题在 DB_HOME不在补丁包。遇到 OUI-10086先不要反复跑 apply停下来用ls $DB_HOME/rdbms/lib找找缺失文件再考虑从备份恢复。如果备机版本不完全一致复制文件后还要重新运行 make否则会连上错误版本的库。5.4 现象补丁应用成功但 sqlplus 版本没变有一次我执行完 opatch apply日志显示成功但 sqlplus -v 输出的版本号还是老的。开始怀疑补丁失效后来发现是 PATH 环境变量没有指向新数据库软件目录sqlplus 调用的是旧版本的二进制。原因操作系统 PATH 里存在多个数据库安装目录或者用户 profile 写死了老路径。sqlplus 通过 PATH 查找可执行文件而不是通过 DB_HOME。解决用which sqlplus查看实际路径确保它来自本次打补丁的 DB_HOME/bin。另外检查 $DB_HOME/bin/sqlplus 的时间戳应该和补丁应用时间一致。然后重新登出登录或者在当前 shell 显式 export PATH 来刷新。这个坑容易被忽略因为补丁应用成功后的日志在告警但前台使用者并不会体验版本变化所以验证时一定要在当前 shell 里同时跑which sqlplus和sqlplus -v。5.5 现象回滚时丢失新安装的补丁需要回滚旧补丁时执行 opatch rollback -id xxx结果报告说该补丁不存在但明明 lsinventory 里有。后来发现 opatch rollback 需要提供补丁 ID 和精确的日期时间而 lsinventory 显示的是安装时的记录时间错过一次就把记录弄丢了。原因回滚命令参数不匹配。opatch rollback 的命令格式是opatch rollback -id patch_id但 patch_id 需要匹配 20760997 这种且必须加上补丁安装的时间戳才能唯一确定。如果同一天装了两个相同 ID 的补丁回滚会要求指定 -phBaseDir。解决在应用补丁时立刻把 opatch log 里的补丁 ID 和安装时间保存下来回滚时用opatch rollback -id 20760997 -phBaseDir /opt/ora_patch/20760997指定目录这样它就会从该目录读取回滚脚本避免凭记忆操作。还可以在 lsinventory 里查看 Installed on 那一列回滚命令带上这个时间点格式类似opatch rollback -id 20760997 -installed_on 2019-03-08 15:30。这个参数在不同版本里叫法不一致最好用 -phBaseDir 最通用。6. 把补丁回滚与一键检查做成习惯一条命令和多看日志的教训回滚不是每个补丁都需要但每个补丁都必须具备回滚方案。我现在的习惯是apply 成功后立刻在补丁目录旁边生成一个 deployment 记录文件里面放着补丁号、应用日期、回滚命令、关键日志路径。这样无论是谁接手都能快速回滚。具体做法是把回滚命令和检查命令写进一个小脚本 patch_audit.sh#!/bin/bash export DB_HOME/u01/app/11.2.0.3/dbhome_1 export PATH$DB_HOME/OPatch:$PATH echo 当前补丁清单 opatch lsinventory -oh $DB_HOME | grep -E 20760997|Interim | head -20 echo 补丁应用时间 opatch lsinventory -oh $DB_HOME | grep 20760997 echo 回滚命令示例 echo opatch rollback -id 20760997 -phBaseDir /opt/ora_patch/20760997脚本很简单但它把三个最关键的信息浓缩成一行输出。我每次打补丁后都会跑一遍确认清单里确实有 20760997证明补丁已经在库再确认时间对上方便回滚时精确找到记录。这样下一次再看到 p20760997_112030_Linux-x86-64.zip 这种包就不会心里没底。排查问题的方法也靠日志。opatch 日志通常几百行但别急着从头看。先 grep ERROR|WARN|FATAL再结合补丁 readme 的已知问题绝大多数坑都能在十分钟内定位。如果日志里没有任何关键字那多半是环境问题比如磁盘满、权限、inventory 损坏。我的最后一个教训是打补丁前一定要拍快照或做备份而且短期保留回滚脚本。有一次我为了验证一个测试库的修复跳过了备份结果补丁应用后一个新 bug 导致数据库起不来花了三个小时手工改回。后来无论如何都会花五分钟备份。这些看起来琐碎但到了生产环境就是能救命的习惯。希望帮到你。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →