原文链接: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
[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