Fork me on GitHub

Oracle11g补丁

Oracle环境

Centos7.6.1810
Docker version 20.10.21
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

Oracle补丁类型

  1. Oracle CPU全称Critical Patch Update;
    Oracle官方每个季度会对Oracle产品发行一次安全补丁包,通常为了修复产品中安全隐患。

  2. Oracle PSU全称是Patch Set Update,是每季度发行一次补丁包,包含了bug的修复。
    Oracle选取被用户下载数量多,且被验证过具有较低风险的补丁放入到每个季度的PSU中。
    每个PSU中不但包含Bug的修复,且还包含了最新的CPU。PSU通常随CPU一起发布。

CPU是累积的(Cumulative),即最新的CPU补丁已经包含以往的CPU补丁,只要安装最新的CPU补丁即可。

PSU通常也是增量的,大部分PSU可直接安装,也有特殊情况,有些PSU必须先安装了上一版本的PSU后,才能继续安装后续的PSU;具体看PSU的Readme文档。
文档中如果有Cumulative的字样,则可以直接进行安装了。

检查Oracle版本信息

-- 查看数据库版本信息
select * from v$version;
-- 查看数据库已经安装的组件
select comp_id,status,version from dba_registry
-- 查看已打补丁数据字典
select * from dba_registry_history;

根据数据库版本信息,以及打补丁情况,确定升级打补丁的路线。
如果是32位的Oracle,需重装成64位的Oracle。
如果是小于11.2.0.4的版本,则需要先升级到11.2.0.4的版本。
如果是已经打过补丁的11.2.0.4版本,则需要先回滚旧补丁后,再安装新的补丁。
如果是未打过补丁的11.2.0.4版本,那么直接打补丁即可。

Oracle11.2.0.1升级至11.2.0.4

下载文件并解压上传

升级Oracle11.2.0.1到11.2.0.4
http://ops.daqsoft.com/m/server/oracle/linux/11.2.4/
下载如下两个文件
p13390677_112040_Linux-x86-64_1of7.zip
p13390677_112040_Linux-x86-64_2of7.zip
image

#将两个docker从centos7.6中拷贝到docker环境中
docker cp /root/p13390677_112040_Linux-x86-64_1of7.zip oracle:/home/oracle
docker cp /root/p13390677_112040_Linux-x86-64_2of7.zip oracle:/home/oracle

#解压文件
docker exec -it oracle /bin/bash  #进入到名为oracle的容器环境中
cd /home/oracle
unzip p13390677_112040_Linux-x86-64_1of7.zip
unzip p13390677_112040_Linux-x86-64_2of7.zip
#解压完毕后出现database文件夹
cd ./database

image

查看oracle环境变量

cat ~/.bash_profile

image
此时环境变量是ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_2;

升级前备份

升级前做数据库的完全备份,备份内容包括数据文件,控制文件,归档文件,日志文件,参数文件,密码文件等。
可以备份一下整个ORACLE_HOME目录,如果升级有问题,还可以还原回来。备份的方法可以使用dump数据泵,tar,rman等。

#以root身份进入容器
docker exec -it --user root oracle bash

#备份ORACLE_HOME和oraInventory,直接打包ORACLE_BASE目录
tar -zcvPf oracle11_2_0_1.tar.gz /home/oracle/app/oracle >/dev/null

#Rman全备
rman target /
backup database format '/home/oracle/rmanbak/df_%t_%s_%p.bak';

通常情况需备份以下目录
/home/oracle/app/oracle
/home/oracle/app/oraInventory(安装清单)
/home/oracle/app/grid
/home/oracle/app/11.2.0/grid

安装11.2.0.4软件升级包

sqlplus / as sysdba
#关闭数据库监听,这里一定要等待关闭完成
shutdown immediate
quit
#退出数据库,关闭数据库监听
lsnrctl stop
netstat -an|grep 1521
#关闭em
emctl stop dbconsole
netstat -an|grep 1158

chown -R oracle:oinstall ./database/

