ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Oracle数据库补丁包p6880880_190000_Linux-x86-64.zip解析与OPatch打补丁实战

Oracle数据库补丁包p6880880_190000_Linux-x86-64.zip解析与OPatch打补丁实战 简介p6880880_190000_Linux-x86-64.zip 是 Oracle 官方面向 19c 数据库发布的补丁包专为 64 位 Linux 环境设计适合数据库管理员与运维工程师用于修复已知缺陷、提升实例稳定性与安全性。压缩包共 496 个文件约 115.39MB以 jar、so、properties、pl、sh、xml 等为主涵盖 OPatch 补丁工具、Java 运行组件、平台适配配置与脚本其中 opatch、datapatch、opatchauto 等文件构成补丁安装与校验的核心链路png、ttf、gif 等则服务于工具界面与文档展示。已有 2010 人学习下载说明该补丁在 19c 运维场景中具有较高参考价值。借助包内 OPatch 工具读者可完成补丁应用、组件清单核对与安装结果验证并据此梳理补丁管理流程与排错思路为数据库版本维护和故障排查提供可复用的操作依据。1. 从一个奇怪的压缩包名说起p6880880_190000_Linux-x86-64.zip 到底是什么如果你在服务器运维或数据库交付现场待过大概率见过这种命名风格的压缩包一串看似无规律的编号加上平台标识最后是.zip。p6880880_190000_Linux-x86-64.zip就是典型代表——p6880880是补丁编号190000通常对应某个大版本基线Linux-x86-64明确了操作系统和 CPU 架构。它不是一个普通软件安装包而是 Oracle 数据库体系里用于打补丁的补丁包Patch Set Update / Release Update 的交付载体。很多一线工程师第一次拿到它时会下意识当成普通压缩包解压了事结果发现里面全是.zip嵌套和README.html完全不知道下一步该干什么。这篇笔记就围绕这个包把「它是什么、怎么验、怎么打、坑在哪」一条线讲透适合正在做数据库补丁升级、又不想在测试环境反复翻车的从业者。2. 拆开补丁包之前先搞清楚 p6880880 与 190000 的对应关系2.1 补丁编号与版本基线的映射逻辑p6880880这个编号本身不携带版本信息它只是 Oracle 补丁分发系统里的一个唯一标识。真正决定你能不能直接用的是190000这个基线号。在 Oracle 19c 的补丁体系中190000通常指向 19.0.0 的基础版本而后续的 Release UpdateRU会以p编号_基线_平台.zip的形式重新打包。也就是说同一个p6880880编号如果基线号不同对应的实际补丁内容可能完全不一样。我一般会先做一件事把包名里的编号和基线号抄下来去 MOSMy Oracle Support里搜一下这个补丁号确认它到底是 RU、PSU 还是 One-off Patch。这一步不做后面所有操作都是盲打。常见做法是在 MOS 的 Patch Search 里输入6880880看返回结果里的「Product」和「Release」列。如果 Release 显示 19.0.0.0.0那它就是 19c 的基础补丁集如果显示 19.x那就要注意它可能是一个叠加补丁需要先装前置补丁。很多翻车现场就发生在这里有人直接把包丢到 19c 环境里打结果 OPatch 报「patch conflicts with installed patch」就是因为没确认前置依赖。2.2 为什么是 Linux-x86-64 而不是其他平台Linux-x86-64这个后缀不是装饰。Oracle 的补丁包按平台分发Linux x86-64 和 Linux ARM64、Solaris SPARC、AIX 的补丁内容完全不同。如果你在 ARM 机器上解压这个包里面的二进制文件根本跑不起来。更隐蔽的坑是有些工程师在 x86 机器上解压后把整个目录拷贝到 ARM 环境以为只是文件传输结果 OPatch 直接报「incompatible platform」。所以第一步永远是确认目标服务器的uname -m输出是x86_64而不是aarch64。# 确认平台架构必须输出 x86_64 uname -m # 确认操作系统发行版Oracle Linux / RHEL / CentOS 都在支持列表 cat /etc/os-release | head -n 3 # 确认当前数据库版本必须与补丁基线匹配 $ORACLE_HOME/OPatch/opatch lspatches这三条命令的输出要一起看。uname -m决定包能不能用os-release决定有没有官方支持opatch lspatches决定当前环境已经打了哪些补丁、有没有冲突。我习惯把这三条命令的输出贴到一个临时文件里后面排查问题时直接对照省得来回翻终端。2.3 解压前必须检查的磁盘与权限这个包解压后通常有几个 GB如果/tmp或$ORACLE_HOME所在分区空间不足解压到一半会失败而且失败后残留的临时文件会占用空间导致第二次解压也失败。我一般会先看df -h里$ORACLE_HOME和/tmp的可用空间确保至少有包体积三倍的余量。权限方面解压和打补丁的操作系统用户必须是 Oracle 软件安装用户通常是oracle不能用 root 直接解压后再 chown因为 OPatch 对文件属主和权限位很敏感。# 查看 ORACLE_HOME 和 /tmp 的可用空间单位 GB df -h $ORACLE_HOME /tmp # 确认当前用户是 oracle且属于 oinstall 组 id # 创建独立的补丁工作目录避免污染 ORACLE_HOME mkdir -p /u01/patch_work/p6880880 cd /u01/patch_work/p6880880把补丁包放在独立目录里解压而不是直接丢进$ORACLE_HOME是我多年来的习惯。这样即使解压出问题也不会影响正在运行的数据库。解压命令用unzip即可但要注意-q参数会隐藏错误信息第一次解压时我建议不加-q让所有输出都打到终端方便看有没有「inflating」失败的行。3. 用 OPatch 把补丁打进去从 lspatches 到 apply 的完整命令链3.1 OPatch 版本与补丁包的兼容性检查在打任何补丁之前必须确认$ORACLE_HOME/OPatch/opatch version输出的版本号满足补丁 README 里的最低要求。p6880880_190000这类包通常要求 OPatch 版本不低于 12.2.0.1.19 或更高。如果 OPatch 太旧opatch apply会在预检查阶段直接报「OPatch version not compatible」这时候需要先升级 OPatch。升级 OPatch 本身也是一个补丁包但那个包的名字通常是p6880880_版本_Linux-x86-64.zip之外的另一个编号不要搞混。# 查看当前 OPatch 版本 $ORACLE_HOME/OPatch/opatch version # 查看补丁包解压后的 README找「OPatch Version」要求 ls /u01/patch_work/p6880880/ # 通常会有 README.html 和 patch目录用 grep 快速定位版本要求 grep -i opatch version /u01/patch_work/p6880880/README.html | head -n 5如果 README 是 HTML 格式grep出来的行会带标签但关键数字能看清。我一般会把这个数字和opatch version的输出并排放在屏幕上确认前者小于等于后者才继续。这一步花不了一分钟但能避免后面半小时的无效等待。3.2 冲突检测opatch prereq 与 lspatches 的交叉验证opatch prereq CheckConflictAgainstOHWithDetail是打补丁前最关键的预检查命令。它会扫描$ORACLE_HOME里已安装的补丁和当前补丁包里的文件清单做比对输出哪些文件会被覆盖、哪些补丁会冲突。我见过太多人跳过这一步直接opatch apply结果打到一半报「file already patched」回滚又回不干净最后只能从备份恢复。# 进入补丁包解压后的子目录通常数字编号就是补丁号 cd /u01/patch_work/p6880880/6880880 # 执行冲突预检查输出会列出冲突补丁和文件 $ORACLE_HOME/OPatch/opatch prereq CheckConflictAgainstOHWithDetail -ph ./ # 同时查看当前环境已打补丁列表和预检查输出对照 $ORACLE_HOME/OPatch/opatch lspatches预检查输出里如果有「Patch conflict」字样就要去 MOS 查这两个补丁的合并方案。常见做法是先打前置补丁再打当前补丁或者直接下载包含两者合并后的新补丁包。不要试图用-force参数强行跳过冲突检查那个参数是给 Oracle 支持人员在特定场景下用的普通升级场景下强行跳过轻则补丁不生效重则数据库启动报ORA-00600。3.3 执行 apply参数、日志与回滚点真正执行opatch apply时我一般会加-verbose把详细日志打到终端同时用tee保存一份到文件。这样即使终端滚屏太快也能事后翻日志。命令要在补丁包解压后的数字目录里执行-ph参数指向当前目录。如果是 RAC 环境还需要加-local或按节点逐个打具体看 README 里的说明。# 在补丁目录内执行 apply保存完整日志 cd /u01/patch_work/p6880880/6880880 $ORACLE_HOME/OPatch/opatch apply -verbose 21 | tee /u01/patch_work/apply_6880880.log # 打完补丁后确认 lspatches 里出现新补丁号 $ORACLE_HOME/OPatch/opatch lspatches | grep 6880880 # 检查数据库组件版本确认补丁生效 sqlplus -S / as sysdba EOF set pagesize 100 col comp_name format a40 col version format a15 col status format a10 select comp_name, version, status from dba_registry order by comp_name; EOFapply过程中如果遇到「Inventory」相关报错通常是oraInst.loc文件路径不对或权限不足。这个文件一般在/etc/oraInst.loc或$ORACLE_HOME/oraInst.loc内容指向 Central Inventory 目录。确保oracle用户对该目录有读写权限。打完补丁后dba_registry里的组件版本应该和补丁 README 里声明的版本一致如果某个组件还是旧版本说明补丁没有完全应用需要看日志里对应组件的处理行。4. 补丁打完不算完那些让升级翻车的典型场景4.1 现象opatch apply 报「Cannot create file」或「Permission denied」原因通常有两个一是$ORACLE_HOME下某些目录的属主不是oracle可能是之前有人用 root 操作过二是文件系统只读挂载或者空间满了导致无法写入。解决方法是先用ls -l检查报错路径的属主和权限如果是 root 属主用chown -R oracle:oinstall修正如果是空间问题清理/tmp和$ORACLE_HOME/.patch_storage下的旧补丁备份。注意.patch_storage目录不要手动删要用opatch rollback或官方清理脚本。4.2 现象补丁打完后数据库启动报 ORA-00600 或 ORA-07445这种情况多半是补丁和当前数据库的某个 One-off Patch 冲突或者补丁包本身不完整下载过程中损坏。先看alert log里 ORA-00600 的第一个参数去 MOS 搜对应 note。如果确认是补丁冲突需要用opatch rollback -id 补丁号回滚到打补丁前的状态然后重新做冲突检测。回滚前务必确认有完整的$ORACLE_HOME备份因为回滚本身也可能失败。4.3 现象RAC 环境下只打了一个节点另一个节点启动异常RAC 打补丁必须按节点滚动进行而且每个节点打完补丁后要确认lspatches输出一致。如果只打了一个节点就重启集群另一个节点上的数据库实例可能因为版本不一致而无法加入集群。解决方法是停止所有节点实例在未打补丁的节点上补打然后按顺序重启。我一般会在打补丁前把crsctl stat res -t的输出保存下来打完后再对比一次确认所有资源状态正常。4.4 现象补丁 README 里要求执行 datapatch但忘了跑很多 RU 补丁在opatch apply之后还需要执行datapatch来更新数据库内部的 SQL 脚本。如果跳过这一步dba_registry里的版本可能显示已更新但实际功能没生效某些新特性一用就报错。datapatch需要在数据库启动到 OPEN 状态后执行命令是$ORACLE_HOME/OPatch/datapatch -verbose。执行前确认$ORACLE_HOME/sqlpatch目录存在且可写。4.5 现象补丁包解压后目录结构和预期不符有时候下载的包解压出来只有一层目录里面直接是etc、files、usr等没有数字编号目录。这通常是因为下载的是「组合补丁」或「补丁集」需要先解压到一个临时目录再进入子目录找真正的补丁目录。我一般会用find . -name README.html定位所有 README然后看哪个目录里有etc/config/inventory.xml那个目录就是 OPatch 要操作的目录。5. 验证补丁生效与后续维护一条 SQL 和三个习惯补丁打完、datapatch跑完最后一步是验证。最直接的方法是用 SQL 查dba_registry_sqlpatch视图看action和status列。action为APPLY、status为SUCCESS的行就是成功应用的补丁记录。如果status是FAILED要去$ORACLE_HOME/cfgtoollogs/sqlpatch下找对应的日志文件里面会写清楚哪条 SQL 执行失败。-- 查看 SQL 补丁应用记录确认状态为 SUCCESS set linesize 200 col patch_id format 9999999999 col action format a10 col status format a10 col action_time format a20 select patch_id, action, status, action_time from dba_registry_sqlpatch order by action_time desc;除了这条 SQL我还有三个习惯。第一每次打完补丁把opatch lspatches和dba_registry_sqlpatch的输出各存一份到补丁工作目录文件名带上日期和补丁号以后排查问题时直接翻文件不用连数据库。第二补丁打完后的第一次全库备份一定要做而且要用validate确认备份可恢复因为补丁可能改变了某些数据文件的结构旧备份不一定能直接用于恢复。第三如果这个环境有 Data Guard补丁打完主库后备库也要按同样流程打并且确认dba_registry_sqlpatch在主备库上一致否则 Switchover 时可能出问题。希望帮到你。本文还有配套的精品资源点击获取
返回列表