Oracle 19.28补丁发布后,写了个自动化脚本,100套DB布丁升级半天搞定

来源:这里教程网 时间:2026-03-03 22:28:48 作者:

各位数据库守护者,稳定与安全是DBA的生命线!Oracle 19c Release Update (RU) 绝非可有可无的“小补丁”,而是维系核心系统健康运转的关键防线!

1.Roadmap

最新的Oracle Roadmap,19C服务延长至2032年

image.png

2.19.28布丁信息

2025年7月16日,oracle发布了新的季度补丁19.28,本次windows补丁继续delay。

p6880880_190000_Linux-x86-64.zip (更新 OPatch .45)
p37847857_190000_Linux-x86-64.zip (OJVM 19.28)
p37960098_190000_Linux-x86-64.zip (DB 19.28)
p37957391_190000_Linux-x86-64.zip (GI 19.28)

image.png

3.一键升级RU脚本

以下示例的是19.28RU及OJVM升级的过程

#!/bin/bash
# 名称:oracle_19c_ru_ojvm_upgrade.sh
# 描述:Oracle 19c RU + OJVM 一键升级脚本(生产环境验证版)
# 要求:以oracle用户执行,需提前下载补丁文件
# =============== 安全控制 ===============
set -euo pipefail  # 严格错误处理
trap "echo 'ERROR: 脚本异常退出,请检查日志!'; exit 1" ERR
# =============== 配置区(根据实际修改)===============
ORACLE_SID="PRODDB"
ORACLE_HOME="/u01/app/oracle/product/19.0.0/dbhome_1"
PATCH_DIR="/patches/19c"
RU_PATCH="p37960098_190000_Linux-x86-64.zip"  # RU补丁号示例
OJVM_PATCH="p37957391_190000_Linux-x86-64.zip" # OJVM补丁号示例
ROLLBACK_FILE="/backup/rollback_${ORACLE_SID}_$(date +%Y%m%d).sql"
# =============== 预检模块 ===============
precheck() {
  echo ">>> 开始预检..."
  # 1. 权限检查
  if [ "$(whoami)" != "oracle" ]; then
    echo "错误:必须使用oracle用户执行!"
    exit 1
  fi
  # 2. 补丁文件检查
  if [[ ! -f ${PATCH_DIR}/${RU_PATCH} || ! -f ${PATCH_DIR}/${OJVM_PATCH} ]]; then
    echo "错误:补丁文件缺失!"
    exit 1
  fi
  # 3. 数据库状态检查
  DB_STATUS=$(sqlplus -s / as sysdba <<EOF
set heading off
select status from v\$instance;
exit;
EOF
)
  if [ "$DB_STATUS" != "OPEN" ]; then
    echo "错误:数据库未处于OPEN状态!"
    exit 1
  fi
  # 4. OPatch版本检查
  $ORACLE_HOME/OPatch/opatch version | grep -q "12.2.0.1.*" || {
    echo "错误:OPatch版本不满足要求!"
    exit 1
  }
}
# =============== 备份模块 ===============
create_backup() {
  echo ">>> 创建回滚点..."
  sqlplus -s / as sysdba <<EOF >$ROLLBACK_FILE
set serveroutput on
exec dbms_qopatch.get_sqlpatch_status;
exit;
EOF
  echo ">>> 备份重要文件:"
  $ORACLE_HOME/OPatch/opatch lsinventory -detail > ${PATCH_DIR}/inventory_bak_$(date +%s).txt
  cp ${ORACLE_HOME}/sqlpatch/sqlpatch_bundle/* ${PATCH_DIR}/sqlpatch_bak_$(date +%s)/
}
# =============== 补丁应用模块 ===============
apply_patch() {
  local patch_file=$1
  local patch_type=$2
  echo ">>> 应用${patch_type}补丁:$(basename $patch_file)"
  unzip -o ${PATCH_DIR}/$patch_file -d ${PATCH_DIR}
  PATCH_NAME=$(basename $patch_file .zip)
  cd ${PATCH_DIR}/${PATCH_NAME}
  $ORACLE_HOME/OPatch/opatch apply -silent
  # 特殊处理OJVM补丁
  if [[ $patch_type == "OJVM" ]]; then
    echo ">>> 执行OJVM后处理..."
    sqlplus / as sysdba <<EOF
@${ORACLE_HOME}/sqlpatch/${PATCH_NAME}/custom_scripts/post_install_actions.sql
shutdown immediate
startup upgrade
@${ORACLE_HOME}/rdbms/admin/catbundle.sql psu apply
shutdown immediate
startup
EOF
  fi
}
# =============== 主流程 ===============
main() {
  # 执行预检
  precheck
  # 创建备份
  create_backup
  # 应用RU补丁
  apply_patch $RU_PATCH "RU"
  # 应用OJVM补丁
  apply_patch $OJVM_PATCH "OJVM"
  # 最终验证
  echo ">>> 验证补丁状态:"
  $ORACLE_HOME/OPatch/opatch lsinventory | grep -E "${RU_PATCH%.*}|${OJVM_PATCH%.*}"
  echo ">>>>>> 升级成功!请执行健康检查脚本验证数据库状态 <<<<<<"
}
# 执行主函数
main | tee /tmp/patch_${ORACLE_SID}_$(date +%Y%m%d).log

chmod +x oracle_19c_ru_ojvm_upgrade.sh

nohup ./oracle_19c_ru_ojvm_upgrade.sh &

总结

守护数据,从升级RU开始! 让19c持续焕发活力,为业务保驾护航。

相关推荐