# 安装补丁
# ORACLE_BASE、ORACLE_HOME、INVENTORY_LOCATION从~/.bash_profile中查看并修改ORACLE_HOME和INVENTORY_LOCATION
./runInstaller -silent -debug -force -ignorePrereq \
DECLINE_SECURITY_UPDATES=true \
oracle.install.option=INSTALL_DB_SWONLY \
UNIX_GROUP_NAME=oinstall \
INVENTORY_LOCATION=/home/oracle/app/oraInventory11.2.0.4 \
ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0.4/dbhome_2 \
ORACLE_BASE=/home/oracle/app/oracle \
oracle.install.db.InstallEdition=EE \
oracle.install.db.DBA_GROUP=dba \
oracle.install.db.OPER_GROUP=oinstall

说明:ORACLE_BASE可以和老版本共用一个目录
INVENTORY_LOCATION指向新目录oraInventory11.2.0.4,以前是oraInventory。
ORACLE_HOME指向新目录11.2.0.4/dbhome_2(备注:以前是11.2.0/db_1)。
安装过程中有警告[WARNING] 时需要安装一些i386 包。查看log安装即可。
image

使用老的oraInventory会报错
image

执行提示的sh文件

#出现Successfully Setup Software即成功,根据提示切换root账号执行给出的sql
su root
#或以root身份进入容器
docker exec -it --user root oracle bash
/home/oracle/app/oraInventory11.2.0.4/orainstRoot.sh
/home/oracle/app/oracle/product/11.2.0.4/dbhome_2/root.sh
#执行完sh立马退出root用户!!! 忘记退出会导致修改root的环境变量(oracle环境变量还是没变!!!)
su oracle

配置环境变量

修改配置文件

#修改/etc/oratab中的ORACLE_HOME目录
vi /etc/oratab
#改为helowin:/home/oracle/app/oracle/product/11.2.0.4/dbhome_2:Y

修改环境变量

su oracle  #一定要保证修改环境变量时使用正确账户
#配置新环境变量
vi ~/.bash_profile
#修改新的ORACLE_HOME目录,$ORACLE_BASE/product/11.2.0/dbhome_2改为$ORACLE_BASE/product/11.2.0.4/dbhome_2 \

#使环境变量生效
source ~/.bash_profile
#查看环境变量
env |grep ORACLE

~/.bash_profile中ORACLE环境变量内容

# ORACLE_BASE
ORACLE_BASE=/home/oracle/app/oracle;export ORACLE_BASE
# ORACLE_HOME
ORACLE_HOME=$ORACLE_BASE/product/11.2.0.4/dbhome_2;export ORACLE_HOME
# ORACLE_SID
ORACLE_SID=helowin;export ORACLE_SID

image

参数文件拷贝

#进入到老版本的/product/11.2.0/dbhome_2/dbs下面
cd $ORACLE_BASE/product/11.2.0/dbhome_2/dbs
#查看新版本dbs下面的参数文件
ls $ORACLE_BASE/product/11.2.0.4/dbhome_2/dbs
#拷贝dbs到新版本中
cp -a * $ORACLE_BASE/product/11.2.0.4/dbhome_2/dbs

image

监听文件拷贝

#进入到老版本的/product/11.2.0/dbhome_2/network/admin下面
cd $ORACLE_BASE/product/11.2.0/dbhome_2/network/admin
#查看新版本的监听文件
ls $ORACLE_BASE/product/11.2.0.4/dbhome_2/network/admin
#拷贝监听文件到新版本中
cp -a * $ORACLE_BASE/product/11.2.0.4/dbhome_2/network/admin

启动监听

lsnrctl start

image

catupgrd.sql升级数据库

退出oracle用户重新su - oracle,sqlplus能看到11.2.0.4.0字样

# 退出再重新进入oracle账号
su - oracle

sqlplus / as sysdba

#数据库启动为升级模式
startup upgrade

#instance的升级脚本,确保执行前$ORACLE_HOME环境变量已经修改并生效,此脚本在该库无数据的情况下耗时15min
@$ORACLE_HOME/rdbms/admin/catupgrd.sql
#catupgrd.sql脚本执行完后会shutdown immediate数据库,重启数据库即可

image
image

编译失效对象

#启动数据库
sqlplus / as sysdba
startup
select * from v$version;

