简介面向仍维护 Oracle 11.2.0.3 数据库的 DBA 与运维人员这份 Oracle 补丁包对应补丁号 20760997属于 DATABASE PATCH SET UPDATE 11.2.0.3.15并包含 2015 年 7 月 CPU 安全更新主要用于修复已知安全漏洞、稳定性与性能问题适合补丁评估、版本核对和更新准备场景。资源以 zip 压缩包分发体积约 100.73MB上游文件清单显示文件总数为 0且暂未提供主要文件类型明细因此不建议仅凭包内条目判断完整性。当前已有 293 人浏览学习说明该版本补丁仍有存量维护需求。对于需要核对 11.2.0.3.15 补丁集内容、确认 2015 年 7 月 CPU 覆盖范围或整理 Oracle 补丁管理依据的读者可将其作为版本资料与补丁来源参考重点结合补丁适用性、依赖关系和发布说明进行判断。1. 一个 zip 包卡住整晚OPatch failed with error code 73 从哪来把p20760997_112030_Linux-x86-64.zip这个文件名拆开看信息其实很全p后面跟的是补丁号112030对应 11.2.0.3.0 这个版本位后缀说明它只认 Linux x86-64 平台。很多人拿到这样一个 Oracle patch 包动作是行云流水的——上传、解压、切进补丁目录、opatch apply——然后屏幕就停在一行OPatch failed with error code 73再往下翻是一堆UtilSession failed。这类故障的折腾人之处在于它不告诉你哪里错只给你一个数字。补丁到底有没有打进去一半、环境是不是被改坏了、要不要回滚全靠自己判断。下面这套排查顺序是我踩过几次坑之后固定下来的先确认环境对不对再分清是冲突、是占用还是权限最后才是执行和验证。适合手上正拿着这个包、卡在某个报错码上的人照着走。2. 解压之后别急着 applyORACLE_HOME、OPatch 版本与平台的三类拦路报错补丁包本身是死的环境是活的。绝大多数opatch apply失败在真正执行安装动作之前就已经注定只是报错被压到了最后一行。我的习惯是解压完先做三件不产生任何变更的检查环境变量指向哪个 HOME、OPatch 版本够不够、补丁包认不认这个平台和版本。2.1 Cannot find a valid Oracle Home环境变量和 oraInst.loc 先对齐最典型的一幕是切到了 root 用户下执行或者用su -切 oracle 时环境没带过来OPatch 直接告诉你找不到一个合法的 Oracle Home。它找 HOME 靠两样东西一是ORACLE_HOME环境变量二是 inventory 指针文件/etc/oraInst.loc或oraInst.loc里inventory_loc指向的中央清单。这两样任意一个不对后面全是空谈。# 1) 确认当前是谁、HOME 指向哪里 whoami echo $ORACLE_HOME echo $ORACLE_BASE # 2) 确认 inventory 指针文件存在且内容正确 cat /etc/oraInst.loc # 典型内容 # inventory_loc/u01/app/oraInventory # inst_groupoinstall # 3) 用 opatch 自己复核一遍它认到的 HOME $ORACLE_HOME/OPatch/opatch lsinventory -detail | head -40 # 4) 如果 oraInst.loc 不在默认位置显式指定 $ORACLE_HOME/OPatch/opatch lsinventory -invPtrLoc /etc/oraInst.loc第一段的意义是排除“切用户丢环境”这个最常见原因——su oracle和su - oracle差别很大前者不读登录脚本ORACLE_HOME、PATH、LD_LIBRARY_PATH全是空的。第二段是确认清单指针没被改过有些机器装完库之后有人动过/etc/oraInst.loc或者同一台机器上有多个 inventoryOPatch 认错了清单就会报“找不到有效 HOME”。第三段的lsinventory -detail不只是看 HOME还能顺带把已装补丁列出来为后面判断冲突留证据。-invPtrLoc参数只在指针文件不在默认路径时才需要值填oraInst.loc的绝对路径不是 inventory 目录本身——这一点经常被写反。还有一类变体HOME 是对的但$ORACLE_HOME/OPatch目录本身权限或属主被人动过报错会变成OPatch is not executable或 Java 启动失败。查一下属主即可# OPatch 目录必须归 oracle:oinstall可执行位不能丢 ls -ld $ORACLE_HOME/OPatch ls -l $ORACLE_HOME/OPatch/opatch # 若属主被 root 改过纠正回来用 root 执行 chown -R oracle:oinstall $ORACLE_HOME/OPatch chmod -R 755 $ORACLE_HOME/OPatch这里的判断依据很简单OPatch 是个 shell 脚本加一堆 jar靠自带或系统的 Java 跑起来。属主错了写临时目录和日志就会失败可执行位没了连启动都做不到。chmod -R 755覆盖到子目录是可接受的因为 OPatch 目录下不该有需要 group write 的东西。2.2 OPatch 版本太旧补丁 README 里的最低版本要求补丁包解压后一定有个README.txt或README.html里面明确写了这个补丁要求的最低 OPatch 版本。版本不够时报错通常出现在真正写入文件之前措辞类似“当前 OPatch 版本低于本补丁要求的最低版本”或者干脆在解析补丁元数据时就UtilSession failed。这不是玄学是 OPatch 自己要读补丁里的新格式元数据老版本解析不了。# 看当前 OPatch 版本 $ORACLE_HOME/OPatch/opatch version # 看补丁 README 里写明的最低版本解压目录下 grep -i -n opatch README.txt | head -20升级 OPatch 的标准动作是先在 MOS 上下对应版本的 OPatch 包通用平台那个 zip停掉所有用到该 HOME 的进程然后把旧目录改名而不是直接覆盖因为覆盖升级一旦中断OPatch 目录会处于半新半旧的状态比不升级更麻烦。# 1) 备份旧 OPatch 目录改名不删 mv $ORACLE_HOME/OPatch $ORACLE_HOME/OPatch.bak.$(date %Y%m%d) # 2) 解压新 OPatch 到 ORACLE_HOME 下 unzip -q /tmp/p6880880_112000_Linux-x86-64.zip -d $ORACLE_HOME # 3) 恢复属主并验证版本 chown -R oracle:oinstall $ORACLE_HOME/OPatch $ORACLE_HOME/OPatch/opatch version第一步用mv而不是rm -rf是给自己留后悔药升级后如果 OPatch 起不来把新目录删掉、旧目录改回来三十秒就能回到可用状态。第二步解压目标是$ORACLE_HOME因为 OPatch 包内部结构就是OPatch/解压到 HOME 下会自动落在正确位置别再套一层目录。第三步的chown必须做解压出来的文件属主是执行解压的人如果是 root 解的OPatch 又会被权限问题卡住。2.3 平台与版本对不上“not applicable to the current Oracle Home”_Linux-x86-64这半个文件名是有约束力的。放到 32 位库、放到 AIX、放到 12c 的 HOME 上OPatch 都会拒绝措辞大意是补丁不适用于当前 Oracle Home。同样地112030对应 11.2.0.3.0如果目标 HOME 是 11.2.0.4这个包不能跨版本打。# 一次性核对平台与版本 uname -m # 期望 x86_64 $ORACLE_HOME/OPatch/opatch lsinventory | grep -i Oracle Home\|Version\|Platform这三行输出的组合就是判定依据uname -m必须是x86_64lsinventory里的 Oracle Home 版本位必须是 11.2.0.3Platform 里不能出现 32 位字样。对不上就别硬来去补丁号对应的版本分支取正确的包。硬来最坏的结果是 OPatch 写到一半发现二进制不匹配HOME 里留下一堆半成品文件后面只能靠 inventory 修复代价比重新下一次包高得多。顺带提醒一个容易忽略的点同一个版本的补丁RAC 节点上每个 HOME 都要单独打opatch apply默认只作用于本地 HOME不会自动同步到其他节点。3. error code 73补丁冲突、前置补丁缺失与回滚取舍环境齐了OPatch 版本也够接下来最容易撞上的就是 73。它跟“安装过程中出错”是两回事含义更接近“检测到冲突主动退出”。也就是说这个数字本身是好消息——文件还没有被大面积改动你还有完整的处置空间。麻烦在于它不告诉你是谁冲突了得自己问出来。3.1 73 不是“安装失败”是“检测到冲突就主动退出”OPatch 在执行前会做冲突检测把待打补丁的文件清单和 HOME 里已装补丁的文件清单做比对看有没有同一条文件被两个补丁覆盖、有没有组件版本不匹配、有没有前置补丁没装。任一命中就抛 73。所以处理思路不是“重试”而是“把冲突对象找出来决定让它消失还是让它被满足”。先确认打之前的状态是干净的这一步很多人跳过结果出问题时连基线都没有# 打补丁前把已装补丁清单存一份基线 $ORACLE_HOME/OPatch/opatch lsinventory -detail /tmp/lsinv_before_$(date %Y%m%d%H%M).log # 老版本 OPatch 没有 lspatches 子命令时用 lsinventory 的 -bugs_fixed $ORACLE_HOME/OPatch/opatch lsinventory -bugs_fixed | grep -i ^Patch\|Bug | head -40基线日志的用途不只是留档。等出问题时你可以拿它和打完之后的状态做 diff一眼看出 OPatch 到底改了哪些组件、有没有装进去一部分。-bugs_fixed是查“这个 HOME 里已经修过哪些 bug”的开关在只支持lsinventory的老 OPatch 上这是唯一能列出补丁号的途径新一点的 OPatch 才有lspatches这个更直观的子命令。3.2 用 opatch prereq 把冲突对象问出来prereq系列是只读检查不会改任何东西出问题的时候应该第一时间用它而不是反复 apply 试运气。三个检查各有分工冲突检查问“和已装补丁撞不撞”文件占用检查问“有没有进程正在用这些文件”空间检查问“磁盘够不够”。# 必须切到解压后的补丁目录里执行-ph 指向当前目录 cd /tmp/20760997 # 1) 冲突检查和已装补丁、组件版本比一遍 $ORACLE_HOME/OPatch/opatch prereq CheckConflictAgainstOHWithDetail -ph ./ # 2) 文件占用检查哪些可执行文件正在被进程使用 $ORACLE_HOME/OPatch/opatch prereq CheckActiveFilesAndExecutables -ph ./ # 3) 空间检查HOME 和临时目录都要够 $ORACLE_HOME/OPatch/opatch prereq CheckSystemSpace -ph ./-ph后面那个./是补丁目录路径必须在解压目录里执行因为 OPatch 要读同级的etc/config/inventory.xml之类元数据在别的路径下执行会直接报找不到补丁。第一条的输出如果出现某个已装补丁号和“conflict”字样冲突对象就锁定了。第二条如果列出文件名和 PID说明库或者监听没停干净那属于第 4 章的问题先解决占用再来。如果检查结论是“缺前置补丁”输出里通常带着OUI-67073前缀紧跟着一句“requires prerequisite patch(es)”。这时不要试图跳过——前置补丁里往往就是同一批文件的旧版本修复跳过去打即使 OPatch 放行后面跑脚本也可能因为字典视图或包的版本不对而失败。3.3 装前置补丁还是回滚旧补丁两条路怎么选确认存在冲突后只有两条路把缺的前置补丁先装上或者把冲突的旧补丁回滚掉再装新的。选哪条取决于冲突的是“前置依赖”还是“同级覆盖”。判断方法很直接看冲突报错里给出的补丁号如果它是本补丁 README 里明确列出的前置补丁那就必须装没有第二条路如果它只是另一个同期补丁且业务上不是必须的回滚它更省事。# 路线 A先装前置补丁在前置补丁自己的解压目录里执行 cd /tmp/前置补丁目录 $ORACLE_HOME/OPatch/opatch apply -silent # 路线 B回滚冲突的旧补丁再装当前补丁 $ORACLE_HOME/OPatch/opatch rollback -id 冲突补丁号 -silent # 回滚后确认清单里已经没有它 $ORACLE_HOME/OPatch/opatch lsinventory | grep -i 冲突补丁号路线 A 里的-silent是让 OPatch 不进入交互式确认适合脚本化执行但第一次操作建议去掉它把交互提示逐条看完尤其是“是否继续”和“是否需要重新链接”这类问题看不懂就别按回车。路线 B 的-id后面必须是补丁号本身不是目录名写错会报找不到可回滚的补丁。回滚这条路上最大的坑是.patch_storage。OPatch 在$ORACLE_HOME/.patch_storage下保存每个已装补丁的原始文件和回滚脚本有人为了“清空间”把它删了之后的回滚必然失败报错大意是找不到回滚所需文件。这个目录不要动它才是补丁的后悔药。# 确认回滚信息还在 ls -d $ORACLE_HOME/.patch_storage/*20760997* 2/dev/null du -sh $ORACLE_HOME/.patch_storage如果某个补丁的 storage 目录已经丢了回滚这条路就断了只能往前装、用更新的补丁覆盖或者走整库恢复。所以在决定“先删点什么腾空间”之前先看一眼.patch_storage占了多少、能不能从别的 HOME 挪——这是血泪经验换来的顺序。4. CheckActiveFilesAndExecutables 失败库没关干净、属主不对、空间不够有一类报错看起来像“补丁包的问题”其实是“机器状态的问题”。最典型的就是Prerequisite check CheckActiveFilesAndExecutables failedOPatch 要替换oracle可执行文件、一堆.so结果发现这些文件正被进程打开着于是拒绝继续。这个检查是保护机制绕过它去强打后果可能是库在运行中被换掉二进制进程行为不可预期。4.1 报错原文读法被占用的到底是哪个文件这条报错下面会跟一段清单列出文件路径和占用它的进程。读它的正确姿势是从下往上看先看最后一个被列出的文件属于哪个组件再看 PID 属于哪个进程。经验上占用的常客是数据库实例ora_pmon_SID、监听tnslsnr、还有 EM agent 或者自己写的定时任务里残留的 sqlplus 会话。# 1) 直接问系统这个 HOME 下的文件被谁打开了 lsof D $ORACLE_HOME/bin 2/dev/null | head -30 lsof D $ORACLE_HOME/lib 2/dev/null | head -30 # 2) 按进程名搜比 lsof 更快 ps -ef | grep -E ora_pmon|tnslsnr|oraagent|emagent | grep -v grep # 3) 精准定位某个文件 fuser -u $ORACLE_HOME/bin/oraclelsof D是递归扫目录速度慢但全D大写在部分版本上更可靠小写d只扫一层。ps -ef那条是快速筛查先看有没有明显的实例和监听在跑。fuser -u的输出里PID 后面带括号的用户名就是占用者最省事。这三条命令的组合价值在于报错清单可能只列了一部分文件系统层面的扫描能补全避免“解决了一个还有三个”。4.2 彻底停库从 srvctl 到 ps -ef 的收尾动作单实例和 RAC 的停法不一样而且“停了库”不等于“没有进程在用 HOME”。标准顺序是先停应用连接、再停数据库、再停监听、最后停 GIRAC 场景。# 单实例先正常关库 export ORACLE_SIDSID sqlplus -s / as sysdba EOF shutdown immediate; exit EOF # 停监听 lsnrctl stop # RAC用 srvctl 停别手工 kill srvctl stop database -d db_unique_name -o immediate srvctl stop listener -n node_name # 收尾确认没有残留进程抓着 HOME 里的文件 ps -ef | grep -E ora_|tnslsnr | grep -v grep这里的顺序有讲究先shutdown immediate而不是abort是为了让 SMON 做实例恢复、清理临时段避免下次启动时再花时间做恢复如果库已经卡死到 immediate 也下不去才用abort但要在补丁完成后确认库能正常 open。RAC 场景用srvctl是关键手工kill -9pmon 会让 CRS 认为实例异常可能触发重启反而把文件又占回去。收尾那条ps -ef不要省。停完之后如果有ora_pmon残留说明停库没真正完成这时候去打补丁CheckActiveFilesAndExecutables还是会失败而且失败点可能在更靠后的阶段排查成本更高。4.3 权限、属主与 inode那些看起来无关的报错打完补丁常见的另一类失败报错文本跟权限、空间相关但指向的位置很迷惑。三种情况我遇到过不止一次第一种补丁解压目录属主不对。用 root 传包、root 解压目录归 root 所有切到 oracle 执行opatch apply时OPatch 需要在这个目录里写日志和临时文件直接失败。# 补丁目录整棵树交给 oracle chown -R oracle:oinstall /tmp/20760997 chmod -R urwX /tmp/20760997urwX里那个大写X是有意的它只给目录和本来就有执行位的文件加执行权限不会把普通文本文件变成可执行。这个细节在批量改权限时能避免把 README、sql 脚本改成 755。第二种TMPDIR或/tmp空间不足。OPatch 解包、生成脚本都要用临时空间空间不够时报错五花八门有时甚至表现为 Java 抛异常。# 看关键路径的剩余空间注意 inode 也要看 df -h $ORACLE_HOME /tmp df -i $ORACLE_HOME /tmp # 必要时指定临时目录到大盘上 export TMPDIR/u01/tmp mkdir -p $TMPDIR chown oracle:oinstall $TMPDIRdf -i这条经常被忽略磁盘还有几十 G但 inode 用光了创建文件照样失败报错文本里完全看不出是空间问题。小文件多的机器比如日志目录塞了几百万个小文件特别容易撞上。第三种HOME 所在文件系统只读或者有配额。这种报错反而好认写入时直接Read-only file system或Disk quota exceeded。挂载状态用mount | grep 挂载点确认即可。5. 避坑清单补丁上线前后五个高频翻车点前面讲的是“打不进去”的排查这一章讲“以为打进去了但其实没生效”和“打完之后出新问题”。这五条每一条我都在真实环境里见过共同特征是OPatch 返回 0人也就放心了问题在几天后以完全不同的面貌爆发。5.1 现象opatch 显示成功业务侧报的错一点没变原因基本锁死在“二进制补丁打了字典脚本没跑”。11.2.0.3 这个版本的补丁分两部分一部分是二进制文件和库OPatch 负责另一部分是数据库字典里的视图、包、存储过程要靠跑脚本落地。只做前一半SQL 层的修复就是空的。# 11.2.0.3 上执行补丁对应的字典脚本 cd $ORACLE_HOME/rdbms/admin sqlplus -s / as sysdba EOF catbundle.sql psu apply EOF # 跑完确认没有报错重点看 ORA- 开头的行catbundle.sql后面的psu apply是参数表示这次是“应用补丁集”而不是回退回退用psu rollback。执行前建议先做一次全库备份或者至少确认有可用的归档备份因为这个脚本会改大量字典对象。执行过程中出现 ORA- 错误不要直接忽略接着往下跑先把第一个错误解决掉再重跑中途失败留下的半完成状态最难收拾。5.2 现象RAC 环境一个节点好了另一个节点还犯同样的错原因是没有逐节点打补丁。RAC 的每个节点有自己的ORACLE_HOME哪怕路径看起来一样也是各自的本地文件系统opatch apply只作用于执行时所在的那一个。有人看到“补丁已应用”就以为全集群生效结果应用连到另一个节点时行为不一致排查半天以为是缓存问题。# 在每个节点上分别执行并核对补丁号一致 $ORACLE_HOME/OPatch/opatch lspatches # 节点间比对输出应该完全一致 for h in node1 node2; do echo $h ssh $h $ORACLE_HOME/OPatch/opatch lspatches donelspatches输出的是补丁号加简述比对时看补丁号集合是否一致即可。RAC 场景还有个额外约束滚动打补丁时先停一个实例、打补丁、起实例再动下一个不要在补丁期间让两个节点跑不同版本的二进制还对外提供服务某些补丁明确要求全停。5.3 现象想回滚opatch rollback 报找不到回滚所需文件原因十有八九是.patch_storage被清理过。有人看它占几个 G顺手删了或者在做文件系统迁移时漏拷了隐藏目录ls不带-a看不到cp不加参数也带不走。这个目录是回滚的唯一依据删了就没有回头路。# 迁移 HOME 时务必带上隐藏目录 rsync -aHAX --numeric-ids $ORACLE_HOME/ usertarget:$ORACLE_HOME/ # 确认 storage 里每个已装补丁都有对应目录 ls -1 $ORACLE_HOME/.patch_storage | headrsync参数里-a已包含-D设备与特殊文件和递归-H保留硬链接、-A保留 ACL、-X保留扩展属性--numeric-ids避免目标端 UID 映射错乱。这几个参数在迁移 Oracle HOME 时是必须的少一个都可能在几个月后以“回滚失败”的形式找上门。5.4 现象升级 OPatch 之后原来能打的补丁打不了了原因是权限被 root 改过。解压新 OPatch 用 root 做忘了chown或者为了图快用了chmod -R 777。前者导致 oracle 用户写不了日志后者导致 OPatch 拒绝在“过于宽松权限”的目录下运行——这本身是个安全检查不是 bug。# 恢复到标准权限 chown -R oracle:oinstall $ORACLE_HOME/OPatch find $ORACLE_HOME/OPatch -type d -exec chmod 755 {} \; find $ORACLE_HOME/OPatch -type f -exec chmod 644 {} \; chmod 755 $ORACLE_HOME/OPatch/opatchfind加-exec的方式比chmod -R 755更精确目录 755、文件 644最后单独把opatch这个入口脚本恢复成 755。这样跑完OPatch 目录里不会出现“所有文件都可执行”这种隐患。5.5 现象补丁打完监听起不来或者连上了报奇怪的库错误原因是环境变量残留。打完补丁后没有重新加载 oracle 用户的环境LD_LIBRARY_PATH还指着一个已经变了的路径组合或者补丁过程中临时改过的TMPDIR一直留在会话里。表现在监听上就是启动时找不到某个.so。# 重新登录式加载环境而不是在当前会话里 export su - oracle -c echo $ORACLE_HOME; echo $LD_LIBRARY_PATH # 起监听前先看动态库依赖是否都能解析 ldd $ORACLE_HOME/bin/oracle | grep -i not foundldd输出里出现not found就是明确信号说明运行时链接器找不到某个库通常是LD_LIBRARY_PATH少了$ORACLE_HOME/lib。用su - oracle而不是su oracle就是为了读一遍登录脚本把变量恢复到干净状态。6. 快速定位两条命令、三张表确认补丁到底生效没有前面所有排查做完最后一个问题必须回答这个补丁到底生效了没有。我的习惯是不看 OPatch 的“successfully”就下结论而是从三个层面各取一个证据三者对齐才算完事。第一层文件层面。OPatch 自己的清单最有发言权看补丁号在不在、状态是不是 applied。# 新一点的 OPatch 用这个直观 $ORACLE_HOME/OPatch/opatch lspatches # 老版本没有 lspatches退回 lsinventory 并过滤 $ORACLE_HOME/OPatch/opatch lsinventory | grep -i -A2 20760997 # 拿打完的清单和打之前的基线做 diff看改动范围 diff (grep -i patch /tmp/lsinv_before_*.log) \ (grep -i patch /tmp/lsinv_now.log)lspatches在 11.2.0.3 后期的 OPatch 版本上可用早期的只能用lsinventory加过滤。基线 diff 这一步的价值在于它能告诉你 OPatch 除了你预期的补丁还顺带改了哪些组件——比如重新链接了某个可选组件这类附带变更往往是后续问题的源头。第二层字典层面。二进制生效不代表 SQL 层生效catbundle.sql跑没跑、跑成功没有只能从数据字典里看。-- 11g 上看补丁在字典里的落地记录 select action, namespace, version, id, comments, action_time from dba_registry_history order by action_time desc fetch first 10 rows only; -- 兼容写法部分版本不支持 fetch first select * from ( select action, namespace, version, id, comments, action_time from dba_registry_history order by action_time desc ) where rownum 10; -- 确认关键组件状态是 VALID别只看补丁记录 select comp_name, version, status from dba_registry order by comp_name;dba_registry_history里每行代表一次字典变更动作action_time能和打补丁的时间点对上comments里通常写着补丁号。第二条语句是给不支持fetch first的版本用的兼容写法rownum在外层过滤才能保证先排序再截断——写成内层rownum会取到随机的十行。第三条更关键即使补丁记录在如果有组件是INVALID说明字典脚本中途失败过业务照样会报错。第三层行为层面。前两层都过还要用一个能复现原故障的最小用例验一遍毕竟补丁修的就是那个具体问题。# 用最简单的连接验证实例可用再看告警日志有没有新错误 sqlplus -s / as sysdba EOF select instance_name, status, database_status from v$instance; select name, open_mode from v$database; exit EOF # 盯住告警日志尾部补丁后首次启动的报错都在这儿 tail -200 $ORACLE_BASE/diag/rdbms/db_unique_name/SID/trace/alert_SID.logv$instance的status应该是OPENdatabase_status应该是ACTIVEv$database的open_mode是READ WRITE。告警日志尾部要重点看有没有ORA-开头的行尤其是补丁后首次启动时的字典加载错误——这类错误常常不影响库打开但会在业务访问特定对象时才暴露属于最难排查的一类。三张表 两条命令就是完整的证据链。我从那次补丁打成功、业务照旧报错、最后发现catbundle.sql因为一个 ORA- 中断在第八分钟的经历之后每次打完补丁都强制走一遍这套验证不管 OPatch 输出多漂亮。手上的补丁包、解压出来的 README、opatch的完整输出日志、catbundle.sql的执行记录四样东西放在同一个目录里归档下次遇到同版本的其他补丁直接照着那次的时间线复盘就行。希望这套顺序能帮你少熬一个晚上。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
MySQL千万级数据深分页优化实战与延迟关联技术 1. 千万级数据深分页优化实战最近在准备大版本发布的性能压测时,我们遇到了一个典型的MySQL深分页性能问题。在佣金结算的批处理模块中,一条看似简单的SQL语句在执行时出现了严重的性能瓶颈,执行时间从最初的毫秒级逐渐攀升到5秒以上… · 2026/11/4 23:36:00
Web安全漏洞挖掘:从入门到实战的完整指南 1. 漏洞挖掘入门指南:从零开始的安全探索 第一次接触漏洞挖掘时,我完全被那些专业术语和复杂工具吓到了。但经过多年实践发现,只要掌握正确方法,任何人都能逐步成长为合格的安全研究员。这篇文章将带你系统了解漏洞挖掘的核心思路… · 2026/11/4 23:36:00
VC2015编译libssh-0.10.3静态库:Windows下SFTP集成确定性方案 简介:本资源为面向Windows平台C/C开发者的libssh-0.10.3静态库预编译包,专为使用Visual Studio 2015(VC140工具集)构建SSH功能集成应用而准备,适用于远程登录、安全文件传输及自定义SSH服务开发等场景,适合… · 2026/11/4 23:34:53
8G显存本地AI数字人实战:从ASR到TTS的完整搭建与调优指南 8G显存在AI本地化圈子里处境挺尴尬的:你说它能跑模型吧,7B量化之后勉强能聊;你说它跑不好吧,又确实比集显强太多。大多数教程讲的都是怎么用Ollama跑一个聊天模型,但很少有人说可以更进一步——把它变成一只能听懂人话… · 2026/11/5 0:00:39
大模型系统性入门:从原理、部署到微调应用的完整路线 1. 为什么你收藏了300个教程,依然觉得大模型没入门我先讲一个前几天在交流群里看到的真实场景:有人问"大模型怎么入门",群里立马有人甩出几个网盘链接,里面躺着几百个PDF和视频,说是"全网最全的大模型学… · 2026/11/5 0:00:39
鸿蒙文件系统沙箱机制解析与开发实践 1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39
大模型系统性入门实战指南:从原理到部署微调的全链路路线 提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39
多智能体协作系统架构设计与实践优化 1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39
Mac软件下载站分类指南:四类渠道与安全判断标准 Mac用户找软件这件事,说大不大,说小也真不小。我用了十来年Mac,从最早在论坛里翻帖子找注册码,到后来自己维护一份资源清单,踩过的坑能写满一页纸:下到过套壳安装包、遇到过捆绑浏览器主页的“绿色版”、也… · 2026/11/4 23:59:37
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38
多智能体协作系统架构设计与实践优化 1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39
大模型系统性入门实战指南:从原理到部署微调的全链路路线 提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39
鸿蒙文件系统沙箱机制解析与开发实践 1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38