使用OUT-OF-PLACE的方式应用Exadata的Bundle Patch

原文链接:http://www.dbaleet.org/apply_exadata_bp_via_out_of_place_approach/

在之前介绍Oplan这篇文章中,提到了Oplan会根据客户当前系统的实际情况,生成可执行的补丁方案,以下介绍的就是oplan生成的使用clone方式应用Exadata BP的例子。

一般情况下,我们都可以使用rolling的方式应用Exadata的bundle patch,因为这样无需停机窗口。如果允许很小的停机窗口,则可以考虑使用clone的方式来应用Exadata的Bundle Patch,这就是所谓的out-of-place的升级方式(看来out-of-place的方式是大势所趋呀)。out-of-place的方式最大的优势是能将升级/补丁的风险降到最低,一旦升级/补丁失败,则只需切换环境变量就能做到立即回滚。并且OUT-OF-PLACE升级/打补丁前期的准备工作都可以在线完成。相比rolling的方式,其不足之处在于需要停机,即使所需的停机窗口很短。另外需要本地文件系统需要保留足够的空间。

以下为一个Exadata上应用BP10(patch#14662263)的过程:

原始版本 目标版本
GI版本 11.2.0.3 BP3 11.2.0.3 BP10
RDBMS版本 11.2.0.3 BP3 11.2.0.3 BP10
GI ORACLE_HOME /01/app/11.2.0.3/grid /01/app/11.2.0.3/grid_2
RDBMS ORACLE_HOME /u01/app/oracle/product/11.2.0.3/dbhome_1 /u01/app/oracle/product/11.2.0.3/dbhome_2
LISTENER ORACLE_HOME /u01/app/11.2.0.3/grid /u01/app/11.2.0.3/grid_2
1) 开始clone前的一些准备工作:

1. 备份/u01/app/oraInventory目录;
2. 下载BP10的patch 14662263,并使用oracle用户将其上传到/tmp/patches目录下;
3. 将/opt/oracle.SupportTools/onecommand拷贝到/root, /home/grid, /home/oracle目录下;
4. 下载最新opatch(patch# 6880880), 并且更新到所有节点;

[oracle@dm01db01 ~] dcli -g ~/dbs_group -l oracle -f /tmp/patches/p6880880_112000_Linux-x86-64.zip -d /tmp/p6880880_112000_Linux-x86-64.zip
[grid@dm01db01 ~]dcli -g ~/dbs_group -l grid unzip -oqu -d /u01/app/11.2.0.3/grid/Opatch /tmp/p6880880_112000_Linux-x86-64.zip
[oracle@dm01db01 ~]dcli -g ~/dbs_group -l oracle unzip -oqu -d /u01/app/oracle/product/11.2.0.3/dbhome_1/Opatch /tmp/p6880880_112000_Linux-x86-64.zip

5. 将patch分发到所有的DB节点;

[oracle@dm01db01 ~] dcli -g ~/dbs_group -l oracle -f /tmp/patches/p14662263_112030_Linux-x86-64.zip -d /tmp/p14662263_112030_Linux-x86-64.zip
[oracle@dm01db01 ~]dcli -g ~/dbs_group -l oracle unzip -oqu -d /tmp /tmp/p14662263_112030_Linux-x86-64.zip

5.察看当前的patch level;

[oracle@dm01db01 ~]$ export ORACLE_HOME=/u01/app/11.2.0.3/grid
[grid@dm01db01 ~]$ dcli -g ~/dbs_group -l oracle $ORACLE_HOME/OPatch/opatch lsinventory -invPtrLoc $ORACLE_HOME/oraInst.loc -oh $ORACLE_HOME

6. 查看GI和RDBMS二进制文件的占用空间和/u01文件系统的可用空间;

[root@dm01db01 ~]dcli -g ~/dbs_group -l root du -skh /u01/app/11.2.0.3/grid
[root@dm01db01 ~]dcli -g ~/dbs_group -l root du -skh /u01/app/oracle/product/11.2.0.3/dbhome_1
[root@dm01db01 ~]dcli -g ~/dbs_group -l root df -h /u01
2) 对GI进行clone:

1. 创建一个新的GI的ORACLE_HOME, 然后将原始的ORACLE_HOME使用tar打包,然后解压到新的ORACLE_HOME;

[grid@dm01db01 ~]export ORACLE_HOME=/u01/app/11.2.0.3/grid_2
[grid@dm01db01 ~]dcli -g ~/dbs_group -l root mkdir $ORACLE_HOME
[grid@dm01db01 ~]dcli -g ~/dbs_group -l root chown oracle:oinstall $ORACLE_HOME
[grid@dm01db01 ~]dcli -g ~/dbs_group -l root "cd /u01/app/11.2.0.3/grid; tar cfp - . | ( cd $ORACLE_HOME ; tar xf - )"

2. 对新的ORACLE_HOME的GI进行解锁;

[grid@dm01db01 ~]export ORACLE_HOME=/u01/app/11.2.0.3/grid_2
[grid@dm01db01 ~]dcli -g ~/dbs_group -l root /usr/bin/perl $ORACLE_HOME/OPatch/crs/patch112.pl -unlock -desthome=$ORACLE_HOME

3.运行clone.pl脚本进行克隆;

[grid@dm01db01 ~]export ORACLE_HOME=/u01/app/11.2.0.3/grid_2
[grid@dm01db01 ~]/usr/bin/perl $ORACLE_HOME/clone/bin/clone.pl ORACLE_BASE=/u01/app/oracle \
ORACLE_HOME=$ORACLE_HOME ORACLE_HOME_NAME=Ora11g_gridinfrahome1_2 \
INVENTORY_LOCATION=/u01/app/oraInventory -O'"CLUSTER_NODES={dm01db01,dm01db02, dm01db03, dm01db04}"' \
-O'"LOCAL_NODE=dm01db01"' CRS=false -O"SHOW_ROOTSH_CONFIRMATION=false"

4. relink oracle二进制文件使其能使用RDS协议;

[grid@dm01db01 ~]export ORACLE_HOME=/u01/app/11.2.0.3/grid_2
[grid@dm01db01 ~]dcli -g ~/dbs_group -l oracle "cd $ORACLE_HOME/rdbms/lib; ORACLE_HOME=$ORACLE_HOME \
make -f ins_rdbms.mk ipc_rds ioracle"
3) 使用常规的方式对新的GI的ORACLE_HOME应用patch(略)
4) 切换到新的GI ORACLE_HOME

1) 停止资源;

[grid@dm01db01 ~] export ORACLE_HOME=/u01/app/oracle/product/11.2.0.3/dbhome_1
[grid@dm01db01 ~]$ORACLE_HOME/bin/srvctl stop home -o $ORACLE_HOME -n dm01db01 -s /tmp/gi.stat

2) 切换到新的GI ORACLE_HOME;

[root@dm01db01 ~]export ORACLE_HOME=/u01/app/11.2.0.3/grid_2
[root@dm01db01 ~]/usr/bin/perl $ORACLE_HOME/OPatch/crs/patch112.pl -patch -desthome=$ORACLE_HOME

3) 启动所有的资源;

[root@dm01db01 ~]export ORACLE_HOME=/u01/app/oracle/product/11.2.0.3/dbhome_1
[root@dm01db01 ~]$ORACLE_HOME/bin/srvctl start home -o $ORACLE_HOME -n dm01db01 -s /tmp/gi.stat

4) 确认所有的资源都已经启动;

[grid@dm01db01 ~] export ORACLE_HOME=/u01/app/11.2.0.3/grid_2
[grid@dm01db01 ~] $ORACLE_HOME/bin/crsctl stat res -t

5. detach老的GI的ORACLE_HOME;

[grid@dm01db01 ~]export ORACLE_HOME=/u01/app/11.2.0.3/grid
[grid@dm01db01 ~]cd $ORACLE_HOME/oui/bin; ./detachHome.sh -silent -local -invPtrLoc /etc/oraInst.loc
4) 对RDBMS进行clone

1. 创建新的RDBMS的ORACLE_HOME, 将原始的ORACLE_HOME使用tar打包,并解压到新的ORACLE_HOME;