#查询编译失效对象,显示四百多
select * from dba_objects where status !='VALID';
select count(*) from dba_objects where status='INVALID';
#运行utlrp.sql编译失效对象
@$ORACLE_HOME/rdbms/admin/utlrp.sql

image
utlrp.sql执行后如图
image
utlrp.sql执行后再查询编译失效对象显示为0
image

重启数据库

重启数据库没有问题就是升级成功。

shutdown immediate
startup

image
再次检验数据库版本

select * from v$version;
select * from dba_registry_history;
select comp_id,status,version from dba_registry;

image
image
image

Oracle 11.2.0.4安装PSU补丁

下载补丁包

p30670774_112040_Linux-x86-64.zip:数据库补丁
p6880880_112000_Linux-x86-64.zip:opatch升级包

#拷贝补丁到服务器中的docker下面
docker cp ~/p30670774_112040_Linux-x86-64.zip oracle:/home/oracle
docker cp ~/p6880880_112000_Linux-x86-64.zip oracle:/home/oracle

查看当前OPatch

#进入OPatch文件夹,如果找不到source ~/.bash_profile
cd $ORACLE_HOME/OPatch
#查看oracle当前OPatch版本
./opatch -help
#查看oracle安装过的补丁
./opatch lsinventory

升级opatch

opatch的升级只要将新版本的包解压,覆盖系统原始的文件即可。

cd $ORACLE_HOME

#将Opatch备份
mv OPatch OPatch.bak

#解压新的Opatch到oracle下面
unzip p6880880_112000_Linux-x86-64.zip -d $ORACLE_HOME

检查待安装补丁

因为环境是再dockers下安装的Oracle,所以要先把补丁文件拷贝到docker容器中.

cd /home/oracle
#解压后文件名为30670774
unzip p30670774_112040_Linux-x86-64.zip
#将目录权限修改为oracle组
chown oracle:oinstall -R 30670774/
#进入目录
cd 30670774/
#切换用户
su - oracle
#执行冲突检测
$ORACLE_HOME/OPatch/opatch prereq CheckConflictAgainstOHWithDetail -ph ./

检测成功
image

检测到冲突,找不到oraInst.loc文件,可以指明oraInst.loc文件的绝对路径来执行相应的命令
-invPtrLoc /opt/oracle/product/11g/db/oraInst.loc

$ORACLE_HOME/OPatch/opatch prereq CheckConflictAgainstOHWithDetail -invPtrLoc /opt/oracle/product/11g/db/oraInst.loc -ph ./

检测冲突
image

数据库备份

为数据库做冷备份 (如果不考虑安全性,这步可以省略,有点点风险),使用root用户备份oracle_home (将#ORACLE_HOME上级目录整个备份)

su - root
tar -zcvpf db_20230331.tar.gz $ORACLE_HOME/
su oracle

打补丁

单实例环境关闭当前ORACLE_HOME下的所有实例和监听。否则会报错

sqlplus / as sysdba
#关闭数据库监听,这里一定要等待关闭完成
shutdown immediate
quit
#退出数据库,关闭数据库监听
lsnrctl stop

#进入到补丁文件夹
cd 30670774/
#apply 安装补丁 [-invPtrLoc $ORACLE_HOME/oraInst.loc]
$ORACLE_HOME/OPatch/opatch apply

#查看补丁情况
$ORACLE_HOME/OPatch/opatch lsinventory

安装成功界面
image
查看补丁情况会出现大量补丁
image

启动数据库

#启动数据库
sqlplus / as sysdba
startup
#执行catbundle.sql文件
@$ORACLE_HOME/rdbms/admin/catbundle.sql psu apply
quit
#启动监听
lsnrctl start

catbundle.sql执行结果如下
image

-- 检查补丁情况,发现多了个apply类型的第五位升级11.2.0.4 -> 11.2.0.4.200414
select * from dba_registry_history;

image

参考:
https://www.modb.pro/db/397406
https://www.bilibili.com/read/cv18977940?from=search
https://cjiayang.github.io/2020/07/10/oracle-Opatch/
https://www.integrigy.com/oracle-security-blog/cpu-psu-spu-oracle-critical-patch-update-terminology-update

posted @ 2023-04-02 15:57  秋夜雨巷  阅读(296)  评论(0编辑  收藏  举报