资讯动态

Oracle 11.2.0.1 打补丁实战指南:关库、备份、验OPatch三步避坑

发布时间:2026/10/19 6:17:04 来源:尧图企业网站定制
简介本资源是一份面向Oracle数据库运维工程师与DBA的实战型补丁管理指南聚焦Oracle 11.2.0.1版本的补丁安装全流程解决企业环境中常见补丁部署不规范、回滚困难、验证缺失等痛点。文档以清晰步骤覆盖安装前环境检查与全量备份、OPatch工具配置与解压、多数字补丁按序应用从小到大逐个执行opatch apply、异常处理命令lsinventory/rollback/prereq及安装后功能验证与文档归档等关键环节内容紧贴生产实践。资源为单文件Word文档.doc大小942KB结构紧凑、指令明确含典型命令示例与succeed成功标识判断要点便于现场快速查阅与执行。目前已有130人学习下载适合中初级DBA掌握标准化补丁操作流程、规避误操作风险并建立可复用的补丁管理意识与记录习惯。1. Oracle 11.2.0.1 打补丁不是“点下一步”一个没关实例就开 opatch 的血泪现场去年帮某高校实验室升级一套运行三年的 Oracle 11.2.0.1 教学数据库原计划半小时打完两个关键安全补丁p29750384、p30122186结果卡在opatch apply报错 ORA-01034 OPATCH-00028整整折腾六小时——最后发现是 DB 实例看似 shutdown immediate 成功实则后台 smon 进程还在苟延残喘而 opatch 在静默模式下根本没校验实例状态直接硬上导致补丁元数据写入一半被中断后续opatch rollback失败lsinventory显示补丁状态为 applied with warning连sqlplus / as sysdba都连不进。这不是个例Oracle 11.2.0.1 是国内存量最大的老版本之一大量部署在政务、教育、制造业离线系统中它不支持一键在线打补丁所有补丁都必须停库但它的 OPatch 版本11.2.0.1.7 及以下又极度依赖人工判断环境状态稍有疏忽就是回滚失败、数据库无法启动的黑匣子。本文专为正在面对真实物理机/虚拟机上这套“古董级但不能换”的 Oracle 环境的 DBA 和运维同学而写——不讲原理只列命令、标路径、写报错原文、给后悔药。你不需要懂 RAC 或 Data Guard只要能进 Windows Server 或 Linux 命令行就能照着走通。2. 补丁前必做三件事关库、备份、验 OPatch 版本2.1 彻底关闭 Oracle 实例别信 shutdown immediate 的返回值很多同学执行shutdown immediate后看到Database closed.就以为完事了这是 Oracle 11.2.0.1 最经典的玄学陷阱。该版本在 Windows 下常残留oracle.exe进程在 Linux 下常残留ora_smon_SID进程它们会锁住$ORACLE_HOME/rdbms/admin/下的.patch_storage目录导致 opatch 写入失败。Windows 环境操作以 SIDORCL 为例# 第一步用 SQL*Plus 确认实例状态 sqlplus / as sysdba EOF select status, instance_name from v\$instance; exit EOF # 如果返回 STATUSOPEN 或 MOUNTED强制关闭 sqlplus / as sysdba EOF shutdown abort; startup nomount; alter system checkpoint; shutdown immediate; exit EOF # 第二步用任务管理器或命令行杀净残留进程 tasklist | findstr oracle # 若看到 oracle.exe 或 oradim.exe手动结束 taskkill /f /im oracle.exe taskkill /f /im oradim.exe # 第三步确认服务已停止关键 sc query OracleServiceORCL | findstr STATE # 正确输出应为STATE : 1 STOPPED提示sc query比看服务管理器更可靠因为服务状态可能缓存。若显示4 RUNNING说明实例仍在跑必须重做 shutdown 流程。Linux 环境操作以 ORACLE_SIDorcl 为例# 先切到 oracle 用户 su - oracle # 查看实例是否真关 ps -ef | grep pmon | grep -v grep # 若有输出如 ora_pmon_orcl说明实例未关干净 # 强制清理慎用仅当 shutdown abort 无效时 export ORACLE_SIDorcl sqlplus / as sysdba EOF shutdown abort; exit EOF # 杀光所有 oracle 相关进程注意不要 kill root 或其他用户进程 ps -ef | grep oracle | grep -v grep | awk {print $2} | xargs kill -9 2/dev/null # 再次确认 ps -ef | grep pmon | grep -v grep # 应无输出 # 清理共享内存段Oracle 11g 必做否则重启后报 ORA-27102 ipcs -mt | grep oracle | awk {print $1} | xargs -r ipcrm -m ipcs -st | grep oracle | awk {print $1} | xargs -r ipcrm -s2.2 备份不是“拷个 datafile”四层快照式备份法Oracle 11.2.0.1 不支持闪回数据库Flashback Database一旦补丁损坏控制文件或参数文件RMAN 备份恢复也救不回来。我一般会做四层备份按耗时从短到长排列层级操作命令/方式耗时用途L1OPatch 元数据快照cd $ORACLE_HOME/OPatch zip -r opatch_backup_$(date %Y%m%d).zip .30s恢复 OPatch 工具本身避免opatch命令丢失L2$ORACLE_HOME 完整压缩tar -czf oracle_home_backup_$(date %Y%m%d).tar.gz $ORACLE_HOMELinux7z a oracle_home_backup_%date:~0,4%%date:~5,2%%date:~8,2%.7z %ORACLE_HOME%Windows15–40min回滚整个 Oracle Home代价最大但最保险L3关键配置文件单独拷贝cp $ORACLE_HOME/dbs/spfile*.ora $BACKUP_DIR/cp $ORACLE_HOME/dbs/init*.ora $BACKUP_DIR/cp $ORACLE_HOME/network/admin/listener.ora $BACKUP_DIR/cp $ORACLE_HOME/network/admin/tnsnames.ora $BACKUP_DIR/10s修复监听、启动参数等“小毛病”最快恢复L4数据库冷备份必须关库后xcopy D:\oracle\oradata\ORCL\*.* E:\backup\orcl_cold\ /E /I /YWindowscp -r /u01/app/oracle/oradata/orcl/* /backup/orcl_cold/Linux依赖数据量通常 20min数据文件级恢复唯一能救坏块的手段注意L4 冷备份必须在彻底关库后执行且备份路径不能与$ORACLE_HOME或oradata在同一磁盘分区防止磁盘满导致备份中断。2.3 验 OPatch 版本11.2.0.1 的补丁包只认特定 OPatchOracle 11.2.0.1 自带的 OPatch 是 11.2.0.1.1但它无法安装 2018 年之后发布的多数补丁如 CPUJan2019 及以后。官方要求最低 OPatch 版本为11.2.0.3.20对应 Patch 6880880。如果你直接解压补丁包执行opatch apply报错OPATCH-00008: The patch is not applicable八成是 OPatch 太旧。验证当前 OPatch 版本# Windows %ORACLE_HOME%\OPatch\opatch version # Linux $ORACLE_HOME/OPatch/opatch version若输出为OPatch Version: 11.2.0.1.1必须升级去 Oracle Support 下载 Patch 6880880搜索 “p6880880_112000_WINDOWS.zip” 或 “p6880880_112000_LINUX-x86-64.zip”解压后得到OPatch文件夹替换前先备份原 OPatch# Windows ren %ORACLE_HOME%\OPatch OPatch_bak_112011 xcopy /E /I OPatch_new\OPatch %ORACLE_HOME%\OPatch# Linux mv $ORACLE_HOME/OPatch $ORACLE_HOME/OPatch_bak_112011 cp -r OPatch_new/OPatch $ORACLE_HOME/验证新版本%ORACLE_HOME%\OPatch\opatch version # 应输出 11.2.0.3.20 或更高提示升级 OPatch 不需要重启数据库但必须确保$ORACLE_HOME环境变量已正确设置且当前用户对$ORACLE_HOME/OPatch有读写权限Windows 下常需管理员运行 cmdLinux 下chown oracle:oinstall $ORACLE_HOME/OPatch。3. 打补丁全流程从解压到 succeed 的每一步命令与路径细节3.1 补丁包解压规范路径不能含空格、中文、特殊符号Oracle 11.2.0.1 的 OPatch 对路径极其敏感。曾有同事把补丁解压到D:\补丁\Oracle\p29750384执行opatch apply直接报错OPATCH-00023: Invalid path specified因为 OPatch 内部调用 Java 类加载器时无法解析 UTF-8 路径。正确做法是Windows解压到纯英文短路径如D:\patch\p29750384注意不是D:\patch\p29750384\带尾斜杠Linux解压到/tmp/patch/p29750384绝对不用/home/oracle/我的补丁/这类路径统一要求解压后目录内必须包含etc/、files/、README.txt三个子目录缺一不可可用dir /ad或ls -l验证。验证补丁包完整性关键# Windows需提前安装 certutil certutil -hashfile D:\patch\p29750384.zip SHA256 # 对比 Oracle Support 页面上该补丁的 SHA256 值必须完全一致 # Linux sha256sum /tmp/patch/p29750384.zip提示SHA256 不匹配 补丁包下载损坏强行安装会导致opatch apply中途退出且无日志提示原因。3.2 标准打补丁命令链set → cd → opatch apply → yy这是 Oracle 11.2.0.1 补丁安装的黄金三角命令缺一不可顺序不能乱# Windows 示例以补丁 p29750384 为例 set ORACLE_HOMED:\oracle\product\11.2.0\dbhome_1 cd /d D:\patch\p29750384 %ORACLE_HOME%\OPatch\opatch apply # 此时屏幕会提示 # Do you want to proceed? [y|n] y # 然后问 # Is the local system ready for the patch? [y|n] y # 最后问 # Do you want to shut down the local system? [y|n] n ← 注意这里必须输 n因为我们已经手动关库了 # 接着出现 # Please enter yes to continue, no to abort: yes # 然后开始解压、复制、链接……最后输出 # OPatch succeeded.# Linux 示例以补丁 p30122186 为例 export ORACLE_HOME/u01/app/oracle/product/11.2.0/dbhome_1 cd /tmp/patch/p30122186 $ORACLE_HOME/OPatch/opatch apply # 提示同上关键点 # Is the local system ready for the patch? [y|n] y # Do you want to shut down the local system? [y|n] n ← 必须输 n # Please enter yes to continue, no to abort: yes # 最后输出 # OPatch succeeded.逻辑说明opatch apply默认会尝试自动关库但我们已在第 2 章手动关库若此处输yOPatch 会调用sqlplus / as sysdba执行 shutdown但此时监听未启、实例已死导致连接超时整个流程卡死在Connecting to database...。输n是告诉 OPatch“库我关好了你只管打补丁”。3.3 多补丁顺序执行数字小的先打中间不重启Oracle 官方明确要求补丁编号Patch ID数字小的必须先安装否则依赖关系断裂。例如p297503842019年1月CPUp301221862019年7月CPUp312813552020年1月CPU必须严格按29750384 → 30122186 → 31281355顺序执行不能跳过中间的。每个补丁执行完看到OPatch succeeded.后不要重启数据库也不要执行任何 SQL直接进入下一个补丁目录执行相同命令。为什么因为 Oracle 11.2.0.1 的补丁是“累积式”设计后一个补丁会覆盖前一个补丁的部分.so或.dll文件如果中间重启某些动态链接库可能被旧版本残留进程占用导致下一个opatch apply报错OPATCH-00011: Unable to copy file。验证多补丁顺序是否正确# 打完所有补丁后执行 %ORACLE_HOME%\OPatch\opatch lsinventory | findstr Patch description # 输出应类似 # Patch description: Database Patch Set Update : 11.2.0.1.200114 (30122186) # Patch description: Database Patch Set Update : 11.2.0.1.191015 (29750384) # 注意Patch ID 数字大的排在前面说明安装顺序正确4. 避坑指南五个让 DBA 当场崩溃的真实报错与解法4.1 现象OPATCH-00028: Unable to lock Central Inventory原因OPatch 尝试锁定中央库存Central Inventory时失败常见于多 Oracle Home 共享同一 inventory如/u01/app/oraInventory或 inventory 目录权限不足Linux 下oinstall组无写权限。解决Linuxchown -R oracle:oinstall /u01/app/oraInventorychmod -R 775 /u01/app/oraInventoryWindows右键C:\Program Files\Oracle\Inventory→ 属性 → 安全 → 编辑 → 添加Administrators组并勾选“完全控制”4.2 现象OPATCH-00008: The patch is not applicable原因补丁包与当前 Oracle Home 版本不匹配如给 11.2.0.1.0 打了只支持 11.2.0.1.2 的补丁或 OPatch 版本过低见 2.3 节。解决运行%ORACLE_HOME%\OPatch\opatch version确认 OPatch 版本运行sqlplus / as sysdba→select * from v\$version;确认数据库版本必须是11.2.0.1.0不能是11.2.0.1.2去 Oracle Support 页面核对补丁的 “Interim Patch for” 字段必须包含11.2.0.1.0。4.3 现象ORA-01034: ORACLE not available出现在opatch apply过程中原因OPatch 在安装过程中尝试连接数据库验证即使你输n不关库但监听未启或tnsnames.ora配置错误。解决临时启监听lsnrctl startWindows/Linux 通用检查tnsnames.ora中对应 SID 的HOST是否为localhost不能是机器名或 IP11.2.0.1 对主机名解析极不稳定临时修改listener.ora将HOST your-hostname改为HOST localhost然后lsnrctl reload。4.4 现象OPATCH-00011: Unable to copy file 文件路径如libnnz11.so原因该文件正被某个 oracle 进程占用常见于未彻底 kill 的ora_d000_*或ora_m000_*后台进程。解决Windowstasklist | findstr ora_→taskkill /f /im ora_d000_ORCL.exeLinuxps -ef | grep ora_d000 | grep -v grep | awk {print $2} | xargs kill -9若仍失败重启服务器最后一招但比数据库起不来强。4.5 现象OPatch succeeded.显示成功但opatch lsinventory不显示该补丁原因补丁安装日志中实际有警告Warning但 OPatch 默认不打印只写入日志文件。解决查看日志%ORACLE_HOME%\cfgtoollogs\opatch\opatch日期.logWindows或$ORACLE_HOME/cfgtoollogs/opatch/opatch日期.logLinux搜索WARNING常见原因是conflict with existing patches与已有补丁冲突强制安装仅当确认无冲突时%ORACLE_HOME%\OPatch\opatch apply -force。5. 补丁后验证三步确认法 一个必须跑的 SQL 脚本5.1 第一步用opatch lsinventory看补丁是否真入库这是最基础但最容易被忽略的验证。很多人只看OPatch succeeded.就以为完事结果补丁根本没写进 inventory。# Windows %ORACLE_HOME%\OPatch\opatch lsinventory -detail # Linux $ORACLE_HOME/OPatch/opatch lsinventory -detail关键看三处Oracle Home行必须显示你设置的$ORACLE_HOME路径Invoking fuser on ...行后面应跟No processes using ...表示 inventory 未被占用Patch level下的列表每个补丁应有Patch description、Patch id、Applied on时间且Status为Applied不是Rollback或空。提示若Patch id显示为0或N/A说明补丁未真正应用需检查日志。5.2 第二步启动数据库并验证核心组件版本补丁成功 ≠ 数据库能启动。必须亲自启动并检查组件版本因为有些补丁会更新libnnz11.so加密库或libclntsh.so.11.1客户端库版本不匹配直接报ORA-00600。# Windows 启动 net start OracleServiceORCL # Linux 启动 export ORACLE_SIDorcl sqlplus / as sysdba EOF startup; exit EOF启动后立即执行版本验证 SQL保存为check_patch.sql-- check_patch.sql set linesize 200 col BANNER format a100 select BANNER from v\$version; -- 检查补丁是否生效关键 select ACTION, NAMESPACE, VERSION, ID, COMMENTS from dba_registry_history where ACTIONAPPLY order by ACTION_TIME desc; -- 检查是否有未解决的 invalid object补丁常触发编译 select count(*) from dba_objects where statusINVALID;执行sqlplus / as sysdba check_patch.sql预期输出BANNER行应含Oracle Database 11g Enterprise Edition Release 11.2.0.1.0dba_registry_history应列出你刚打的补丁 ID如30122186和COMMENTS如Database Patch Set Update : 11.2.0.1.200114invalid object计数应为0若 0运行?/rdbms/admin/utlrp.sql重新编译。5.3 第三步跑一个真实业务 SQL验证补丁未破坏功能理论验证再完美不如一条真实 SQL。我固定用以下脚本测三个高危点-- patch_validation.sql -- 测试1加密函数p29750384 修复了 DBMS_CRYPTO.KEY_TYPE_AES128 的密钥长度校验 declare l_key raw(32) : hextoraw(01020304050607080102030405060708); l_data raw(100) : utl_raw.cast_to_raw(test); l_encrypted raw(100); begin l_encrypted : dbms_crypto.encrypt(l_data, dbms_crypto.ENCRYPT_AES128 dbms_crypto.CHAIN_CBC dbms_crypto.PAD_PKCS5, l_key); dbms_output.put_line(AES128 encrypt OK); exception when others then dbms_output.put_line(AES128 encrypt FAIL: || sqlerrm); end; / -- 测试2监听器连接p30122186 修复了 TNS-12537 -- 此处不写 SQL而是用 tnsping 测试 -- tnsping ORCL 应在另一窗口执行 -- 测试3数据泵导出p31281355 修复了 expdp 在大表上的 ORA-31693 -- expdp / as sysdba directoryDATA_PUMP_DIR dumpfiletest.dmp tablesscott.emp logfileexp.log -- 此步可选但建议抽样一个业务表导出从那以后我每次打完 Oracle 11.2.0.1 补丁都强制走一遍这三步opatch lsinventory看入库、sqlplus跑check_patch.sql看组件、dbms_crypto脚本测核心功能。少一步第二天凌晨三点的告警电话就来了。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