[oracle@dm01db01 ~]export ORACLE_HOME=/u01/app/oracle/product/11.2.0.3/dbhome_2
[oracle@dm01db01 ~]dcli -g ~/dbs_group -l oracle mkdir -p $ORACLE_HOME
dcli -g ~/dbs_group -l oracle "cd /u01/app/oracle/product/11.2.0.3/dbhome_1; \
tar cf - . | ( cd $ORACLE_HOME ; tar xf - )"

2. 运行clone.pl;

[oracle@dm01db01 ~]export ORACLE_HOME=/u01/app/oracle/product/11.2.0.3/dbhome_2
[oracle@dm01db01 ~]dcli -g ~/dbs_group -l oracle "cd $ORACLE_HOME/clone/bin; ./clone.pl ORACLE_HOME=$ORACLE_HOME \
ORACLE_HOME_NAME=OraDB_home2 ORACLE_BASE=/u01/app/oracle"
[oracle@dm01db01 ~]$ORACLE_HOME/oui/bin/runInstaller \
-updateNodeList ORACLE_HOME=$ORACLE_HOME "CLUSTER_NODES={dm01db01,dm01db02,db01db03,dm01db04}"

 

3. relink oracle二进制文件,使其可以使用RDS协议;

[oracle@dm01db01 ~]export ORACLE_HOME=/u01/app/oracle/product/11.2.0.3/dbhome_2
[oracle@dm01db01 ~]dcli -g ~/dbs_group -l oracle "cd $ORACLE_HOME/rdbms/lib; \
ORACLE_HOME=$ORACLE_HOME make -f ins_rdbms.mk ipc_rds ioracle"

4. 在新的ORACLE_HOME运行root.sh;

[root@dm01db01 ~] export ORACLE_HOME=/u01/app/oracle/product/11.2.0.3/dbhome_2
[root@dm01db01 ~]dcli -g ~/dbs_group -l root $ORACLE_HOME/root.sh

5. 完成以后补丁的验证;

[oracle@dm01db01 ~]export ORACLE_HOME=/u01/app/oracle/product/11.2.0.3/dbhome_2
[oracle@dm01db01 ~]dcli -g ~/dbs_group -l oracle "$ORACLE_HOME/OPatch/opatch lsinventory -oh $ORACLE_HOME"

 

5) 对RDBMS应用patch(略)
6) 切换到新的RDBMS ORACLE_HOME

1. 确认当前数据库运行在老的RDBMS ORACLE_HOME(当前运行dbm一个数据库);

 [grid@dm01db01 ~]$ORACLE_HOME/bin/srvctl config database -d dbm -a

2. 将当前数据库切换到新的RDBMS ORACLE_HOME;

[grid@dm01db01 ~]/u01/app/11.2.0.3/grid_2/bin/srvctl modify database -d dbm -o /u01/app/oracle/product/11.2.0.3/dbhome_2

3. 修改oratab到新的RDBMS ORACLE_HOME;

将/etc/oratab中的

dbm:/u01/app/oracle/product/11.2.0.3/dbhome_1:N

修改为:

dbm:/u01/app/oracle/product/11.2.0.3/dbhome_2:N

4. 如果使用了dbfs,则需要对dbfs脚本进行调整;

5. 确认切换已经生效;

[grid@dm01db01]ORACLE_HOME/bin/srvctl config database -d dbm -a
 6. 重启RDBMS;
[grid@dm01db01 ~]$ORACLE_HOME/bin/srvctl stop instance -d dbm -i dbm1
[grid@dm01db01 ~]$ORACLE_HOME/bin/srvctl start instance -d dbm -i dbm1

在其它节点完成同样的操作。

7. 运行post upgrade的SQL脚本;

SQL> @rdbms/admin/catbundle.sql exa apply

8. 验证当前数据库实例的状态;

[grid@dm01db01 ~]$ORACLE_HOME/bin/srvctl status database -d dbm

以上只有切换的过程需要停机,其余步骤都可以在线进行。

注意, 这种OUT-OF-PLACE并不是只能用于Exadata,对于通用的RDBMS也同样是适用的。OUT-OF-PLAC方式因其风险小,停机时间短,回退方案简单预计会在Oracle补丁应用的最佳实践中逐步得到推广。

Comment

*

沪ICP备14014813号-2

沪公网安备 31010802001379号