Oracle11g补丁
Oracle环境
Centos7.6.1810
Docker version 20.10.21
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
Oracle补丁类型
-
Oracle CPU全称Critical Patch Update;
Oracle官方每个季度会对Oracle产品发行一次安全补丁包,通常为了修复产品中安全隐患。 -
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
#将两个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
查看oracle环境变量
cat ~/.bash_profile
此时环境变量是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安装即可。
使用老的oraInventory会报错
执行提示的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
参数文件拷贝
#进入到老版本的/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
监听文件拷贝
#进入到老版本的/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
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数据库,重启数据库即可
编译失效对象
#启动数据库
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
utlrp.sql执行后如图
utlrp.sql执行后再查询编译失效对象显示为0
重启数据库
重启数据库没有问题就是升级成功。
shutdown immediate
startup
再次检验数据库版本
select * from v$version;
select * from dba_registry_history;
select comp_id,status,version from dba_registry;
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 ./
检测成功
检测到冲突,找不到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 ./
检测冲突
数据库备份
为数据库做冷备份 (如果不考虑安全性,这步可以省略,有点点风险),使用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
安装成功界面
查看补丁情况会出现大量补丁
启动数据库
#启动数据库
sqlplus / as sysdba
startup
#执行catbundle.sql文件
@$ORACLE_HOME/rdbms/admin/catbundle.sql psu apply
quit
#启动监听
lsnrctl start
catbundle.sql执行结果如下
-- 检查补丁情况,发现多了个apply类型的第五位升级11.2.0.4 -> 11.2.0.4.200414
select * from dba_registry_history;
参考:
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
![微信公众号二维码](https://images.cnblogs.com/cnblogs_com/aeolian/1679458/o_wechat_gzh_qrcode.jpg)