Oracle分卷补丁包4of7解压与opatch应用实战教程
简介这是Oracle 11.2.0.4客户端Windows 64位分卷压缩包标签中的sql2017系误标实际与SQL Server无关面向使用PL/SQL Developer等工具连接和管理远程Oracle数据库的开发人员与DBA。压缩包共包含1153个文件整体大小约600.71MB其中以jar、xml、dll等核心组件为主并配有exe可执行程序、bat配置脚本、nls语言资源以及若干properties配置文件这些文件共同构成完整的客户端工具链可用于安装、配置和连接Oracle数据库服务。目前已有1430人学习下载。解压后可直接安装Oracle客户端通过tnsnames.ora配置服务名即可远程连接数据库执行SQL查询、PL/SQL代码调试、存储过程编译以及数据导入导出等操作。对于希望快速搭建Oracle开发与运维环境的中高级技术人员这份完整的客户端包能省去逐一下载组件的麻烦同时支持多语言和多种连接受限场景是日常数据库管理与开发的高效辅助材料。1. 4of7 结尾的补丁包它是什么又为什么不能直接解压第一次见到p13390677_112040_MSWIN-x86-64_4of7.zip这种文件名很多人会以为下载漏了单个文件。实际上这是一个 Oracle 数据库补丁包的第 4 个分卷完整文件一共 7 个单独任何一个分卷都没法解出完整的补丁内容。文件名里p13390677是补丁编号112040对应数据库版本 11.2.0.4.0MSWIN-x86-64表示 Windows 64 位平台4of7是分卷序号。你要做的不是直接解压这个 zip而是把 7 个分卷分别解压到同一个补丁目录再用 OPatch 工具把补丁装进数据库。下面按实际操作顺序把环境核对、分卷解压、补丁应用、典型坑和回滚验证一次讲完新手能照着做老手也能核对一些边界细节。2. 动手前先把环境对齐补丁号、平台与 opatch 版本核对补丁应用翻车多半不是补丁本身的问题而是环境没对齐。文件名能读出很多东西但还不够。你需要确认数据库版本、OPatch 工具版本、分卷文件完整性三者都对了再动手。2.1 文件名拆解与平台匹配Oracle 的补丁包命名遵循p补丁号_版本_平台_分卷序号.zip的规则。以p13390677_112040_MSWIN-x86-64_4of7.zip为例字段示例含义补丁号p13390677该补丁的唯一编号用于opatch识别版本号11204011.2.0.4.0注意 11g 版本缩写少了点平台MSWIN-x86-64Microsoft Windows x86-64即 64 位 Windows分卷4of7总共有 7 个分卷这是第 4 个112040是11.2.0.4.0去掉点号后的写法。看到这个就知道该补丁只能装在 11.2.0.4 的数据库上其它小版本如 11.2.0.3 装了会报版本不符合预期。MSWIN是 Oracle 对 Microsoft Windows 的缩写后面紧跟架构。如果你的数据库是 32 位 Windows那你要找的平台串是MSWIN-x86-32而不是MSWIN-x86-64。下载之前一定要确认操作系统是 64 位还是 32 位以及数据库是 64 位还是 32 位。曾经有人把 32 位数据库硬套 64 位补丁结果 OPatch 预检查直接提示平台不匹配白折腾一晚上。怎么确认操作系统位数在 Windows 命令行执行:: 查询操作系统架构 wmic os get osarchitecture输出64-bit或32-bit。数据库是否 64 位则看sqlplus / as sysdba进入后的 banner或者用file命令查看oracle.exe如果有 GNU tools 的话。更直接的方法执行%ORACLE_HOME%\bin\oracle.exe -v看输出里的位数标识。2.2 核对 ORACLE_HOME 与数据库版本OPatch 操作的是 ORACLE_HOME 下的文件所以环境变量必须指向正确的目录。很多人电脑里装了不止一套 Oracle如果用错 HOME轻则补丁装错位置重则污染另一套环境。在命令行里检查:: 检查环境变量 echo %ORACLE_HOME% echo %ORACLE_SID%ORACLE_HOME应该指向你打算打补丁的那套数据库的安装根目录比如C:\oracle\product\11.2.0\dbhome_1。ORACLE_SID对应实例名比如ORCL。如果这些变量没设置在当前 cmd 窗口里临时设置set ORACLE_HOMEC:\oracle\product\11.2.0\dbhome_1 set ORACLE_SIDORCL set PATH%ORACLE_HOME%\bin;%ORACLE_HOME%\OPatch;%PATH%然后确认数据库版本真的就是 11.2.0.4sqlplus / as sysdba在 SQL*Plus 里执行select version, banner from v$version where rownum 1;如果输出Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production那就对了。如果版本是 11.2.0.3 之类不要往下走先做数据库升级。2.3 用 opatch version 确认补丁工具版本OPatch 是 Oracle 用来安装补丁的工具它本身也在持续更新。补丁包对 OPatch 有最低版本要求如果手里的 OPatch 太老opatch apply会直接在预检查阶段报OPatch version older than required。Windows 上 OPatch 的位置在 ORACLE_HOME 下的OPatch目录。执行%ORACLE_HOME%\OPatch\opatch.bat version正常会输出类似OPatch Version: 11.2.0.3.34拿到这个版本号后去补丁包里的README.txt搜OPatch Version对比是否满足最低版本要求。如果低了下载对应 OPatch 工具版本先备份旧的OPatch目录再解压覆盖。注意覆盖时要确保数据库处于关闭状态因为 OPatch 工具可能在数据库进程运行时被占用。2.4 校验分卷完整性MD5/SHA 与文件大小核对这一步很多人跳过但恰恰是最便宜的后悔药。分卷下载过程中可能损坏损坏的分卷解压时会报 CRC 错误更隐蔽的是解压能成功但某个二进制文件损坏直到应用补丁时才报错那时排查成本就大了。Oracle 下载页通常会提供每个分卷的 MD5 校验值。在 Windows 上用系统自带的certutil就能算 MD5:: 计算单个分卷的 MD5 值 certutil -hashfile C:\temp\patch\p13390677_112040_MSWIN-x86-64_4of7.zip MD5输出的 32 位十六进制字符串需要和官网给的值比对。7 个分卷都要算不要觉得只算第 4 个就够。另外核对各分卷大小通常每个分卷大小是固定约 2GB如果某个分卷只有几百 MB那基本是下载中断。如果分卷多用 PowerShell 批量计算# 遍历所有分卷计算 MD5 $files Get-ChildItem C:\temp\patch\p13390677_112040_MSWIN-x86-64_*.zip foreach ($f in $files) { $hash (Get-FileHash -Path $f.FullName -Algorithm MD5).Hash Write-Output $($f.Name) - $hash }Get-FileHash是 PowerShell 4.0 自带命令不需要额外安装。看到输出后和官网校验值逐条比对全部一致再进下一步。如果某个分卷不一致重新下载那一个分卷即可不需要全部重下。2.5 检查已安装补丁与 inventory 状态在 apply 之前请先摸清当前 ORACLE_HOME 里已经有哪些补丁。执行%ORACLE_HOME%\OPatch\opatch.bat lsinventory -oh %ORACLE_HOME%如果输出里有一堆已应用的补丁列表说明这个环境不是干净的。你需要关注的是这些已装补丁的Patch description是否和你要装的补丁有重叠。重叠的冲突在 apply 阶段会报出来提前知道可以少走弯路。还可以查看 inventory 文件是否存在dir %ORACLE_HOME%\cfgtoollogs\opatch\lsinventory如果这里没有记录可能是 inventory 损坏。修复 inventory 是一个专门流程这里不展开但至少你要确认它的状态别等到 apply 时才报invalid inventory。3. 把 7 个分卷合成一个可用的补丁目录解压的三种方法与参数下载完、校验完接下来就是解压。但你可能会困惑7 个分卷一个一个解压到同一个目录会不会互相覆盖到底应该怎么“合并”3.1 分卷合并的底层逻辑不是拼接 zip而是解压后合并目录很多人以为4of7表示 7 个分卷需要像老式软盘那样先把所有分卷拼成一个大 zip 再解压。实际上 Oracle 的这种分卷不是 split archive而是每个分卷都是独立的 zip 文件内部只包含补丁树的一部分文件。官方文档通常会说 “Download all zips and extract them into the same directory”。理解了这一点就不要用二进制拼接命令比如copy /b *.zip all.zip这样拼出来的是一个损坏的 zip7-Zip 根本打不开。正确的做法是把 7 个分卷分别解压到同一个目标目录让解压出的文件合并成完整补丁目录。为什么能合并因为每个分卷内部的文件路径大多是独立的比如1of7放files/1/2of7放files/2/或者按子目录区分。即便有相同路径内容也是同一个文件的不同部分理论上应该一致。为了稳妥我一般让解压工具遇到重名时先询问确认没有非预期覆盖。3.2 用 7-Zip 批量解压命令与参数Windows 自带的资源管理器右键解压遇到这种多分卷 zip 时会为每个分卷单独解压它不会自动把所有分卷的内容合并到同一目录。所以推荐用 7-Zip免费且命令行好用。假设分卷都放在C:\temp\patch\解压目标统一到C:\temp\patch_extract\$src C:\temp\patch $dst C:\temp\patch_extract # 确保目标目录存在 New-Item -ItemType Directory -Force -Path $dst # 循环解压所有 7 个分卷到同一目录 Get-ChildItem -Path $src -Filter p13390677_112040_MSWIN-x86-64_*of7.zip | Sort-Object Name | ForEach-Object { C:\Program Files\7-Zip\7z.exe x $_.FullName -o$dst -aoa }参数说明x解压到指定目录并保留内部目录结构。不要用ee会把所有文件摊平补丁目录树就乱了。-o$dst指定输出目录。注意-o和路径之间没有空格。-aoa覆盖已存在的文件。因为分卷间可能有同一个README.txt内容可能相同覆盖无害如果不同你会看到解压过程有覆盖警告这时要停下来想想是不是分卷错了。Sort-Object Name保证按 1of7、2of7 的顺序处理顺序不是必须的但乱了不方便排查。如果你平时用图形界面选中全部 7 个 zip右键 7-Zip 里的“解压到当前文件夹”效果一样。但图形界面遇到重名会弹框大型补丁解压时不要守着电脑点几百次“是”命令行批量处理更省心。3.3 验证解压结果目录结构与文件清单解压完成后目标目录下应该出现以补丁号命名的子目录比如C:\temp\patch_extract\13390677\。打开它里面应该有etc、files、patches等子目录以及README.txt和bundle.xml这类元数据文件。用下面的命令快速确认关键文件齐全dir C:\temp\patch_extract\13390677重点关注README.txt是否存在。OPatch 会读取它获取补丁元数据。etc\目录里是否有config和inventory相关文件。files\目录是否存在且非空这是补丁实际要替换的二进制。一个典型的补丁目录结构大致是这样的C:\temp\patch_extract\ └─ 13390677\ ├─ README.txt ├─ bundle.xml ├─ etc\ │ ├─ config\ │ └─ inventory\ └─ files\ ├─ ...如果缺了这些基本能确定有分卷没解压进去或者解压到了不同目录。重新检查通配符*of7.zip是不是漏了1of7或7of7。文件名里的_下划线有没有写对。注意有些补丁解压后不是以补丁号命名而是一个长目录名比如33182768/32904851/。这取决于具体补丁类型。无论名字是什么只要目录下能找到README.txt就说明至少解压出了一套结构的一部分。最后在opatch命令里指向包含README.txt的最终目录即可。3.4 解压报错的快速排查解压过程中最常遇到两类报错。第一是CRC Failed说明这个分卷损坏回到第 2.4 节重新校验并下载对应分卷。第二是Can not open file as archive说明你可能选错了文件——如果 7-Zip 不识别某个分卷检查它是不是被改名了或者干脆不是 zip 格式。还有一类诡异问题解压中途卡住不动进程占满 CPU。这通常发生在杀毒软件扫描时可以先把解压目录加入杀毒白名单或者暂时关闭实时防护解压完成后再打开。4. 用 opatch apply 把补丁打进数据库完整命令与参数说明解压出补丁目录只是万里长征走完一半。接下来才是关键动作——把补丁应用到 ORACLE_HOME。这一步有很多参数和前置条件不要一上来就opatch apply。4.1 停库前的检查清单内存、磁盘与监听在动 ORACLE_HOME 之前环境一定要干净。我的习惯是先跑一遍检查清单全绿再继续。先确认数据库状态和监听状态:: 查看监听状态 lsnrctl status :: 进入 SQL*Plus sqlplus / as sysdba在 SQL*Plus 里查看当前实例select status from v$instance;如果实例是OPEN状态需要执行shutdown immediate关闭数据库。补丁会替换 ORACLE_HOME 里的二进制文件如果数据库进程还运行着文件被占用无法替换Windows 下会直接报共享冲突。监听进程同样会占用动态库所以监听最好也停掉lsnrctl stop然后在 SQL*Plus 里shutdown immediate磁盘空间检查也在这时做。Windows 下用dir或 PowerShell 的Get-PSDrive查看剩余空间Get-PSDrive C | Select-Object Used, FreeOracle 补丁应用时需要把原二进制文件备份到%ORACLE_HOME%\.patch_storage这个备份体积通常是补丁包大小的 1.5 到 2 倍。如果补丁解压后是 5GB那磁盘上至少要有 10GB 以上空闲才稳妥。然后做一次预检%ORACLE_HOME%\OPatch\opatch.bat prereq CheckApplicable -oh %ORACLE_HOME% -ph C:\temp\patch_extract\13390677-ph指向补丁目录。预检会检查数据库版本、已安装补丁、依赖等输出CheckApplicable - Passed才能继续。4.2 opatch apply 的核心命令与关键参数补丁目录确认没问题后执行应用命令。单机环境最常见的命令是%ORACLE_HOME%\OPatch\opatch.bat apply C:\temp\patch_extract\13390677 -oh %ORACLE_HOME%参数说明apply后面跟补丁目录的绝对路径用引号包住避免路径中有空格。-oh显式指定 ORACLE_HOME避免 OPatch 从环境变量读到错误路径。-jre可以指定 Java 运行时目录Windows 下常见用法是-jre %ORACLE_HOME%\jdk\jre但大部分环境不需要加。-tmpdir指定临时目录当默认临时目录空间不足时使用例如-tmpdir D:\opatch_tmp。OPatch 执行过程中会做这些事读取补丁目录里的README.txt和bundle.xml获取元数据。检查当前 inventory 中已安装的补丁确认没有冲突。将需要覆盖的文件先复制到%ORACLE_HOME%\.patch_storage做备份。执行脚本替换文件。更新 inventory 中的补丁记录。整个过程可能持续 10 到 40 分钟。日志会打到控制台也会写入%ORACLE_HOME%\cfgtoollogs\opatch\目录。看到以下输出说明成功了The apply operation for patch 13390677 was successful.4.3 冲突处理-resolve 参数与 precheck如果 ORACLE_HOME 里已经装过别的补丁尤其是同一个子系统的累计补丁opatch apply会报Following patches are overlapping with this patch: ...OPatch 会中断操作防止破坏已有补丁。处理方式一是先把冲突的其他补丁移除再装新补丁二是用-resolve参数让 OPatch 自动分析冲突影响范围。在 11g 时代-resolve不是万能药它只会列出冲突不会自动绕过。我的一般做法是先看冲突列表里的补丁是否已经被当前补丁包含。如果 README 里写着 “supersedes patch xxxxx”那意味着旧补丁可以卸载。卸载旧补丁%ORACLE_HOME%\OPatch\opatch.bat rollback -id 12345678 -oh %ORACLE_HOME%卸载后再重新apply新补丁。如果冲突无法解决不要硬来停下来评估补丁依赖关系。另外注意-force参数。很多教程在报错时建议加-force强行应用我强烈不建议在正常操作中使用。-force会跳过冲突检查可能导致运行中的数据库行为异常。那是没有后悔药的路。4.4 apply 后确认日志与遗留任务apply 成功后OPatch 会在补丁目录下生成一个Apply_时间戳.log文件。打开它搜索WARNING和ERROR重点看有没有The patch may not be fully applied之类的警告。另外有些补丁包含 SQL 脚本需要数据库启动后手动执行。README.txt 会明确列出这些后续步骤。常见的有执行?/rdbms/admin/catbundle.sql或?/sqlpatch/...。这种“补丁已 apply但数据库字典还没升级”的情况很多人漏掉导致补丁看似成功实际组件版本没变。所以养成习惯apply 后启动数据库再查一遍组件版本。5. 分卷补丁的避坑指南从解压失败到 opatch 报错的 5 个真实案例补丁应用过程里我踩过不少坑也看别人踩过。下面 5 个案例覆盖面比较广每个按「现象 → 原因 → 解决」来写。5.1 只解压了一个分卷导致「找不到 inventory」现象执行opatch apply时OPatch 报Patch location C:\temp\patch_extract\13390677 does not exist或Unable to read the inventory from the patch location。原因补丁目录看起来存在但里面缺少 OPatch 所需的元数据。多数情况是只解压了第 4 个分卷因为补丁的元数据文件在1of7里没解压时目录结构残缺OPatch 识别不了。解决回到第 3 步把 7 个分卷全部解压到同一个目录。排查技巧在补丁目录下执行dir /s README.txt看能找到几个 README。正确结果通常是一个补丁根目录下有一个README.txt可能还有 README.html。如果找到 0 个或一堆残缺文件基本可以确定分卷没解全。5.2 路径含中文或空格导致 opatch 无法识别现象命令执行后没有任何响应或报The system cannot find the file specified但文件明明在。原因补丁解压路径包含中文、特殊字符或过长的子目录。OPatch 底层调用 Java11g 时代的 OPatch 对非 ASCII 路径支持非常差。比如路径D:\补丁\p13390677\可能让 Java 的 zip 库直接罢工。解决把分卷和解压目录都放在纯英文短路径下例如C:\temp\patch\。已经解压到中文目录的把整个目录复制到英文路径再试。另外Windows 用户账号如果包含中文名temp目录默认在C:\Users\中文名\AppData\Local\Temp下OPatch 的临时文件也可能受影响。手动设置TEMP和TMP系统环境变量指向C:\Windows\Temp或C:\temp然后重开 cmd 窗口执行。5.3 32 位 JDK 与 64 位补丁不兼容现象执行opatch.bat version或apply时窗口一闪而过或报Error: could not open ... jvm.dll。原因ORACLE_HOME 里自带的 JRE 是 32 位的但补丁平台是MSWIN-x86-64OPatch 需要 64 位 Java 才能操作 64 位 Oracle 文件。也可能是JAVA_HOME指向了 32 位 JDK。解决先确认有没有 64 位 JDK。命令行执行java -version看输出里有没有64-Bit。没有就安装一个 64 位 JDK然后在执行 opatch 的同一个 cmd 窗口里设置set JAVA_HOMEC:\jdk1.8.0_311_x64 set PATH%JAVA_HOME%\bin;%ORACLE_HOME%\OPatch;%PATH%再执行opatch version确认正常。注意OPatch 对 JDK 版本有要求11g 补丁通常要求 JDK 1.6 以上用 1.8 也可以但不要用太新的 JDK有可能不兼容 OPatch 的类库。5.4 磁盘空间不足但 opatch 报错很晚现象opatch apply走了很久到备份步骤时突然报No space left on device或java.io.IOException: There is not enough space on the disk。原因很多人只关注补丁包解压空间忽略了%ORACLE_HOME%\.patch_storage备份目录。备份体积随补丁大小增加最坏情况是补丁包体积的两倍以上。如果数据库所在盘剩余空间不够备份写一半就会失败。解决动手前用Get-PSDrive C看 ORACLE_HOME 所在盘符的空间。如果紧张可以清理临时文件和回收站或者用-tmpdir参数把备份和中间文件重定向到另一个盘%ORACLE_HOME%\OPatch\opatch.bat apply C:\temp\patch_extract\13390677 -oh %ORACLE_HOME% -tmpdir D:\opatch_tmp-tmpdir在部分 11.2.0.4 OPatch 版本上才支持如果报参数错误只能清理磁盘。5.5 杀毒软件静默隔离 opatch 的临时文件现象opatch apply执行到 30% 左右突然报FATAL ERROR: There are no files found in the patch directory但补丁目录明明完整。原因Windows Defender 或第三方杀毒软件在实时监控时把 OPatch 解压出来或备份的某些.dll、.exe文件判定为可疑程序并隔离了。补丁目录里的文件被移除OPatch 执行时发现文件缺失。解决补丁应用前把以下目录加入杀毒白名单补丁解压目录如C:\temp\patch_extract\ORACLE_HOME 下的OPatch目录%ORACLE_HOME%\.patch_storage%ORACLE_HOME%\bin如果已经发生隔离先去隔离区恢复文件再重新解压分卷然后关掉实时防护或用白名单方式重新apply。补丁应用完成后可以重新打开杀毒软件但操作期间保证文件不被删除这是属于“玄学”问题等排查一整天发现是杀毒软件干的你会很崩溃。6. 补丁装完不算完验证生效与回滚的实操技巧opatch apply输出 success 不代表一切正常。数据库要起来跑组件要能用确认补丁真的生效了再收工。6.1 用 opatch lsinventory 确认补丁 ID补丁应用成功后先查 inventory%ORACLE_HOME%\OPatch\opatch.bat lsinventory -oh %ORACLE_HOME%输出里会列出所有已应用的补丁列表。查找13390677这一行确认状态是successfully applied。如果不放心加-detail查看每个补丁的说明和安装时间%ORACLE_HOME%\OPatch\opatch.bat lsinventory -detail -oh %ORACLE_HOME%一个小技巧lsinventory 输出的最后部分会包含OPatch succeeded字样如果只看到OPatch failed说明 inventory 记录有问题先解决记录再继续。6.2 从 SQL 层验证组件版本补丁替换的很多是数据库内部组件光看文件可能不够。SQL 层验证可以确认补丁是否真正生效。启动数据库sqlplus / as sysdba startup然后查询补丁注册历史select action_time, action, namespace, version, comments from sys.registry$history where action APPLY order by action_time desc;如果补丁成功应用会看到一条新记录comments字段里包含补丁号13390677。同时查组件版本select comp_id, version, status from dba_registry where comp_id in (CATALOG, CATPROC);注意补丁应用后有些组件需要执行?/rdbms/admin/catproc.sql之类的脚本才能更新数据字典版本。如果dba_registry里的版本没变化按 README 里的 SQL 步骤执行。6.3 把补丁卸掉opatch rollback 的正确姿势补丁应用后如果出现严重性能问题或功能异常卸载是基本操作。回滚命令%ORACLE_HOME%\OPatch\opatch.bat rollback -id 13390677 -oh %ORACLE_HOME%这条命令会根据%ORACLE_HOME%\.patch_storage里的备份文件恢复原二进制并更新 inventory。回滚同样需要停库、停监听和 apply 时的环境要求一致。回滚完成后还要重新编译失效对象。执行?/rdbms/admin/utlrp.sql然后再次用lsinventory确认补丁已经不在列表里。最后说一个习惯我见过最典型的翻车是有人为了省时间不停监听结果 apply 过程中动态库句柄被占用Windows 直接报The process cannot access the file because it is being used by another process补丁只应用了一半最后只能重装数据库才救回来。从那以后我每次打补丁都老老实实执行“停监听 → 关实例 → 检查空间 → 再 apply”这一套流程。补丁应用不是秀操作越按部就班越不容易出错。希望这篇笔记能帮你绕开这些坑。本文还有配套的精品资源点击获取