数据库升级、打补丁是我们经常面对的日常工作内容。在正常情况下,两个因素是我们必须要考虑的问题:停机时间窗和回退方案。就Oracle而言,即便是最简单的更新操作,都难以做到“零停机”。回退方案是在一旦发现新版本存在问题,迅速的回退到原有的版本,支持应用访问。
目前,Oracle推荐两种大规模升级的方法:In-Place和Out-of-Place。In Place升级方法下,升级动作直接在原有的Database Home目录下。Out-of-Place则是选择了一个新的Oracle Database Home目录。相对于In place策略,Out-of-Place在空间上需要更多的消耗。
但是,Out-of-Place的好处也是比较明显的,首先是可以比较方便的进行回退,同时在Downtime停机时间上,也有比较强的优势。
Out-of-Place支持Oracle大版本和Patch两种操作方式,本文主要介绍使用Out-Of-Place方法打补丁Patch方法。
1、环境介绍
选择Oracle 11gR2进行测试,版本为11.2.0.4基础版。
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE 11.2.0.4.0 Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 – Production
环境变量情况如下:
[oracle@testlife OPatch]$ env | grep ORA
ORACLE_SID=testdb
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
目标是在当前版本基础上,使用最新的PSU补丁文件。
2、补丁操作
升级OPatch工具。Oracle默认自带的OPatch通常是不能满足补丁要求的,比较稳妥的手段是到MOS上下载最新的OPatch升级包,替代原有的程序。
[oracle@testlife upload]$ cp p6880880_112000_Linux-x86-64.zip $ORACLE_HOME
[oracle@testlife upload]$ cd $ORACLE_HOME
[oracle@testlife dbhome_1]$ mv OPatch OPatch_BAK
[oracle@testlife dbhome_1]$ unzip p6880880_112000_Linux-x86-64.zip
Archive: p6880880_112000_Linux-x86-64.zip
creating: OPatch/
inflating: OPatch/opatch.bat
inflating: OPatch/operr.bat
(篇幅原因,有省略……)
[oracle@testlife dbhome_1]$ cd OPatch
[oracle@testlife OPatch]$ ./opatch lsinventory
Oracle Interim Patch Installer version 11.2.0.3.10
Copyright (c) 2016, Oracle Corporation. All rights reserved.
Oracle Home : /u01/app/oracle/product/11.2.0/dbhome_1
Central Inventory : /u01/app/oraInventory
from : /u01/app/oracle/product/11.2.0/dbhome_1/oraInst.loc
OPatch version : 11.2.0.3.10
OUI version : 11.2.0.4.0
在升级过程中,会有两套Oracle环境变量切换的动作,为避免出现问题,可以设置两套ORACLE_HOME环境变量,根据不同的情况进行切换。
[oracle@testlife OPatch]$ cd ~
[oracle@testlife ~]$ export ORACLE_OWNER_GROUP=oracle:dba
[oracle@testlife ~]$ export ORACLE_BASE=$ORACLE_BASE
[oracle@testlife ~]$ export O_ORACLE_HOME=$ORACLE_HOME –Original Oracle Home
[oracle@testlife ~]$ export O_ORACLE_HOME_NAME=`grep OHOMENAME= $O_ORACLE_HOME/oui/bin/attachHome.sh | cut -f2 -d=`
[oracle@testlife ~]$ export C_ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1_clone –Clone Environment
[oracle@testlife ~]$ export C_ORACLE_HOME_NAME=clone
[oracle@testlife ~]$ env | grep ORA
C_ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1_clone
ORACLE_OWNER_GROUP=oracle:dba
ORACLE_SID=testdb
ORACLE_BASE=/u01/app/oracle
C_ORACLE_HOME_NAME=clone
O_ORACLE_HOME_NAME=OraDb11g_home1
ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
O_ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
下面,使用原有数据库克隆新的环境Clone数据库。
--目录创建
[oracle@testlife ~]$ cd /
[oracle@testlife /]$ mkdir $C_ORACLE_HOME
[oracle@testlife /]$ chown $ORACLE_OWNER_GROUP $C_ORACLE_HOME
[oracle@testlife dbhome_1]$ pwd
/u01/app/oracle/product/11.2.0/dbhome_1
[oracle@testlife dbhome_1]$ ls -l | grep dbhome
[oracle@testlife dbhome_1]$ cd ..
[oracle@testlife 11.2.0]$ ls -l | grep dbhome
drwxr-xr-x. 75 oracle oinstall 4096 Oct 18 17:52 dbhome_1
drwxr-xr-x 2 oracle dba 4096 Oct 18 18:07 dbhome_1_clone
[oracle@testlife 11.2.0]$ cd $O_ORACLE_HOME
[oracle@testlife dbhome_1]$ tar cfp - . | (cd $C_ORACLE_HOME; tar xf - )
tar: ./bin/nmo: Cannot open: Permission denied
tar: ./bin/nmb: Cannot open: Permission denied
tar: ./bin/nmhs: Cannot open: Permission denied
tar: Exiting with failure status due to previous errors
[oracle@testlife dbhome_1]$
使用clone.pl脚本创建全新的Clone数据库。
[oracle@testlife dbhome_1]$ export ORACLE_HOME=$C_ORACLE_HOME –Clone数据库目录
[oracle@testlife dbhome_1]$ perl $ORACLE_HOME/clone/bin/clone.pl \
> ORACLE_BASE=$ORACLE_BASE \
> ORACLE_HOME=$C_ORACLE_HOME \
> ORACLE_HOME_NAME=$C_ORACLE_HOME_NAME
./runInstaller -clone -waitForCompletion "ORACLE_BASE=/u01/app/oracle" "ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1_clone" "ORACLE_HOME_NAME=clone" -silent -noConfig -nowait
Starting Oracle Universal Installer...
Checking swap space: must be greater than 500 MB. Actual 7967 MB Passed
Preparing to launch Oracle Universal Installer from /tmp/OraInstall2016-10-18_06-13-35PM. Please wait ...Oracle Universal Installer, Version 11.2.0.4.0 Production
Copyright (C) 1999, 2013, Oracle. All rights reserved.
You can find the log of this install session at:
/u01/app/oraInventory/logs/cloneActions2016-10-18_06-13-35PM.log
.................................................................................................... 100% Done.
Installation in progress (Tuesday, October 18, 2016 6:13:56 PM CST)