Oracle 补丁应用与 PSU
Oracle 补丁应用与 PSU
适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
Oracle 补丁类型[1]:
类型:
- Release Update (RU)
- Release Update Revision (RUR)
- One-off Patch
- CPU(Critical Patch Update)
2. 补丁类型
2.1 RU(19c+)
- 季度发布
- 包含 bug 修复
- 推荐应用
2.2 RUR
- RU 修订版
- 仅 bug 修复
2.3 One-off
- 单一 bug
- 临时补丁
2.4 CPU
- 安全补丁
- 集成到 RU
3. 准备
3.1 下载
https://support.oracle.com
3.2 OPatch 升级
# 1. 备份旧 OPatch
mv $ORACLE_HOME/OPatch $ORACLE_HOME/OPatch.old
# 2. 解压新版
unzip p6880880_Linux-x86-64.zip -d $ORACLE_HOME/
# 3. 验证
$ORACLE_HOME/OPatch/opatch version
3.3 检查冲突
$ORACLE_HOME/OPatch/opatch prereq CheckConflictAgainstOHWithDetail -ph /tmp/XXXXXX
4. 应用 RU
4.1 GI + DB(合并补丁)
# root 用户
opatchauto apply /tmp/XXXXXX
4.2 仅 DB
# 1. 关闭数据库
srvctl stop database -db orcl
# 2. 应用
cd /tmp/XXXXXX
$ORACLE_HOME/OPatch/opatch apply -silent
# 3. 启动
srvctl start database -db orcl
4.3 仅 GI
# root
opatchauto apply /tmp/XXXXXX -oh /u01/app/19.0.0/grid
5. 应用 One-off
5.1 关闭
# 单实例
sqlplus / as sysdba
SQL> SHUTDOWN IMMEDIATE;
SQL> EXIT;
lsnrctl stop
5.2 应用
cd /tmp/PATCH_DIR
$ORACLE_HOME/OPatch/opatch apply
5.3 启动
lsnrctl start
sqlplus / as sysdba
SQL> STARTUP;
6. 数据字典补丁
6.1 datapatch
# 应用补丁后
cd $ORACLE_HOME/OPatch
./datapatch -verbose
6.2 验证
SQL> SELECT * FROM dba_registry_sqlpatch;
SQL> SELECT patch_id, status, action_time FROM dba_registry_sqlpatch;
7. RAC 应用
7.1 滚动升级
# 节点 1
srvctl stop instance -db orcl -instance orcl1
opatch apply
# 节点 2
srvctl stop instance -db orcl -instance orcl2
opatch apply
7.2 验证
# 各节点
$ORACLE_HOME/OPatch/opatch lsinventory
8. 回滚
8.1 回滚补丁
cd /tmp/XXXXXX
$ORACLE_HOME/OPatch/opatch rollback -id <patch_id>
8.2 datapatch
./datapatch -verbose
9. 验证
9.1 Inventory
$ORACLE_HOME/OPatch/opatch lsinventory
$ORACLE_HOME/OPatch/opatch lsinventory -all
9.2 数据库
SQL> SELECT * FROM dba_registry_sqlpatch;
SQL> SELECT version, status FROM dba_registry;
SQL> SELECT * FROM v$version;
10. OPlan
10.1 计划
# 推荐顺序
$ORACLE_HOME/OPatch/oplan/oplan install /tmp/XXXXXX
10.2 报告
cat /tmp/XXXXXX/oplan_results/apply_plan.html
11. 自动化脚本
#!/bin/bash
# apply_patch.sh
PATCH_DIR=$1
# 1. 关闭
echo "Stopping Oracle..."
su - oracle -c "
sqlplus / as sysdba <<EOF
SHUTDOWN IMMEDIATE;
EXIT;
EOF
"
# 2. 应用
echo "Applying patch..."
su - oracle -c "
cd $PATCH_DIR
\$ORACLE_HOME/OPatch/opatch apply -silent
"
# 3. 启动
echo "Starting Oracle..."
su - oracle -c "
sqlplus / as sysdba <<EOF
STARTUP;
EXIT;
EOF
"
# 4. datapatch
echo "Running datapatch..."
su - oracle -c "
cd \$ORACLE_HOME/OPatch
./datapatch -verbose
"
echo "Done."
12. 常见坑与排错
12.1 冲突
# 1. 检查冲突
opatch prereq CheckConflictAgainstOHWithDetail -ph ...
# 2. 解决
# - 回滚冲突补丁
# - 联系 Oracle Support
12.2 OCM 缺失
# 创建 OCM 响应文件
$ORACLE_HOME/OPatch/ocm/bin/emocmrsp -output /tmp/ocm.rsp
# 应用
opatch apply -ocmrf /tmp/ocm.rsp
12.3 空间不足
# 检查 ORACLE_HOME 空间
df -h $ORACLE_HOME
# 清理旧补丁
opatch util cleanup
13. 最佳实践
- 测试环境先:验证
- OPatch 最新:兼容
- CVU 检查:准备
- 备份 ORACLE_HOME:回滚
- 关闭数据库:安全
- datapatch:数据字典
- 验证:完整性
- 滚动升级:RAC
- 业务低峰:影响小
- 文档化:记录
14. 参考资料
[1] Oracle Database Patching Guide 19c https://docs.oracle.com/en/database/oracle/oracle-database/19/ARPLN/